Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java访问父变量返回null_Java_Inheritance - Fatal编程技术网

Java访问父变量返回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();

我试图从子类访问父类的变量,但它返回null

我显式调用父类的构造函数并在其中赋值,但在子类中得到空值

我想知道这是否可行,或者我们将不得不使用
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会仔细阅读上面托马斯的评论并牢记在心。