Java:从超类构造函数中的子类调用的方法

保罗
class AA{
    int x;
    protected AA(){init (1008);}
    protected void init(int x)
    {
        this.x = x;
    }
}

class BB extends  AA{
    public BB() {
        init(super.x * 2);
    }
    public void init(int x)
    {
        super.x = x+1;
    }
}
public class Main  {

    public static void main(String[] args) {
        BB tst = new BB();
        System.out.println(tst.x);
    }
}

我知道这段代码将在2019年打印。但是我不明白为什么超类构造函数在被调用时会使用de子类中的init方法而不是超类中的init方法。

TJ人群

但是我不明白为什么超类构造函数在被调用时会使用de子类中的init方法而不是超类中的init方法。

因为那是与正在构造的对象相关联的对象。this在超类构造函数中,是对正在构造的子类对象的引用,因此,就像init使用该引用的任何其他调用一样,它使用子类的init

请注意最后带有注释的行,这可能会有所帮助-注释说明这些行的输出:

class AA{
    int x;
    protected AA() {
        System.out.println(this.getClass().getName()); // "BB"
        System.out.println(this instanceof BB);        // true
        init(1008);
    }
    protected void init(int x)
    {
        this.x = x;
    }
}
class BB extends  AA{
    public BB() {
        init(super.x * 2);
    }
    public void init(int x)
    {
        super.x = x+1;
    }
}
public class Main  {

    public static void main(String[] args) {
        BB tst = new BB();
        System.out.println(tst.x);
    }
}

这是因为子类可以覆盖方法,通常最好避免从构造函数中调用finalprivate方法或非方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从子类调用超类函数的正确方法

从Java中的子类构造函数调用超类

从超类调用子类方法

声明子类的对象时,为什么调用超类的构造函数?(Java)

java子类:从抽象超类继承的多个构造函数

在调用超类的构造函数之前,有什么方法可以在Java中初始化子类的成员变量?

在Java中从父类调用子类构造函数

调用超类构造函数

如何确保某些方法从子类(Java)中的方法从抽象超类中调用

超类引用无法在Java中调用子类方法

超类构造函数调用应在构造函数主体中

从超类构造函数调用基类重写方法

有没有办法知道超类构造函数中调用对象的子类?C ++

Java继承:在超类中调用子类方法

无论如何,JAVA中是否有在超类的构造函数之前执行子类的构造函数的方法?

从超类的构造函数中调用子类的构造函数

在父类和子类的构造函数中调用重写的方法

在父类构造函数调用的方法中访问子类字段

Dart-如何在子类的构造函数中调用超类的工厂构造函数?

具有Java中构造函数默认值的超类覆盖子类

如果将子类中的超类构造函数作为第一行调用,这有关系吗?

超类子类构造函数java

您如何在Java中从超类调用子类方法?

为什么我们不能使用Java子类方法中的super关键字来调用超类构造函数?

Java超类变量和子类复制构造函数问题

部分模拟子类的方法使其绕过超类构造函数

子类调用超类构造函数

从超类调用子类中的相似命名函数

从 Java 中超类类型的 ArrayList 调用子类方法