多态(polymorphism)
多态性是OOP中的一个重要特性,主要是用来实现动态联编的,换句话说,就是程序的最终状态只有在执行过程中才能被决定而非在编译期间就决定了。这对于大型系统来说能提高系统的灵活性和扩展性。
java中如何实现多态?使用多态的好处?
引用变量的两种类型:
由声明时的类型决定:
- 运行时类型(运行时,具体是哪个子类就是那个子类)
由实际对应的对象类型决定
多态的存在有3个必要条件:
要有继承,要有方法重写,父类引用指向子类对象(多态是指方法的多态)
定义一个Animal类,Cat类、Dog类和Tiger类继承Animal类,重写Animal类中的run()方法:
代码如下:
<span style="font-size:18px;">/**运行结果:
* 定义基类:动物类
*/
class Animal {
String str;
public void voice(){
System.out.println("普通动物叫声!");
}
}
/**
* 定义一个猫类,继承Animal类,重写run()方法
*/
class Cat extends Animal {
public void voice(){
System.out.println("喵喵喵");
}
public void catchMouse(){
System.out.println("抓老鼠");
}
}
/**
* 定义一个狗类,继承Animal类,重写run()方法
*/
class Dog extends Animal {
public void voice(){
System.out.println("汪汪汪");
}
public void seeDoor(){
System.out.println("看门!");
}
}
/**
* 定义一个老虎类,继承Animal类,重写run()方法
*/
class Tiger extends Animal {
public void voice(){
System.out.println("哇哇哇");
}
}
/**
* 定义测试类,用来测试多态性
*/
public class Test01 {
public static void testAnimalVoice(Animal c){
c.voice();
if(c instanceof Cat){
((Cat) c).catchMouse();
}
}
/*
public static void testAnimalVoice(Dog c){
c.voice();
}
public static void testAnimalVoice(Pig c){
c.voice();
}*/
public static void main(String[] args) {
Animal a = new Cat();
//Cat a2 = (Cat)a;
//testAnimalVoice(a);
//
//a2.catchMouse();
Animal b = new Dog();
Animal c = new Tiger();
testAnimalVoice(a);
testAnimalVoice(b);
testAnimalVoice(c);
}
}</span>
喵喵喵
抓老鼠
汪汪汪
哇哇哇
在这里我们讲讲多态中类型转换的问题:
两种类型的类型转换:
(1)向上类型转换(Upcast):将子类型转换为父类型。
比如说将Cat类型转换为Animal类型,即将子类型转换为父类型。对于向上类型转换,不需要显式指定。,自动转换。(父类引用指向子类对象)
<span style="font-size:18px;">Animal a = new Cat();</span>
(2)向下类型转换(Downcast):将父类型转换为子类型。
比如将Animal类型转换为Cat类型。即将父类型转换为子类型。对于向下类型转换,必须要显式指定(即要使用强制类型转换)。
在向下类型转换中需要注意的两个问题:
a:当需要调用子类对象的方法时,如果不进行向下类型转换,在编译时不管你实例化的对象是谁,因为它只进行编译
b:在向下类型转换中,父类型的引用必须指向子类的对象,即指向谁才能转换成谁。如果父类引用指向某一个子类对象,该子类对象可以任意转换为其他该父类的子对象,编译时会出错:
比如:Tiger c2 = a; //上述代码中
错误提示:Type mismatch: cannot convert from Animal to Tiger
本文参考:非常感谢北京尚学堂高琪老师!