1

嗨,我有一个包含一个字符串成员的基类,如下所示:

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

4 回答 4

1

new ChildClass()并且new TestClass()是 2 个不同的对象,即使它们扩展为 common BaseClass

拥有一个共同BaseClass超类 并不意味着它与它的不同子类的所有实例共享它的非静态字段

如果teststatic共享类字段)在BaseClass

于 2013-09-09T13:19:15.270 回答
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();
    }
}
于 2013-09-09T13:18:39.013 回答
1

BaseClass您发布的示例中有两个实例。一种是用实例化的new ChildClass(),另一种是用main()方法实例化的(TestClass)。作为 的子类,它们中的每一个BaseClass都有自己的test成员(它们是具有不同值的不同变量)。

请记住,this关键字总是引用使用它的实例。

在这种情况下,System.out.println(this.test);正在访问在方法中创建的实例的test属性。TestClassmain

您需要访问test另一个实例的属性。您可以通过保留对ChildClass实例的引用并test随后访问属性来做到这一点:

    ChildClass instance = new ChildClass().initialize();
    System.out.println(instance.test);

您可能会发现以下 Java 教程页面很有用:使用 this 关键字

还要考虑到TestClass根本不需要扩展BaseClass. 您可以继续访问instance.test,因为它是public成员,但您应该考虑创建字段private并提供 getter 和 setter 方法。有关这方面的相关信息,请参阅以下问题:为什么使用 getter 和 setter?

于 2013-09-09T13:17:13.590 回答
0

你需要一个实例Child Class

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


this is referring to the Test Class instance.
于 2013-09-09T13:21:01.150 回答