java – 子类没有看到父变量

public class Program {

    public static void main(String[] args) {
        Listener listener = new Listener();
        listener.listen();
    }
}

public class Listener {

    ServerQuery query;
    int test = 1;

    public listen() {
        query = new ServerQuery();
        Channel ch = new Channel();
        ch.dupa();
    }
}

public class Channel extends Listener {

    public dupa() {
        System.out.print(test); // works fine 
        super.query.doSomething(); // null pointer
        query.doSomething(); //  null pointer
    }
}

我无法访问类“Channel”中的变量“query”.
谁能解释我为什么?

解决方法:

你误解了超类型和子类型的概念.

直接问题是您需要在使用之前实例化查询变量.

在调用dupa之前调用ch.listen()或在dupa中调用它.

这里的主要问题是理解子类型 – 超类型关系.

您的Channel对象没有对Listener实例的引用,它只是它的子类型.
因此,如果您需要访问超类型的字段,例如访问类的字段 – 您必须在使用它之前对其进行实例化.

在Listener中创建Channel对象没有逻辑. Channel是一个Listener,因此您可以创建它.

我建议你阅读更多关于here或其他任何地方的信息.

对于您的代码,您可以使用:

public class Program {

    public static void main(String[] args) {
        Channel ch = new Channel();
        ch.listen(); // will instantiate ch.query
        ch.dupa(); 
    }
}
public class Listener {

    ServerQuery query;
    int test = 1;

    public listen() {
        query = new ServerQuery();
    }
}

public class Channel extends Listener {

    public dupa() {
        System.out.print(test);
        super.query.doSomething();
        query.doSomething();
    }
}
上一篇:Js随笔


下一篇:js继承的实现(原型/链、函数伪装)