ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

面向对象的多态性

2020-11-15 17:04:37  阅读:161  来源: 互联网

标签:sec13 多态性 代码 Dog 面向对象 say 复制 public


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 }

标签:sec13,多态性,代码,Dog,面向对象,say,复制,public
来源: https://www.cnblogs.com/w2758472746/p/13977352.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有