当前位置: 首页 > 知识库问答 >
问题:

从超类构造函数调用子类方法

诸葛柏
2023-03-14
public class A { 
    String bar = "A.bar";

    A() { foo(); }

   public void foo() {
    System.out.println("A.foo(): bar = " + bar);
   }
 }

public class B extends A {
    String bar = "B.bar";

    B(){ foo(); }

    public void foo(){
        System.out.println("B.foo(): bar = " + bar);
    }
}

public class C {
    public static void main(String[] args){
        A a = new B();
        System.out.println("a.bar = " + a.bar);
        a.foo();
    }
}

为什么第一个输出有柱线 = 空?是因为在创建类 B 之前调用了 B.foo() 吗?如果是,那么为什么可以调用 B.foo()?还是因为 B.foo() 中的字段栏试图从 A 获取柱线字段但无法访问它?

我的问题与链接的问题不同,我不是在问调用顺序,我是在问为什么第一个输出为空?另一个问题不是关于字段或空变量。

我不明白B.foo中的bar变量是如何为空的,如果它是在A和B中定义的。

共有2个答案

相高谊
2023-03-14

第一次打印的原因是B.foo(): bar=null是因为当您调用A a=new B();这一行时,您创建了一个B类型的对象,它调用了B类型对象的构造函数。但是,该构造函数对A的构造函数有一个“隐藏”的超级调用。问题是类B还没有创建(您现在正在首先创建类A),因此它们的参数(例如bar)没有初始化,这意味着它们被分配了null值。您仍然会得到B.foo():,因为对动态函数的调用是通过动态调度进行的,因此调用了B的函数foo。只有在调用A的构造函数后,才能调用B的构造函数,然后初始化B的变量-包括bar

施德元
2023-03-14

首先,我会告诉你A类中的变量栏与B类中的另一个变量栏完全不同。

您可能希望它们是这样的一个变量:

public class B extends A{

public B (){
        bar = "B.bar";´
    foo();
}
void foo(){
    System.out.println("B.foo bar ="+ bar);
}

}

你会得到结果:

B.foo bar =A.bar
B.foo bar =B.bar
a.bar=B.bar
B.foo bar =B.bar

如果没有,请告诉我,我也会为您描述您的特殊情况(为什么bar=null)

 类似资料:
  • 问题内容: 考虑以下代码 在我看来,目前有两种方法可以避免这种问题。 要么上A班最后一班。 要么 使getVar方法最终化 作者试图提出防止上述问题的方法。但是,该解决方案似乎很麻烦,因为要遵循一些规则。 http://benpryor.com/blog/2008/01/02/dont-call-subclass-methods-from-a- superclass-constructor/ 除了

  • 问题内容: 我正在尝试创建一个将字段作为参数的构造函数,然后将其放入存储在超类中的字段中。这是我正在使用的代码 在超类中,我用 我有一个访问器方法 我收到一个错误“ 味道在超类中具有私有访问权 ”,但是我认为这无关紧要,因为我正在调用将其返回到字段的访问器方法? 问题答案: 您应该做什么: 在您的超类中添加一个构造函数: 在Crisps类中: 注释 对您的问题的一些评论: “在超类中,我已经用”

  • 我在班里学习。出于好奇,我扩展了具有参数化构造函数的内部类。但是当我编写super(inti)来调用它时,代码不会编译。 因为内部类是外部类的一部分(成员),必须通过外部类访问它们。如何调用测试类的超级构造函数。 编译错误是:由于某些中间构造函数调用,没有外部类型的封闭实例可用

  • 您可以看到,我正在将“that”作为参数传递给PrintInfo。如果没有“that”参数,“info”将打印为“undefined”。像下面的例子一样,当从“子类”的对象调用此函数时,“this.info”是未定义的。 如何在javascript中重写和调用超类的方法,使函数能够访问类的实例变量?

  • 可能的重复: 为什么this()和super()必须是构造函数中的第一条语句? 为什么子类构造函数必须显式调用超类构造函数?这是什么原因呢?

  • 我正在学习java入门课程,我们刚刚开始学习继承。我正在做一项任务,要求我们创建一个具有名称和年龄的“Pet”超类;和三个子类,每个都有自己独特的特征(我选择了“狗”、“猫”和“鸟”)。在我们构建了所有这些之后,我们将创建一个主类来测试一切,这就是我遇到问题的地方。我试图为这些独特的特性调用