初始化子类内部基类的成员变量,并在其他类中使用

时间:2013-09-09 13:15:52

标签: java class inheritance

我有一个包含一个字符串成员的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概念的哪个地方出错了吗?

4 个答案:

答案 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实例:

enter image description here

您正在创建并设置ChildClass班级

enter image description here

但是您正在打印TestClass test成员

enter image description here

如果您只想创建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中的staticBaseClass(共享类字段)

,这会有效

答案 3 :(得分:0)

您需要Child Class

的实例
ChildClass cls =new ChildClass().initialize();
System.out.println(cls.test);


this is referring to the Test Class instance.