2016-03-19 19 views
3

Используя это в качестве примера:Разъяснение о переопределение в Java

class Animal{ 

    public void move(){ 
     System.out.println("Animals can move"); 
    } 
} 

class Dog extends Animal{ 

    public void move(){ 
     System.out.println("Dogs can walk and run"); 
    } 
} 

public class TestDog{ 

    public static void main(String args[]){ 
     Animal a = new Animal(); // Animal reference and object 
     Animal b = new Dog(); // Animal reference but Dog object 

     a.move();// runs the method in Animal class 

     b.move();//Runs the method in Dog class 
    } 
} 

правильно ли это здесь, чтобы сказать после вызова b.move() метод «движение() под класса Dog» была переопределена «Переместить() под классом Animal ", поскольку объект Dog имеет приоритет при вызове того же метода при ссылке на тип Animal?

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

Замечание, возможно ли иметь объект Dog, но вызвать move(), который находится под классом Animal? например, что-то вроде:

Dog doggy = new Dog(); 
doggy.move() 
>>> 
Animals can move 
>>> 

Возможно ли это? ((Animal) doggy) .move() выполнить это?

+0

Кроме того, использование @Override нотация, предотвращает ошибки , такие как орфографические имена методов в подклассах. – jam

ответ

4

Абсолютно, это правильно сказать, после вызова b.move() метод «move() под Dog класса» имеет заменяете «move() под Animal класса».

Что касается второго вопроса, вы должны реализовать класс Dog как:

public class Dog extends Animal { 

    public void move(){ 
    super.move(); 
    } 
} 

Для третьего вопроса, то ответ «НЕТ».

  ((Animal) doggy).move() 

Это просто «лишнее» и дать выход «move() под Dog класса».

0

Используйте ключевое слово super, чтобы вызвать функции членов-членов родителей или данных.

подобный: super.move();, в этом случае вы будете вызывать родительскую функцию.

0

Из oracle docs

Если два или более независимо определены стандартные методы конфликта, или метод по умолчанию конфликтует с абстрактным методом, то компилятор Java выдает ошибку компилятора. Вы должны явно переопределить методы супертипа.

Так в основном, если вы находитесь в подклассе вызова метода, который находится в суперкласса, вы не сможете вызвать метод суперкласса, если вы не используете super.function(). Read up more on it here

1

Вы можете сделать это, как этот

class Animal{ 

    public void move(){ 
     System.out.println("Animals can move"); 
    } 
} 

class Dog extends Animal{ 

    public void move(){ 
     System.out.println("Dogs can walk and run"); 
    } 

    public void moveParent() { 
     super.move(); 

    } 

} 

public class Main{ 

    public static void main(String args[]){ 
     Animal a = new Animal(); // Animal reference and object 
     Animal b = new Dog(); // Animal reference but Dog object 

     a.move();// runs the method in Animal class 

     b.move();//Runs the method in Dog class 

     Dog doggy = new Dog(); 
     doggy.moveParent(); 

    } 
} 
0

Это принципиальное объектно-ориентированное программирование (aka OOP) - полиморфизм. Собака, Кот, Слон - все животные.

Animal d = new Dog(); 
Animal c = new Cat(); 
Animal t = new Tiger() 

Это не должно заботиться, всегда правильно.:)