2016-05-26 20 views
0

任何人都可以请解释为什么实例变量'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! 
+0

尝试从根目录重命名参数名称。神奇地看到它的工作;) –

+0

我不认为这是一个传递引用与传递值的问题。这是一个范围问题。 –

+0

@ cricket_007我们的目标不是为了让事情顺利进行,而是为了解决技术上的问题,为什么某些事情可行或不行。 – cyroxis

回答

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

你应该使用this.root因为你只改变给定的参数命名为root字符串的值太。

1

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

+0

“全局变量”不属于java世界;我想你是说班级属性? – Preuk

+0

@Preuk是的,谢谢。我真的不是Java人,但我用C#编程,因此我使用了这个名字。我编辑它。 –

0

这是我的方法参数应始终为final。使得参数rootfinal会造成

root = "assigned!"; 

您必须分配给this.root编译错误。你的代码更改为:

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

} 
+0

@Jack在我发布我的答案后的一个多小时内,问题就以重复的方式结束。请不要试图变得聪明。 –

+0

在回答这个问题之前,你还没有尝试搜索这个问题,这不是一个好的做法,如果你没有发现任何比你必须回答的问题,首先尝试搜索相关的问题,顺便说一句,我不像你这样聪明。 –

+0

@Jack我明白了。您正在阅读“如何回答”手册,查看我的答案,并指出您找到的任何错误。好吧,玩得开心。 –

1

因为在baseAssignment()方法,你没有初始化场root,你只需要改变局部参数root

相反的:

root = "assigned!"; 

你应该写:

this.root = "assigned!"; 
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!"来引用实例变量而不是本地参数。

+0

感谢您的解释! – Pradeep

+0

@Pradeep欢迎..请点击答案左侧的刻度线,并解决问题:) – ritesht93

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 
+0

这将有助于解释为什么而不是只发布代码,以便作者可以学习。 – cyroxis

+0

当我们在这种情况下考虑任何具有相同名称的变量root时,内部方法/块总是对本地变量执行的所有操作,指向外部变量需要明确提及“this”,因为那将是一个类变量。请在我的回答的第三部分查看注释行:) –

相关问题