2015-10-02 4 views
0

Есть ли способ использования литья, поэтому метод m1() выполняется в классе I1 для печати In I1 class? Я не хочу, чтобы он запускал переопределенный метод.Как применять метод суперкласса

class TestClass extends I1 implements I2{ 
     public void m1() { System.out.println("Hello"); } 
     public static void main(String[] args){ 
      I1 tc = new TestClass(); 
      tc.m1(); 
     } 
    } 
    class I1{ 
     int VALUE = 1; 
     public void m1(){System.out.println("In I1 class");} 
    } 
    interface I2{ 
     int VALUE = 2; 
     void m1(); 
    } 
+0

Я думал ((I1) tc) .m1(); будет работать, но он по-прежнему печатает «Привет» – Mel

+0

Нет, это будет большой недостаток безопасности. Аналогичный вопрос объясняет, почему 'super.super' также невозможно: http://stackoverflow.com/questions/586363/why-is-super-super-method-not-allowed-in-java – Pshemo

+0

Вы не можете этого сделать. [Здесь] [1] объясняет, почему. [1]: http://stackoverflow.com/a/22874698/4228138 –

ответ

2

Нет, вы не можете этого сделать. Часть точки полиморфизма заключается в возможности скрыть детали реализации из классов ниже в иерархии. Вы можете вызвать метод суперкласса, но только как вызов внутри переопределенного метода.

Подумайте об этом. Может быть, TestClass делает что-то важное внутри метода m1, которое сохраняет свое внутреннее состояние и сохраняет его согласованным. Возможно, он отслеживает то, что делается в суперклассе, и сохраняет свой собственный кеш, или копирует, или аналогично. Если вы можете заставить его вызвать метод суперкласса, этот код не будет запущен, и вы сильно сломаете TestClass.

Причина, что предложение в вашем комментарии

((I1)tc).m1(); 

не работает в том, что вы изменили тип формального но не фактический типа . Вызов переопределенных методов основан на фактическом типе во время выполнения, поэтому JVM все равно заметит, что это тип TestClass и вызывает переопределенный метод.

0

Вы первый объявил I1 tc = new TestClass(), так что даже вы ((I1)tc).m1(), tc все еще указывает на объект TestClass(). Вот почему это не сработает.

Если вы хотите позвонить m1() из класса I1, вы должны сделать вместо этого I1 tc = new I1();.

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