我有一个抽象类,声明了许多对象引用,特别是JLabel。我有两个类都扩展了这个类。其中一个子实例化JLabel并调用它的几个方法。那些类兄弟试图在JLabel上调用setText方法,并且我得到一个NullPointerException(实例化它的兄弟会在另一个之前被调用。)
我原以为所有的孩子都在内存中引用同一个对象,因此会修改同一个对象,但显然我错了。我怎么能绕过这个?
这是我的意思的一个例子:
public class BlahDriver
{
public static void main(String[] args)
{
BlahChildOne blah = new BlahChildOne();
BlahChildTwo blah2 = new BlahChildTwo();
}
}
public abstract class Blah
{
protected JLabel label;
}
public class BlahChildOne extends Blah
{
public BlahChildOne()
{
label = new JLabel();
}
}
public class BlahChildTwo extends Blah
{
public BlahChildTwo()
{
label.setText("Fred");
}
}
尝试setText时,我在BlahChildTwo上遇到NullPointerException。
答案 0 :(得分:2)
因此,blah定义了一个名为label
但不初始化的实例字段
public abstract class Blah
{
protected JLabel label;
}
BlahChildOne
从label
Blah
public class BlahChildOne extends Blah
{
public BlahChildOne()
{
label = new JLabel();
}
}
BlahChildTwo
未对label
的{{1}}进行初始化,因此它仍为Blah
...
null
public class BlahChildTwo extends Blah
{
public BlahChildTwo()
{
label.setText("Fred");
}
}
或BlahChildOne
之间没有共享信息(它们通过BlahChildTwo
的继承具有共性,但实际信息是每个人拥有的。)
把它想象成同卵双胞胎,它们可能有共同之处,但只是因为一个人生病了,并不意味着另一个人的意志,他们就是他们自己的自我实例。
如果您想在课程之间共享信息,您应该考虑使用您要共享的信息提供对课程的引用,例如......
Blah
但我真的很想看到一个如此激烈的用例...
public class BlahChildTwo extends Blah
{
public BlahChildTwo(Blah blah)
{
label = blah.label;
label.setText("Fred");
}
}
被视为错误 让我们假设......
static
现在在您的代码中,您可以执行类似...
的操作public abstract class Blah
{
protected static JLabel label;
}
好的,到目前为止,这么好。现在想象一下,在代码的其他地方,你做...
BlahChildOne bco = new BlahChildOne();
add(bco.label); // It the label to the screen...
BlahChildTwo bct = new BlahChildTwo();
...但为什么屏幕没有更新?由于BlahChildOne bco = new BlahChildOne();
BlahChildTwo bct = new BlahChildTwo();
不再指向您之前添加到屏幕中的Blah#label
,因此您已丢失该引用。
即使您知道自己在寻找什么,调试器也很难找到,因为没有问责制,任何扩展JLabel
的类都可以创建Blah
的新实例并分配它到JLabel
。
答案 1 :(得分:0)
朋友,你必须是object oriented programming的新手。
类是对象的模板。实例化类(即new Child()
)时,会在堆上分配内存以存储该对象的实例变量。包含对象变量的内存仅用于该一个对象。每次创建对象时,它在单独的内存空间中都有自己的实例变量。
答案 2 :(得分:0)
这一行protected JLabel label;
没有创建Object,它只是引用变量,所以这两个类都扩展了Abstract类。两个类都有自己的参考变量
BlahChildTwo 拥有自己的JLabel引用变量副本,但未实例化,这就是您面临NullPointerException
现在回答你的问题
I had thought that all children refer to the same object in memory and would
thus modify the same object but apparently I'm wrong. How can I get
around this?
是的,如果对象 参考变量
,所有孩子都会引用相同的对象答案 3 :(得分:-1)
所有孩子不指的是同一个对象。每个子对象都将是一个新对象,它将拥有父对象中声明的所有引用的副本以及自身声明的所有引用的副本。
如果要在类之间访问相同的引用,请尝试在父类中创建static
。