Java 在下面的示例中,为什么实例变量为null
有人能解释一下为什么实例变量“root”为空吗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);
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,我明白了。您正在阅读“如何回答”手册,查找我的答案,并指出您发现的任何错误。好吧,玩得开心。