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 Dog extends Animal {
public String name = "我是子类,Dog类,父类也存在";
public String sonDog = "我是子类,Dog类,父类没有";
@Override
public void eat() {
System.out.println("我是子类,Dog类");
}
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);
}
}
- 运行结果:
- 说明:
向上转型(父类引用指向子类对象,默认转换):通过父类引用可以调用父类的方法和属性,但是不可以调用子类的方法和属性,如果子类和父类有相同的属性,则调用的是父类的属性;如果子类重写了父类的某方法,则调用的是子类的方法。
向下转型(子类引用指向父类对象,需要进行强制转换):通过子类引用可以调用子类和父类的方法和属性,如果子类和父类有相同的属性,则调用的是子类的属性;如果子类重写了父类的某方法,则调用的是子类的方法。
注意:在进行向下转型时之前,需要先进行向上转型,把向上转型的父类引用用作向下转型的对象,否则,会报类型转换异常。