如何在子类Java中的超类方法中访问用某个值初始化的实例变量

时间:2017-04-02 16:02:55

标签: java inheritance constructor

基类

public class Base 
{
    public X obj;
    public void setValue()
    {
        obj = new A();
    }

}

Util类

public class Util extends Base
{
    public X obj;

    public Util(X obj)
    {
        this.obj = obj;
    }

    public void function1()
    {
        obj.m1();  //obj is null
    }

    public void function2()
    {
        obj.m2();  //obj is null
    }

}

测试类

class Test extends Base
{
    // obj inherited from superclass is null.
    Util utilObj = new Util(obj)

    public void testMethod()
    {
         utilObj.function1();
         utilObj.function2();

    }

}

我如何在util类的构造函数中传递初始化值,同时在Test类中创建它的对象,这样我就可以使用util class的方法。它给出了Null指针异常。我不希望在每个setValue()中公开Test class方法的调用,而不能将其声明为静态。即public static X obj; 中的Base class

有没有办法直接在其子类中的任何超类方法中初始化的非静态变量的初始化值,如静态变量。请帮助解决这个问题。

2 个答案:

答案 0 :(得分:0)

尝试使用super(); 你应该能够找到更多的信息 http://docs.oracle.com/javase/tutorial/java/IandI/super.html

答案 1 :(得分:0)

public X obj;课程中删除Util行。该行在Util中创建了一个不同的变量,该变量隐藏了Base中的一个,因为它具有相同的名称。如果您从obj移除Util变量,则使用obj方法编写Util将获取Base变量。

不要让Util构造函数直接初始化obj,而是给Base一个构造函数是个好主意:

public Base(X obj)
{
    this.obj = obj;
}

然后更改Util构造函数来调用它:

public Util(X obj)
{
    super(obj);  // Calls Base constructor
}