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());
}
}

解决方案 »

  1.   

    getName返回一个字符串值,又不是返回name的引用,你把值赋给这个变量不会改变到nm.name;要么用set方法,要么把name定义为public,要么通过构造方法传递
      

  2.   

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

  3.   

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

  4.   

    方法调用不能作为左值。既然注定要修改,提供一个setName方法。
      

  5.   

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

  6.   

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