2016-05-20 2 views
1

Почему я получаю 4, когда функция базового класса fun (int) является частной и 5, если ее по умолчанию ?.Политизм времени выполнения в java

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

См. Спецификацию Java, глава 8.4.8. Наследование, переопределение и скрытие
https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.8

Класса C наследует от своего прямого суперкласса всех конкретных методов м (как статического и экземпляра) суперкласса, для которого все следующих условия:

  • м является членом непосредственного суперкласса C.

  • м является общественности, защищенная, или объявленный с выходом пакета в том же пакете как С.

  • Нет методы, объявленная в C имеет подпись, которая является подсигнатурой (§8.4.2) сигнатур т. ..... .....

    8.4.8.1. Переопределение (посредством методов экземпляров)

  • метода экземпляра мК объявлен или унаследован класс С, переопределяет из С другого метод мА объявлен в классе А, тогда и только тогда все следующие условия: .....
  • Должно соблюдаться одно из следующих правил:
    • мА является общедоступным.
    • мА защищен.
    • мА объявлен с выходом пакета в том же пакете, C, .....

Вышесказанное означает, что вы не можете изменить приватный метод, и класс B на самом деле не переопределяет fun.
Если вы либо удаляете модификатор private, либо объявляете fun общедоступным или защищенным, тогда код возвращает 5, потому что метод fun становится «переопределяемым».

+0

Но почему 'one.fun()' вызывается вместо 'B.fun()'? – shmosel

+0

class one получил ссылку B, поэтому почему one.fun() вызывается, а не B или время выполнения/время компиляции. – Batty

Смежные вопросы