基本上,你可以这样做吗?
class Base {
private void foo(){
println("Base");
}
}
class Derived extends Base {
public void foo(){
println("Derived");
}
}
答案 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)
编译器不会给你一个错误,但它不会覆盖超类方法。为了能够覆盖子类必须能够首先看到该方法,但由于它是私有的,它对子类是不可见的,因此它被视为子类中的方法而不是