首页 > 解决方案 > 抽象类如何访问子类的方法?

问题描述

abstract class zagazuga{

    zagazuga(){

        System.out.println("yaratıldı");

        dosomething();
    }
    abstract void dosomething();

    public void lale(){

        System.out.println("what");
    }
}
public class lagaluga extends zagazuga {

    lagaluga(){

        dosomething();
    }
    @Override
    void dosomething() {

        System.out.println("nebu");
    }

    @Override
    public void lale() {

        super.lale();
    }

    public static void main(String[] args) {
        lagaluga asd = new lagaluga();

        asd.lale();

    }
}

我知道对象不是从抽象类创建的,但是当抽象类给出构造函数时,当我从子类创建对象时,首先调用抽象类的构造函数。其实抽象类的对象是创建出来的,让我想到这个的就是我在子类中重写的methodmethod的body中的super.lale();我无法弄清楚 super 是否指的是上层阶级的对象。如果课程是普通课程,我有一个答案,但奇怪的是这发生在抽象中。有人可以解释它是如何发生的

图片来自我的电脑

标签: java

解决方案


没有超类的(附加)实例。

子类的实例包括超类的成员(字段和方法)——它是超类的扩展。

示例:FordCar;的子类 每个Car都有一个马达,所以Ford也有一个

提示:无需申报

public void lale() {
  super.lale();
}

如果未声明(覆盖),则将调用超类中的方法


使用发布的代码,new lagaluga()将创建一个实例,如:

lagaluga asd = +---------------------+
               | (class Object)      |  // read as members of Object
               |   <init>            |
               |   boolean equals    |
               |   int hashCode      |
               |   String toString   |
               |   ...               |
               | - - - - - - - - - - |
               | (class zagazuga)    |
               |   <init>            |
               |   void lale         |
               | - - - - - - - - - - |
               | (class lagaluga)    |
               |   <init>            |    
               |   void dosomething  |
               |   void lale         |
               +---------------------+

Object包含在所有实例中,任何类的顶级父级)
<init>对应于构造函数)
该实例具有其类、其父级、其祖父级(如果有)的所有成员(字段、方法),...,对象。IS 的实例lagaluga也是zagazuga(带有附加方法)的实例。

构造函数作为实例创建的一部分被调用(在分配内存之后)。每个构造函数调用其父构造函数直到构造函数Object(没有父构造)。详细信息:JLS 12.5。创建新的类实例

上面的图片对于字段来说会更好,对于方法来说不是很精确 - 方法不会在每个实例中复制,它们只是类定义的一部分。


推荐阅读