2015-11-12 3 views
4

От docs: «Если подкласс определяет статический метод с той же сигнатурой, что и статический метод в суперклассе, то метод в подклассе скрывает тот, который находится в суперклассе».Почему это называется «метод скрывается»?

Я понимаю разницу между методом скрытия и переопределения. Тем не менее, странно сказать, что подкласс скрывает суперкласса метод, потому что если у вас есть следующие:

public class Cat extends Animal { 
    public static void testClassMethod() { 
     System.out.println("The static method in Cat"); 
    } 
    public void testInstanceMethod() { 
     System.out.println("The instance method in Cat"); 
    } 

    public static void main(String[] args) { 
     Cat myCat = new Cat(); 
     Animal myAnimal = myCat; 
     Animal.testClassMethod(); 
     myAnimal.testInstanceMethod(); 
    } 
} 

статический метод суперкласса называется. Но по определению сокрытия метод в подклассе скрывает одно в суперклассе. Я не вижу, как подкласс «скрывает/скрывает» статический метод суперкласса, поскольку метод суперкласса - это тот, который на самом деле называется.

+1

Я думаю, что это похоже на то, как локальная переменная может скрыть поле. Поле все еще доступно (так же, как и статический метод суперкласса), но он скрыт (сложнее получить доступ), так как поведение Cat.staticMehodName() - это вызов Cat, а не Animal. –

ответ

7

Вызывается статический метод суперкласса.

Да. Но это потому, что вы явно назвали статический метод суперкласса, присвоив имя суперкласса в выражении вызова.

Если бы ты написал main как это вместо:

public static void main(String[] args) { 
    ... 
    testClassMethod(); 
} 

, то вы увидели бы, что версия testClassMethodCat называлась. Здесь метод Cat.testClassMethod скрывает Animal.testClassMethod методу

+5

И «явно называть вещи» - это именно то, как можно обойти скрытые вещи. Такие как 'Animal.testClassMethod' или' this.value = value' или 'OuterClass.this.method()'. – Thilo

+0

Точно ........... –

2

Cat «s testClassMethod() скрывает Animal.testClassMethod(), так как если вы не имеете статический testClassMethod() в Cat классе, Cat.testClassMethod() бы вызвать Animal.testClassMethod().

Когда вы вызываете Animal.testClassMethod(), его нельзя скрыть методом подкласса.

0

добавьте ее к Опубликованная например

class Dog extends Animal { 
    // nothing here 
} 

Теперь, если вы сделаете это:

new Cat().testClassMethod(); 
new Dog().testClassMethod(); 

каждый из указанных выше даст различной мощности. Таким образом, можно сказать, что статический метод в Cat спрятал статический метод Animal - в то время как нет никакой вещи, как переопределение для статических методов, один из животных, напечатанных в соответствии с кодом Animal, а другой - нет.

(P.S. Я определенно не призываю вас вызывать статические методы в этом случае.)

0

Я думаю, что это называется «не скрывается», потому что вы больше не можете получить доступ к методу суперкласса просто написав имя метода. Без public static void testClassMethod() определения в Cat, ваш main мог сказать

testClassMethod(); 

вызвать метод, определенный в Animal. Но вы больше не можете этого делать.Да, вы все еще можете назвать его, дав ему полное имя:

Animal.testClassMethod(); 

так что не полностью скрыта. Но учтите, что люди, которые пишут языковые стандарты, должны придумывать имена для некоторых концепций, которые могут не совсем соответствовать значениям, которые мы даем в несимметричном мире, поэтому иногда приближаясь, это лучшее, что они могут сделать. Вы не можете пытаться использовать терминологию буквально. Полагаю, что термин hidden имеет формальное определение где-то в JLS; и это означает, что когда вы видите термин, используемый в JLS, это означает, что JLS определяет его как значение, ни больше, ни меньше.

+0

Это просто «скрытый» (некоторые называют его «затененным»), а не «недоступным». – Thilo

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

  • Нет связанных вопросов^_^