2015-03-31 4 views
0

я обнаружил, что следующий код компилируется:Почему я могу наследовать окончательный метод из внутреннего класса?

class Ideone 
{ 
    public static void main (String[] args){ 
     new Ideone().m(); 
    } 

    final private void m(){ 
     System.out.println("private final method"); 
    } 

    class A extends Ideone{ 
     public void method(String [] args){ 
      m(); 
     } 
    } 
} 

и выполняет.

Мне очень интересно об этом.

Можете ли вы объяснить, почему дизайнеры java (учредители) сделали это сработавшим?

+1

Нет ничего плохого; 'm' не переопределяется. – rgettman

+3

'final' означает * не меняйте меня *, а не * не наследуйте меня * –

+0

Вы можете вызвать * private * метод' Ideone # m() ', потому что класс' A' находится в области класса 'Ideone' , Не уверен, что это то, что вы имеете в виду? – msandiford

ответ

0

Окончательный метод может быть унаследован подклассом, независимо от того, какой подкласс находится вне родительского класса или внутри родительского класса. Но вы не можете переопределить окончательный метод в своем подклассе. Если конечный метод является приватным, вы не можете наследовать его в своем подклассе, если ваш подкласс не находится внутри родительского класса (например, в вашем примере).

0

Поскольку вы объявляете метод приватным, окончательный эффект не имеет эффекта и является избыточным.

Переопределение частного метода на самом деле не имеет особого смысла.

Это не что иное, как вызов частного метода в классе из другого метода в том же классе (который может быть общедоступным). Это то, что делается часто, чтобы код был более читабельным и управляемый по размеру.

Я не думаю, что это глупый вопрос :)

Возьмите Builder-шаблон, например. Он использует частные конструкторы, чтобы убедиться, что класс построен правильно. Таким образом, понимание того, что вы имеете в наличии в различной сфере, и почему важно :)

class Ideone { 
private String m; 

private Ideone(String m) { 
    System.out.println("Build me with: " + m); 
    this.m = m; 
} 

public String getM() { 

    return m; 
} 

static class IdeoneBuilder{ 
    String m; 

    public IdeoneBuilder withM(String m) { 
     this.m = m; 
     return this; 
    } 

    public Ideone build() { 
     return new Ideone(this.m); 
    } 

} 

public static void main (String[] args){ 
    // new Ideone(); // will not compile 
    Ideone ideone = new IdeoneBuilder() 
      .withM("test").build(); 
} 
} 

Edit: Вы можете сделать окончательный класс Ideone, и он все равно будет работать. И вы также не можете подклассифицировать его. Другими словами, вы убедитесь, что нет другого способа построить объект своего класса, кроме использования построителя (если не использовать отражение).

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