java中的运行时多态性

时间:2016-05-20 17:30:17

标签: java polymorphism

为什么我得到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);
    }
}

1 个答案:

答案 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方法变为“可重写”。