为什么在下面的示例中,实例变量为null

时间:2016-05-26 11:43:00

标签: java

任何人都可以解释为什么实例变量'root'为空?

public class Test{
    String root;

    public void assignRoot(){
        baseAssignment(root);
    }

    public void baseAssignment(String root){
        if(root == null){
            System.out.println("root:"+root);
            root = "assigned!";
            return;
        }

    }

    public String toString(){
        return root;
    }

    public static void main(String args[]){
        Test t = new Test();
        t.assignRoot();
        System.out.println(t);
    }
}

我的输出是:

root:null
null

但我期待

root:null
assigned!

6 个答案:

答案 0 :(得分:4)

无需在类中传递方法调用的实例变量:

public class Test{
    String root;

    public void assignRoot(){
        baseAssignment();
    }

    public void baseAssignment(){
        if(root == null){
            System.out.println("root:"+root);
            root = "assigned!";
            return;
        }

    }

    public String toString(){
        return root;
    }

    public static void main(String args[]){
        Test t = new Test();
        t.assignRoot();
        System.out.println(t);
    }
}

输出:

$ javac Test.java 
$ java Test
root:null
assigned!

或者您可以使用this.root="assigned!"来引用实例变量而不是本地参数。

答案 1 :(得分:1)

您只是为方法中的本地参数root分配值,而不是类属性root。重命名参数或使用前面的this - 关键字,它应该有效。 可以找到一个很好的解释,为什么它的行为,here

答案 2 :(得分:1)

因为在baseAssignment()方法中您没有初始化字段root,所以只需更改本地参数root

而不是:

root = "assigned!";

你应该写:

this.root = "assigned!";

答案 3 :(得分:0)

    if(root == null){
        System.out.println("root:"+root);
        this.root = "assigned!";

您应该使用this.root,因为您只更改了作为名为root的参数给出的字符串的值。

答案 4 :(得分:0)

我的方法参数应始终为final。制作参数root final会导致编译错误

root = "assigned!";

您必须分配到this.root。将您的代码更改为:

public void baseAssignment(final String root){
    if(root == null){
        System.out.println("root:"+root);
        this.root = "assigned!";
        return;
    }

}

答案 5 :(得分:0)

使用任何一种方法..

public void baseAssignment(String root){
    if(root == null){
        System.out.println("root:"+root);
      // root = "assigned!";
         this.root = "assigned!";
        return;
    }

}

public void baseAssignment(String root1){
    if(root1 == null){
        System.out.println("root:"+root);
        root = "assigned!";
        return;
    }

}

如何解释

Class MyClass{
String root="";
 public void baseAssignment(String root){
  root = "local variable"; // pointing to method local variable root 
  System.out.println("root:"+root);
  this.root = "class variable"; // pointing to class variable root 
  System.out.println("root:"+this.root);   
  }
 }

输出:

root:local variable
root:class variable