Проблема в апкастинге в Java? - PullRequest
4 голосов
/ 18 июля 2011

Может кто-нибудь объяснить, почему это происходит:

class Apple {

   String type;

   setType(){
      System.out.println("inside apple class");
      this.type = "apple";
   }

}

class RedApple extends Apple {

    String type;

    setType() {
      System.out.println("inside red-apple class");
       this.type = "redapple";
    }
}

int main {

    RedApple red = new RedApple();
    Apple apple = (Apple) red;
    apple.setType();

}

Но полученная продукция:

"inside red-apple class”

Почему метод .setType() выполняет метод подкласса, а не метод суперкласса, несмотря на то, что я повышаю, как видно?

Ответы [ 4 ]

5 голосов
/ 18 июля 2011

Это потому, что именно так работает полиморфизм в Java: он всегда использует самую производную версию метода, которая переопределяет другие версии.Единственный способ получить версию базового класса - это использовать super.setType в пределах самого производного переопределения.

2 голосов
/ 18 июля 2011

Это базовая особенность любого языка ООП.Вот почему все деконструкторы в C ++ должны быть виртуальными - для реализации полиморфизма.Чтобы сделать соответствующий метод будет вызван. Это - хороший материал, чтобы понять, как это работает

1 голос
/ 18 июля 2011

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

Тем не менее, пример того, где upcasting делает разницу, здесь:

class MyClass {
    static void doSomething(Apple apple) { System.out.println("Apple"); }
    static void doSomething(RedApple apple) { System.out.println("RedApple"); }
}
...
RedApple apple = new RedApple();
MyClass.doSomething(apple);
MyClass.doSomething((Apple)apple);

Выход:

RedApple
Apple

Так как мы передали его в Apple, наилучшим подходящим методом является метод с параметром Apple.

0 голосов
/ 18 июля 2011

Это способ работы Java, который называется переопределением поведения методов. Если вы хотите иметь метод в суперклассе, вы можете использовать method-hiding i: e статические методы как в родительском, так и в дочернем классе с одинаковой сигнатурой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...