以下是JLS定义方法继承的方式:
C类继承自其直接超类和直接 对所有抽象和默认(§9.4)方法m进行超级接口 以下所有都是真的:
m是直接超类或直接超接口D的成员, C。
m是公共,受保护或声明的,具有相同的包访问权限 打包为C.
- 签名的(§8.4.2)
在C中声明的方法没有签名作为子签名 (m。
C从其直接超类继承的具体方法没有 签名,是m签名的子签名。
没有方法m'是直接超类的成员 或C的直接超界面D'(m不同于m',D不同 来自D'),使得来自D'的m'覆盖方法的声明 米。
我不清楚第四颗子弹。甚至不可能在同一个类中声明抽象和非抽象方法。难道你不能解释这条规则到底是什么意思吗?
答案 0 :(得分:2)
C可以从其直接超类和它实现的接口继承方法(在Java 8中,它甚至可以从接口继承默认实现)。
假设C
扩展B
并实施I
。
B包含一种方法:
public void m (String s)
我包含一个方法(可能带有默认实现):
public void m (String s)
由于存在C
的{{1}}方法,第4个子弹意味着I
不会继承m
的{{1}}方法。 B
只会继承m
的{{1}}方法。
如果你看similar section in the JLS for Java 7:
8.4.8。继承,覆盖和隐藏
C类继承自其直接超类和直接 超级接口的所有抽象和非抽象方法 公共,受保护或声明的超类和超接口 在与C相同的包中具有默认访问权限,并且都不是 通过声明覆盖(第8.4.8.1节)或隐藏(第8.4.8.2节) 类。
在逐个签名的基础上覆盖或隐藏方法。
例如,如果一个类声明了两个具有相同的公共方法 name(§8.4.9),子类重写其中一个子类 仍然继承了另一种方法。
如果未在类中声明未继承的方法,或者方法未声明 继承在接口中声明,新声明是 抽象,然后新的声明被称为覆盖它。
如果未继承的方法是抽象而新的声明不是 抽象,然后据说新的声明实现它。
您会注意到没有类似的语言,如果有问题的子弹被添加到Java 8中引入的默认接口方法,这是有意义的。
答案 1 :(得分:0)
我不清楚第四颗子弹。
这意味着您继承了自己不会覆盖的超类中的所有方法。
甚至不可能在同一个类中声明抽象和非抽象方法。
什么?
public abstract class AbstractClass {
public abstract void abstractMethod();
public void concreteMethod() {
}
}