Java访问父变量返回null
我试图从子类访问父类的变量,但它返回null 我显式调用父类的构造函数并在其中赋值,但在子类中得到空值 我想知道这是否可行,或者我们将不得不使用Java访问父变量返回null,java,inheritance,Java,Inheritance,我试图从子类访问父类的变量,但它返回null 我显式调用父类的构造函数并在其中赋值,但在子类中得到空值 我想知道这是否可行,或者我们将不得不使用Getter/Setter 公共类父类{ 公共静态字符串名; 公共家长(){ System.out.println(“调用父构造函数”); this.name=“Adam”; } } 公共类子级扩展父级{ 静态最终字符串parentName=Parent.name; 公共静态void main(字符串[]args){ Child c=新的Child();
Getter/Setter
公共类父类{
公共静态字符串名;
公共家长(){
System.out.println(“调用父构造函数”);
this.name=“Adam”;
}
}
公共类子级扩展父级{
静态最终字符串parentName=Parent.name;
公共静态void main(字符串[]args){
Child c=新的Child();
System.out.println(parentName);
}
}
输出:
Parent constructor is called
null
在您的情况下,若要访问父变量名,请从子类中删除final关键字,并在创建子类实例后将parent.name分配给parentName变量。该值变为null,因为您试图在创建对象之前分配父变量的值
public class Parent {
public static String name;
public Parent() {
System.out.println("Parent constructor is called");
this.name = "Adam";
}
}
public class Child extends Parent{
static String parentName;
public static void main(String[] args) {
Child c = new Child();
parentName = Parent.name;
System.out.println(parentName);
}
}
您应该仔细阅读修饰符和初始化顺序。在您的情况下,
parentName
将在加载子类(即类定义)时初始化,此时Parent.name
也将为空。创建实例时,在构造函数中设置该静态字段会在稍后发生,但这样做无论如何都是错误的,因为name
不是实例字段,而是类级字段。删除开始时的static
关键字,并将赋值更改为parentName=name
。然后,您需要从您创建的子实例(即c.parentName
)中获取parentName
。您完全正确:“值变为null,因为您试图在创建对象之前分配父变量的值。”感谢您编辑您的初始响应+在你的改变之后:)这里实际上有几个不同的——同样重要的——问题,希望OP会仔细阅读上面托马斯的评论并牢记在心。