1. 什么是多态?
- 多态指的是同一个行为有多种不同的表现形式。
2. 构成多态的三个充要条件
- 继承。
- 重写父类方法。
- 父类引用指向子类的对象(向上转型)或子类引用指向父类对象(向下转型)。
3. 代码分析
-
父类:
package com.hfut; /** * @author Chenzh */ public class Animal { public String name = "我是父类,子类也存在"; public String father = "我是父类,子类没有"; public void eat() { System.out.println("我是父类,animal类"); } public void sleep() { System.out.println("我是父类,我要睡觉了"); } } -
**子类1:Dog类
package com.hfut; /** * @author Chenzh */ public class Cat extends Animal { public String name = "我是子类,Cat类,父类也存在"; public String sonCat = "我是子类,Cat类,父类没有"; @Override public void eat() { System.out.println("我是子类,Cat类"); } public void voice() { System.out.println("我是子类,喵喵喵!"); } }** -
**子类2:Cat类
package com.hfut; /** * @author Chenzh */ public class Cat extends Animal { public String name = "我是子类,Cat类,父类也存在"; public String sonCat = "我是子类,Cat类,父类没有"; @Override public void eat() { System.out.println("我是子类,Cat类"); } public void voice() { System.out.println("我是子类,喵喵喵!"); } }** -
** 主类:**
package com.hfut; /** * @author Chenzh */ public class Main { public static void main(String[] args) { // 向上转型 Animal animal1 = new Dog(); animal1.eat(); animal1.sleep(); System.out.println(animal1.name); System.out.println(animal1.father); System.out.println("==============================="); // 向上转型 Animal animal2 = new Cat(); animal2.eat(); animal2.sleep(); System.out.println(animal2.name); System.out.println(animal2.father); System.out.println("==============================="); // 向下转型 Dog dog = (Dog) animal1; dog.eat(); dog.voice(); dog.sleep(); System.out.println(dog.name); System.out.println(dog.father); System.out.println(dog.sonDog); System.out.println("==============================="); // 向下转型 Cat cat = (Cat) animal2; cat.eat(); cat.voice(); cat.sleep(); System.out.println(cat.name); System.out.println(cat.father); System.out.println(cat.sonCat); } } -
** 运行结果:**
-
说明:
向上转型(父类引用指向子类对象,默认转换):通过父类引用可以调用父类的方法和属性,但是不可以调用子类的方法和属性,如果子类和父类有相同的属性,则调用的是父类的属性;如果子类重写了父类的某方法,则调用的是子类的方法。
向下转型(子类引用指向父类对象,需要进行强制转换):通过子类引用可以调用子类和父类的方法和属性,如果子类和父类有相同的属性,则调用的是子类的属性;如果子类重写了父类的某方法,则调用的是子类的方法。
注意:在进行向下转型时之前,需要先进行向上转型,把向上转型的父类引用用作向下转型的对象,否则,会报类型转换异常。