这个怎么回事?

时间:2022-09-20 10:26:16
import java.util.*;
class Name{
private String name;
public String getName(){
return name;
}
}
public class SetName {
public static void main(String[] args) {
// TODO Auto-generated method stub
Name nm = new Name();
Scanner input = new Scanner(System.in);
String inputName = input.nextLine();
nm.getName() = inputName; // 为什么这里不行啊,除了setName(),怎样在这里修改名字
System.out.print(nm.getName());
}
}

12 个解决方案

#1


getName返回一个字符串值,又不是返回name的引用,你把值赋给这个变量不会改变到nm.name;

要么用set方法,要么把name定义为public,要么通过构造方法传递

#2


反射,虽然不推荐(既然定义为private的,就是不想破坏封装性,反射可以绕过这个private的限定,而且影响性能)。

#3


不行因为语法就是错误的  解决办法 可以参照上面说的 都可以的!

#4


主要是没搞清楚各种变量的属性。解决方法同楼上。

#5


引用 2 楼 oh_Maxy 的回复:
反射,虽然不推荐(既然定义为private的,就是不想破坏封装性,反射可以绕过这个private的限定,而且影响性能)。

请问什么是反射?能简单说一下吗?

#6


引用 5 楼 u010160644 的回复:
Quote: 引用 2 楼 oh_Maxy 的回复:

反射,虽然不推荐(既然定义为private的,就是不想破坏封装性,反射可以绕过这个private的限定,而且影响性能)。

请问什么是反射?能简单说一下吗?

普通的使用,是从正面的:我们可以直接用public的方法,可以操作public的属性,private的东西无法按照自己当下的意愿任意操作的。
通过反射,可以将一个类拆成零零散散的各个“部件”,有Field,有Method,有Constructor。然后我们可以针对一个特定的对象,其属性也许是private的(此时它是不可访问的),我们可以通过得到对应的Field,通过setAccessible将其设置为可访问的,这样就可以操作了(也破坏了该对象的封装性)。
查看下API和相关反射的介绍博文,可能帮助更多~

#7


方法调用不能作为左值。

既然注定要修改,提供一个setName方法。

#8


引用 6 楼 oh_Maxy 的回复:
Quote: 引用 5 楼 u010160644 的回复:

Quote: 引用 2 楼 oh_Maxy 的回复:

反射,虽然不推荐(既然定义为private的,就是不想破坏封装性,反射可以绕过这个private的限定,而且影响性能)。

请问什么是反射?能简单说一下吗?

普通的使用,是从正面的:我们可以直接用public的方法,可以操作public的属性,private的东西无法按照自己当下的意愿任意操作的。
通过反射,可以将一个类拆成零零散散的各个“部件”,有Field,有Method,有Constructor。然后我们可以针对一个特定的对象,其属性也许是private的(此时它是不可访问的),我们可以通过得到对应的Field,通过setAccessible将其设置为可访问的,这样就可以操作了(也破坏了该对象的封装性)。
查看下API和相关反射的介绍博文,可能帮助更多~

谢谢了 好像明白点了

#9


给你提供几个解决问题的思路:
1. 上面说的反射
2. 通过创建Name类的子类,重写name属性相关的操作(但是这个你需要保证其内部其他方法的实现不会受到影响)

#10


反射,就是访问私有的效率低,既然私有了,就尽量别用反射去强行获取

#11


l为啥不想用setter方法呢?

#12


引用 7 楼 huntor 的回复:
方法调用不能作为左值。

既然注定要修改,提供一个setName方法。


引用 2 楼 oh_Maxy 的回复:
反射,虽然不推荐(既然定义为private的,就是不想破坏封装性,反射可以绕过这个private的限定,而且影响性能)。


引用 9 楼 chenxilzx 的回复:
给你提供几个解决问题的思路:
1. 上面说的反射
2. 通过创建Name类的子类,重写name属性相关的操作(但是这个你需要保证其内部其他方法的实现不会受到影响)


引用 11 楼 a1566407 的回复:
l为啥不想用setter方法呢?

小弟已经写好了这个程序,老师最后接受了,比先前那个好很多....再次拜谢你们....

#1


getName返回一个字符串值,又不是返回name的引用,你把值赋给这个变量不会改变到nm.name;

要么用set方法,要么把name定义为public,要么通过构造方法传递

#2


反射,虽然不推荐(既然定义为private的,就是不想破坏封装性,反射可以绕过这个private的限定,而且影响性能)。

#3


不行因为语法就是错误的  解决办法 可以参照上面说的 都可以的!

#4


主要是没搞清楚各种变量的属性。解决方法同楼上。

#5


引用 2 楼 oh_Maxy 的回复:
反射,虽然不推荐(既然定义为private的,就是不想破坏封装性,反射可以绕过这个private的限定,而且影响性能)。

请问什么是反射?能简单说一下吗?

#6


引用 5 楼 u010160644 的回复:
Quote: 引用 2 楼 oh_Maxy 的回复:

反射,虽然不推荐(既然定义为private的,就是不想破坏封装性,反射可以绕过这个private的限定,而且影响性能)。

请问什么是反射?能简单说一下吗?

普通的使用,是从正面的:我们可以直接用public的方法,可以操作public的属性,private的东西无法按照自己当下的意愿任意操作的。
通过反射,可以将一个类拆成零零散散的各个“部件”,有Field,有Method,有Constructor。然后我们可以针对一个特定的对象,其属性也许是private的(此时它是不可访问的),我们可以通过得到对应的Field,通过setAccessible将其设置为可访问的,这样就可以操作了(也破坏了该对象的封装性)。
查看下API和相关反射的介绍博文,可能帮助更多~

#7


方法调用不能作为左值。

既然注定要修改,提供一个setName方法。

#8


引用 6 楼 oh_Maxy 的回复:
Quote: 引用 5 楼 u010160644 的回复:

Quote: 引用 2 楼 oh_Maxy 的回复:

反射,虽然不推荐(既然定义为private的,就是不想破坏封装性,反射可以绕过这个private的限定,而且影响性能)。

请问什么是反射?能简单说一下吗?

普通的使用,是从正面的:我们可以直接用public的方法,可以操作public的属性,private的东西无法按照自己当下的意愿任意操作的。
通过反射,可以将一个类拆成零零散散的各个“部件”,有Field,有Method,有Constructor。然后我们可以针对一个特定的对象,其属性也许是private的(此时它是不可访问的),我们可以通过得到对应的Field,通过setAccessible将其设置为可访问的,这样就可以操作了(也破坏了该对象的封装性)。
查看下API和相关反射的介绍博文,可能帮助更多~

谢谢了 好像明白点了

#9


给你提供几个解决问题的思路:
1. 上面说的反射
2. 通过创建Name类的子类,重写name属性相关的操作(但是这个你需要保证其内部其他方法的实现不会受到影响)

#10


反射,就是访问私有的效率低,既然私有了,就尽量别用反射去强行获取

#11


l为啥不想用setter方法呢?

#12


引用 7 楼 huntor 的回复:
方法调用不能作为左值。

既然注定要修改,提供一个setName方法。


引用 2 楼 oh_Maxy 的回复:
反射,虽然不推荐(既然定义为private的,就是不想破坏封装性,反射可以绕过这个private的限定,而且影响性能)。


引用 9 楼 chenxilzx 的回复:
给你提供几个解决问题的思路:
1. 上面说的反射
2. 通过创建Name类的子类,重写name属性相关的操作(但是这个你需要保证其内部其他方法的实现不会受到影响)


引用 11 楼 a1566407 的回复:
l为啥不想用setter方法呢?

小弟已经写好了这个程序,老师最后接受了,比先前那个好很多....再次拜谢你们....