我有一个包含一个字符串成员的Base类,如下所示:
public class BaseClass
{
public String test;
}
子类扩展基类,我希望初始化测试值。
public class ChildClass extends BaseClass
{
public void initialize()
{
System.out.println("inside constructor of ChildClass.");
this.test="stringtest";
}
}
我希望使用基类测试变量值的测试类:
public class TestClass extends BaseClass
{
public void test()
{
new ChildClass().initialize();
System.out.println(this.test);
}
public static void main(String[] args) {
new TestClass().test();
}
}
现在我的上面代码在测试类中打印null。为什么这样?虽然我已经在子类中初始化了测试变量?我在java概念的哪个地方出错了吗?
答案 0 :(得分:1)
您发布的示例中有BaseClass
的两个实例。一个是用new ChildClass()
实例化的,另一个是main()
方法(TestClass
)实例化的。作为BaseClass
的子类,它们中的每一个都有自己的test
成员(它们是具有不同值的不同变量)。
请记住,this
关键字始终引用使用它的实例。
在这种情况下,System.out.println(this.test);
正在访问test
方法中创建的TestClass
实例的main
属性。
您需要访问其他实例的test
属性。您可以通过保留对ChildClass
实例的引用并随后访问test
属性来实现此目的:
ChildClass instance = new ChildClass().initialize();
System.out.println(instance.test);
您可能会发现以下“Java教程”页面非常有用:Using the this Keyword。
还要考虑到TestClass
根本不需要扩展BaseClass
。您可以继续访问instance.test
,因为它是public
成员,但您应该考虑创建字段private
并提供getter和setter方法。有关此问题的相关信息,请参阅以下问题:Why use getters and setters?
答案 1 :(得分:1)
ChildClass
,但是你没有在变量中设置它。然后你打印从未设置的this.test
。
当您使用test
方法时,您处于TestClass
实例:
您正在创建并设置ChildClass
班级
但是您正在打印TestClass
test
成员
如果您只想创建ChildClass
并使用它,请执行
public class TestClass
{
public void test()
{
ChildClass cls =new ChildClass().initialize();
System.out.println(cls.test);
}
public static void main(String[] args) {
new TestClass().test();
}
}
或者如果您想扩展ChildClass
做
public class TestClass extends BaseClass
{
public void test()
{
initialize();
System.out.println(this.test);
}
public static void main(String[] args) {
new TestClass().test();
}
}
答案 2 :(得分:1)
new ChildClass()
和new TestClass()
是2个不同的对象,即使它们正在扩展常见BaseClass
。
将BaseClass
作为超类 并不意味着 分享非静态字段,其不同子类的所有实例
如果test
中的static
为BaseClass
(共享类字段)
答案 3 :(得分:0)
您需要Child Class
ChildClass cls =new ChildClass().initialize();
System.out.println(cls.test);
this is referring to the Test Class instance.