多态的主要形式:
-
方法重写(Override):
- 子类可以重写父类中的方法,使得父类的引用可以调用子类的方法,表现出不同的行为。
// 父类 class Animal { public void makeSound() { System.out.println("Animal makes a sound"); } } // 子类 class Dog extends Animal { @Override public void makeSound() { System.out.println("Dog barks"); } } // 测试 public class TestPolymorphism { public static void main(String[] args) { Animal animal = new Dog(); // 多态:使用父类引用指向子类对象(继承加重写) animal.makeSound(); // 调用的是实际对象的方法,输出:Dog barks } }
多态应用两种方法:
-
父类类型作为方法形参实现多态,使方法参数的类型更为广泛
-
使用父类作为方法返回值实现多态,使方法可以返回不同子类对象。
// 父类 class Animal { public void makeSound() { System.out.println("Animal makes a sound"); } } // 子类1 class Dog extends Animal { @Override public void makeSound() { System.out.println("Dog barks"); } } // 子类2 class Cat extends Animal { @Override public void makeSound() { System.out.println("Cat meows"); } } //测试应用一 public class test { public void eated(Animal ani) { //父类类型作为形参,指向子类对象 ani.makeSound();// 调用子类方法 } public static void main(String[] args) { test test1=new test(); test1.eated(new Cat()); } } //测试应用二 public Animal getAnimal(String type){//使用父类作为方法返回值实现多态,使方法可以返回不同子类对象。 if(type.equals(cat)){ return new Cat(); }else{ return new Dog()} }
向下转型是从一个父类类型转换为其子类类型的过程。在 Java 中,如果有一个父类的引用指向一个子类的对象,可以使用向下转型将父类引用转换为子类引用,以便调用子类特有的方法或访问子类特有的属性。需要注意的是,进行向下转型时,最好先使用
instanceof
进行类型检查,以避免类型转换异常。如果对象确实是目标类型的实例,那么向下转型就是安全的;否则,可能会抛出ClassCastException
异常。class Animal { public void eat() { System.out.println("Animal is eating"); } } class Dog extends Animal { public void bark() { System.out.println("Dog is barking"); } } public class Main { public static void main(String[] args) { Animal animal = new Dog(); // 向上转型 animal.eat(); // 调用父类方法 // 向下转型 if (animal instanceof Dog) { Dog dog = (Dog) animal; // 向下转型 dog.bark(); // 调用子类特有的方法 } } }
- 子类可以重写父类中的方法,使得父类的引用可以调用子类的方法,表现出不同的行为。