Java面向对象-对象的多态性

时间:2023-02-24 18:30:02

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 }

运行输出:

我是学生

我是老师