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();
}
}