Java面向对象-对象的多态性
Java中的多态性表现:
1,方法的重载和重写(覆盖);
2,可以用父类的引用指向子类的具体实现,而且可以随时更换为其他子类的具体实现;
我们先搞个父类Animal:
1 package com.java1234.chap03.sec13; 2 3 public class Animal { 4 5 public void say(){ 6 System.out.println("我是一个动物"); 7 } 8 }
再搞两个子类,分别是Dog和Cat类,重写父类方法say:
1 package com.java1234.chap03.sec13; 2 3 public class Cat extends Animal{ 4 5 public void say(){ 6 System.out.println("我是一个猫"); 7 } 8 }
1 package com.java1234.chap03.sec13; 2 3 public class Dog extends Animal{ 4 5 public void say(){ 6 System.out.println("我是一个狗"); 7 } 8 }
然后我们写个Test测试类:
1 package com.java1234.chap03.sec13; 2 3 public class Test { 4 5 public static void main(String[] args) { 6 Dog dog=new Dog(); 7 dog.say(); 8 9 Cat cat=new Cat(); 10 cat.say(); 11 } 12 }
运行输出:
我是一个狗
我是一个猫
这个大家肯定能看明白 简单的子类继承 以及实例化对象 调用方法 ;
下面我来用多态测试,父类引用指向子类具体实现:
1 package com.java1234.chap03.sec13; 2 3 public class Test { 4 5 public static void main(String[] args) { 6 // 父类引用指向Dog子类的具体实现 7 Animal animal=new Dog(); 8 animal.say(); 9 10 // 更换实现 11 animal=new Cat(); 12 animal.say(); 13 } 14 }
运行输出:
我是一个狗
我是一个猫
对象的转型:
向上转型:子类对象->父类对象 安全
向下转型:父类对象->子类对象 不安全
比如上面的实例:Animal animal=new Dog(); 就是后面的new Dog() 子类对象 向上 Animail animal 转型 是安全的;
向下转型 是父类对象强制转换成子类对象:我们来改下Test类:
1 package com.java1234.chap03.sec13; 2 3 public class Test { 4 5 public static void main(String[] args) { 6 // 父类引用指向Dog子类的具体实现 7 Animal animal=new Dog(); 8 animal.say(); 9 10 // 向下转型 11 Dog dog=(Dog) animal; 12 dog.say(); 13 14 // 向下转型 因为animal指向的是Dog具体实现 所以会报错 15 Cat cat=(Cat)animal; 16 cat.say(); 17 } 18 }
运行报错:
我是一个狗
我是一个狗
Exception in thread "main" java.lang.ClassCastException: com.java1234.chap03.sec13.Dog cannot be cast to com.java1234.chap03.sec13.Cat
at com.java1234.chap03.sec13.Test.main(Test.java:15)
转换异常 所以说向下转型是不安全的,我们必须知道具体的实现类;
我们上面用的继承方式演示了多态 其实在实际开发中 更多的是用接口:
我们再写一个实例:
我们先建一个父类接口People:
1 package com.java1234.chap03.sec13; 2 3 public interface People { 4 5 public void say(); 6 }
接下来写两个具体实现类,Student Teacher:
1 package com.java1234.chap03.sec13; 2 3 public class Student implements People{ 4 5 @Override 6 public void say() { 7 System.out.println("我是学生"); 8 } 9 10 }
1 package com.java1234.chap03.sec13; 2 3 public class Teacher implements People{ 4 5 @Override 6 public void say() { 7 System.out.println("我是老师"); 8 } 9 10 }
我们来写一个测试类:
1 package com.java1234.chap03.sec13; 2 3 public class Test2 { 4 5 public static void main(String[] args) { 6 People p1=new Student(); 7 p1.say(); 8 9 p1=new Teacher(); 10 p1.say(); 11 } 12 }
运行输出:
我是学生
我是老师