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方法.
你正在"隐藏"变量str.AbstractNode有一个String名字str,然后Node有一个不同的String,也命名str.用于Node指定空字符串的构造函数Node.str,但AbstractNode.str仍然null是因为它从未被分配过.getStr()返回值,Node.str因为这是str它看到的"最近的"变量.您的代码main正在读取,AbstractNode.str因为编译器在编译时解析其全名,并且声明的变量类型n为AbstractNode.删除重复String str在Node.
| 归档时间: |
|
| 查看次数: |
523 次 |
| 最近记录: |