理解方法继承

时间:2015-02-25 09:54:38

标签: java inheritance

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

  

C类继承自其直接超类和直接   对所有抽象和默认(§9.4)方法m进行超级接口   以下所有都是真的:

     
      
  • m是直接超类或直接超接口D的成员,   C。

  •   
  • m是公共,受保护或声明的,具有相同的包访问权限   打包为C.

  •   
  • 在C中声明的方法没有签名作为子签名   (m。

  • 签名的(§8.4.2)   
  • C从其直接超类继承的具体方法没有   签名,是m签名的子签名。

  •   
  • 没有方法m'是直接超类的成员   或C的直接超界面D'(m不同于m',D不同   来自D'),使得来自D'的m'覆盖方法的声明   米。

  •   

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

2 个答案:

答案 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() {

    }
}