使用超类私有方法可以减少派生类的限制吗?

时间:2017-06-21 19:58:14

标签: java inheritance

基本上,你可以这样做吗?

class Base {
    private void foo(){
        println("Base");
    }
}
class Derived extends Base {
    public void foo(){
        println("Derived");
    }
}

2 个答案:

答案 0 :(得分:1)

在您的示例中,派生类的限制性不低。基类和派生类中的方法彼此无关。 方法Derived.foo()不会覆盖Base.foo()因此,Base.foo()的私有访问不会受到Derived.foo()的限制。

Java语言规范Section 8.4.8, Inheritance, Overriding, and Hiding对此进行了介绍。

  

8.4.8.1覆盖(按实例方法)

     

在C类中声明或继承的实例方法mC,覆盖   来自C的另一种方法mA在A类中声明,iff以下全部   是的:

     
      
  • A是C的超类。
  •   
  • C不继承mA。
  •   
  • mC的签名是mA签名的子签名(§8.4.2)。
  •   
  • 以下之一是真的:      
        
    • mA是公开的。
    •   
    • mA受到保护。
    •   
    • mA在与C相同的包中声明包访问,并且C声明mC或mA是C的直接超类的成员。
    •   
    • mA通过包访问声明,mC覆盖来自某个超类C的mA。
    •   
    • mA通过封装访问声明,mC覆盖C中的方法m'(m'与mC和mA不同),这样m'可以覆盖mA   一些超类C
    •   
  •   

简而言之,子类不能覆盖私有方法。如果从基类调用私有方法,它将调用该私有方法,而不是子类中具有相同名称和签名的方法。

答案 1 :(得分:0)

编译器不会给你一个错误,但它不会覆盖超类方法。为了能够覆盖子类必须能够首先看到该方法,但由于它是私有的,它对子类是不可见的,因此它被视为子类中的方法而不是