为什么我得到4,基类函数fun(int)是私有的,5如果是默认的?
class one
{
int a;
private void fun(int a)
{
System.out.println(a);
}
public static void main (String [] args)
{
one y= new B();
y.fun(4);
// B obj =new B();
// obj.fun(4);
}
}
class B extends one
{
void fun(int a)
{
a = a+1;
System.out.println(a);
}
}
答案 0 :(得分:0)
参见Java规范, 8.4.8一章。继承,覆盖和隐藏
https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.8
C类从其直接超类继承所有具体方法m (超静态和实例)所有的超类 以下是真实的:
m是C的直接超类的成员。
m 公开,受保护或声明包含访问权限 打包为C.
在C中声明的方法没有签名作为子签名 (§8.4.2)m的签名。 ..... .....
的 8.4.8.1。覆盖(通过实例方法)- 在C类中声明或继承的实例方法mC,覆盖C类中声明的另一个方法mA,iff以下所有条件都为真: .....
- 以下之一是真的:
- mA是公开的。
- mA受到保护。
- mA在与C,.....相同的包中声明包访问权。
上述方法是,您无法覆盖私有方法,而B类实际上不会覆盖fun
。
如果您删除private
修饰符或将fun
声明为公共或受保护,则代码返回5,因为fun
方法变为“可重写”。