首页 文章

理解方法继承

提问于
浏览
0

以下是JLS定义方法继承的方式:

C类继承自其直接超类和直接超接口所有抽象和默认(§9.4)方法m,其中所有以下都是真的:m是直接超类的成员或直接超接口D,C . m使用与C相同的包中的包访问是公共的,受保护的或声明的 . 在C中声明的方法没有签名,该签名是m的签名的子签名(第8.4.2节) . C从其直接超类继承的具体方法没有签名,该签名是m的签名的子签名 . 没有方法m'是直接超类的成员或直接超接口D'的C(m不同于m',D不同于D'),因此来自D'的m'优先于方法

第四颗子弹对我来说并不清楚 . 甚至不可能在同一个类中声明抽象和非抽象方法 . 难道你不能解释这条规则到底是什么意思吗?

2 回答

  • 2

    C可以从其直接超类和它实现的接口继承方法(在Java 8中,它甚至可以从接口继承默认实现) .

    假设 C 扩展 B 并实现 I .

    B包含一种方法:

    public void m (String s)
    

    我包含一个方法(可能有默认实现):

    public void m (String s)
    

    第4个子弹意味着由于 Bm 方法的存在, C 将不会继承 Im 方法 . C 只会继承 Bm 方法 .

    如果你看similar section in the JLS for Java 7

    8.4.8 . 继承,重写和隐藏类C继承自其直接超类,并直接超级接口超类和超级接口的所有抽象和非抽象方法,这些方法在与C相同的包中以默认访问方式公开,保护或声明,并且都不是通过类中的声明覆盖(第8.4.8.1节)或隐藏(第8.4.8.2节) . 在逐个签名的基础上覆盖或隐藏方法 . 例如,如果一个类声明了两个具有相同名称的公共方法(第8.4.9节),并且子类重写了其中一个,则子类仍然继承另一个方法 . 如果未在类中声明未继承的方法,或者在接口中声明未继承的方法并且新声明是抽象的,则称新的声明将覆盖它 . 如果未继承的方法是抽象的并且新的声明不是抽象的,那么新的声明就可以实现它 .

    您会注意到没有类似的语言,如果有问题的子弹被添加到Java 8中引入的默认接口方法,这是有意义的 .

  • 0

    第四颗子弹对我来说不清楚 .

    这意味着您继承了自己不会覆盖的超类中的所有方法 .

    甚至不可能在同一个类中声明抽象和非抽象方法 .

    什么?

    public abstract class AbstractClass {
    
        public abstract void abstractMethod();
    
        public void concreteMethod() {
    
        }
    }
    

相关问题