Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在下面的示例中,为什么实例变量为null_Java - Fatal编程技术网

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

Java 在下面的示例中,为什么实例变量为null,java,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”为空吗

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!
您应该使用
this.root
,因为您也只更改作为名为
root
的参数给出的字符串的值


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

您只是在方法中为本地参数
root
赋值,而不是class属性
root
。重命名该参数或在其前面使用
this
-关键字,它应该可以工作。
可以找到一个很好的解释,解释它为什么会这样做。

您只是在方法中为本地参数
root
赋值,而不是class属性
root
。重命名该参数或在其前面使用
this
-关键字,它应该可以工作。
可以找到一个很好的解释,它为什么会这样做。

这就是我的方法参数应该始终是
final
。使参数
为root
为final
将导致上的编译错误

root = "assigned!";
您必须将
分配给此.root
。将代码更改为:

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

}

这就是我的方法参数应该始终是
final
。使参数
为root
为final
将导致上的编译错误

root = "assigned!";
您必须将
分配给此.root
。将代码更改为:

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

}

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

而不是:

root = "assigned!";
你应该写:

this.root = "assigned!";

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

而不是:

root = "assigned!";
你应该写:

this.root = "assigned!";

不需要为类内的方法调用传递实例变量:

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!”
引用实例变量而不是本地参数。

无需为类内的方法调用传递实例变量:

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!”
引用实例变量而不是本地参数。

使用任何一种方法

public void baseAssignment(String root){
    if(root == null){
        System.out.println("root:"+root);
      // root = "assigned!";
         this.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

使用一种方法中的任何一种

public void baseAssignment(String root){
    if(root == null){
        System.out.println("root:"+root);
      // root = "assigned!";
         this.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


尝试从根目录重命名参数名称。神奇地看到它工作;)我不认为这是一个通过引用和通过值传递的问题。这是一个范围问题。@cricket_007的目标不仅仅是让事情正常运行,还包括技术为什么某些东西会正常运行。@LutzHorn解决范围问题只是解决这个问题的一种方法,但它会导致难看的代码。这里需要理解为什么当前方法不起作用(这不是因为作用域)。请尝试从根重命名参数名称。神奇地看到它工作;)我不认为这是一个通过引用和通过值传递的问题。这是一个范围问题。@cricket_007的目标不仅仅是让事情正常运行,还包括技术为什么某些东西会正常运行。@LutzHorn解决范围问题只是解决这个问题的一种方法,但它会导致难看的代码。理解为什么当前的方法不起作用(并不是因为作用域)是这里需要的;我猜你指的是阶级属性?@Preuk是的,谢谢。我真的不是Java高手,但我是用C#编程的,所以我用了这个名字。我编辑了它,“全局变量”不属于java世界;我猜你指的是阶级属性?@Preuk是的,谢谢。我真的不是Java高手,但我是用C#编程的,所以我用了这个名字。我编辑了它。这将有助于解释为什么不只是发布代码,以便作者可以学习。当我们考虑任何具有相同名称的变量时(在本例中为root),在方法/块中始终对局部变量执行所有操作,指向外部变量时,需要用“this”明确提及因为这是一个类变量。请检查我答案第三部分的注释行:)这将有助于解释为什么不只是发布代码,以便作者可以学习。当我们考虑任何具有相同名称的变量(在本例中为root时,在方法/块中始终对局部变量执行所有操作,为了说明这一点,外部变量需要显式地用“this”表示,因为这是一个类变量。请查看我答案第三栏的评论行:)谢谢解释@欢迎。。请点击答案左侧的勾号,解决问题:)谢谢解释@欢迎。。请点击答案左侧的勾号并解决问题:)@Jack在我发布答案一个多小时后,该问题已作为副本关闭。请不要试图变得聪明。在回答这个问题之前,你没有尝试搜索这个问题。这不是一个好的做法。如果你没有找到任何相关的问题,那么首先尝试搜索相关的问题,然后再给出答案。顺便说一句,我不像你那么聪明。@Jack,我明白了。您正在阅读“如何回答”手册,查找我的答案,并指出您发现的任何错误。“好吧,祝你玩得开心!”杰克在我公布答案一个多小时后,这个问题就以重复的形式结束了。请不要试图变得聪明。在回答这个问题之前,你没有尝试搜索这个问题。这不是一个好的做法。如果你没有找到任何相关的问题,那么首先尝试搜索相关的问题,然后再给出答案。顺便说一句,我不像你那么聪明。@Jack,我明白了。您正在阅读“如何回答”手册,查找我的答案,并指出您发现的任何错误。好吧,玩得开心。