没有getter方法,不能使用对象变量

Adi*_*tya 1 java oop inheritance

我有一个abstract类,AbstractNode和一个扩展它的具体类 - 节点.

我试图通过声明对象AbstractClass并使用新的Node()实例化它们来"编程到接口" .

当我在构造函数中初始化它们后尝试在Node中使用变量时,我得到一个Null指针.但是,如果我使用getter方法,一切正常.我错过了什么?

public abstract class AbstractNode
{    
    String str;
    public abstract String getStr();
}

public class Node extends AbstractNode
{
    String str;

    public Node()
    {
        str= new String();
    }

    public String getStr()
    {
        return str;
    }
}
Run Code Online (Sandbox Code Playgroud)

主要方法如下:

public static void main(String[] args)
{
    AbstractNode n= new Node();
    String nullStr= n.str;
    String regularStr= n.getStr();
}
Run Code Online (Sandbox Code Playgroud)

现在,nullStr包含一个null引用,并regularStr包含一个引用n.str.这里发生了什么?我可以直接访问不需要初始化的其他原始类型字段,比如int,没有任何getter方法.

chr*_*ke- 7

你正在"隐藏"变量str.AbstractNode有一个String名字str,然后Node有一个不同的String,也命名str.用于Node指定空字符串的构造函数Node.str,但AbstractNode.str仍然null是因为它从未被分配过.getStr()返回值,Node.str因为这是str它看到的"最近的"变量.您的代码main正在读取,AbstractNode.str因为编译器在编译时解析其全名,并且声明的变量类型nAbstractNode.删除重复String strNode.