一、多态
多态指的是同一个方法调用,由于对象不同可能会有不同的行为。
多态的要点:
1. 多态是方法的多态,不是属性的多态(多态与属性无关)。
2. 多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象。
3. 父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。
public class TestDuotai {
public static void main(String[] args) {
Animal a = new Animal();
AnimalCry(a);
Cat c = new Cat();
AnimalCry(c);
Dog d = new Dog();
AnimalCry(d);
}
static void AnimalCry(Animal a) {
a.cry();
}
}
class Animal{
public void cry() {
System.out.println("叫了一声!");
}
}
class Cat extends Animal{
public void cry() {
System.out.println("喵喵喵!");
}
}
class Dog extends Animal{
public void cry() {
System.out.println("汪汪汪!");
}
}
二、对象的转型
多态也有弊端,就是无法调用子类特有的功能,比如下面例子中,我不能使用父类的引用变量调用Dog类特有的seeDoor()方法。这是我们就需要使用对象转型了。
父类引用指向子类对象,我们称这个过程为向上转型,属于自动类型转换。
向上转型后的父类引用变量只能调用它编译类型的方法,不能调用它运行时类型的方法(子类特有的方法)。这时,我们就需要进行类型的强制转换,我们称之为向下转型。
在向下转型过程中,必须将引用变量转成真实的子类类型(运行时类型)否则会出现类型转换异常ClassCastException。
public class TestDuotai {
public static void main(String[] args) {
Animal a1 = new Cat(); //向上可以自动转型
a1.cry();
Animal a2 = new Dog(); //向上可以自动转型
a2.cry();
//a2.seedoor(); 报错
Dog dog = (Dog)a2; //向下需要强制类型转换,
//a2由Animal类型(引用变量)转换为Dog类型(子类类型)
dog.seeDoor();
/*编译不会出错,但运行会出现java.lang.ClassCastException错误
Dog dog2 = (Dog)a1;
dog.seeDoor();
*/
}
}
class Animal{
public void cry() {
System.out.println("叫了一声!");
}
}
class Cat extends Animal{
public void cry() {
System.out.println("喵喵喵!");
}
}
class Dog extends Animal{
public void cry() {
System.out.println("汪汪汪!");
}
public void seeDoor() {
System.out.println("看门中....");
}
}