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

Java中的多态性表现:

1,方法的重载和重写;

2,可以用父类的引用指向子类的具体实现,而且可以随时更换为其他子类的具体实现;



我们先搞个父类Animal:

1
2
3
4
5
6
7
8
package  com.java1234.chap03.sec13;
 
public  class  Animal {
 
     public  void  say(){
         System.out.println( "我是一个动物" );
     }
}


再搞两个子类,分别是Dog和Cat类,重写父类方法say:

1
2
3
4
5
6
7
8
package  com.java1234.chap03.sec13;
 
public  class  Cat  extends  Animal{
 
     public  void  say(){
         System.out.println( "我是一个猫" );
     }
}
1
2
3
4
5
6
7
8
package  com.java1234.chap03.sec13;
 
public  class  Dog  extends  Animal{
 
     public  void  say(){
         System.out.println( "我是一个狗" );
     }
}


然后我们写个Test测试类:

1
2
3
4
5
6
7
8
9
10
11
12
package  com.java1234.chap03.sec13;
 
public  class  Test {
 
     public  static  void  main(String[] args) {
         Dog dog= new  Dog();
         dog.say();
         
         Cat cat= new  Cat();
         cat.say();
     }
}


运行输出:

我是一个狗

我是一个猫



这个大家肯定能看明白 简单的子类继承 以及实例化对象 调用方法 ;


下面我来用多态测试,父类引用指向子类具体实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package  com.java1234.chap03.sec13;
 
public  class  Test {
 
     public  static  void  main(String[] args) {
         // 父类引用指向Dog子类的具体实现
         Animal animal= new  Dog();
         animal.say();
         
         // 更换实现
         animal= new  Cat();
         animal.say();
     }
}


运行输出:

我是一个狗

我是一个猫



对象的转型:

向上转型:子类对象->父类对象 安全

向下转型:父类对象->子类对象 不安全


比如上面的实例:Animal animal=new Dog(); 就是后面的new Dog() 子类对象 向上  Animail animal 转型  是安全的;


向下转型 是父类对象强制转换成子类对象:我们来改下Test类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package  com.java1234.chap03.sec13;
 
public  class  Test {
 
     public  static  void  main(String[] args) {
         // 父类引用指向Dog子类的具体实现
         Animal animal= new  Dog();
         animal.say();
         
         // 向下转型
         Dog dog=(Dog) animal;
         dog.say();
         
         // 向下转型  因为animal指向的是Dog具体实现 所以会报错
         Cat cat=(Cat)animal;
         cat.say();
     }
}


运行报错:

我是一个狗

我是一个狗

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
2
3
4
5
6
package  com.java1234.chap03.sec13;
 
public  interface  People {
 
     public  void  say();
}


接下来写两个具体实现类,Student Teacher:

1
2
3
4
5
6
7
8
9
10
package  com.java1234.chap03.sec13;
 
public  class  Student  implements  People{
 
     @Override
     public  void  say() {
         System.out.println( "我是学生" );
     }
 
}
1
2
3
4
5
6
7
8
9
10
package  com.java1234.chap03.sec13;
 
public  class  Teacher  implements  People{
 
     @Override
     public  void  say() {
         System.out.println( "我是老师" );
     }
 
}


我们来写一个测试类:

1
2
3
4
5
6
7
8
9
10
11
12
package  com.java1234.chap03.sec13;
 
public  class  Test2 {
 
     public  static  void  main(String[] args) {
         People p1= new  Student();
         p1.say();
         
         p1= new  Teacher();
         p1.say();
     }
}

运行输出:

我是学生

我是老师

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值