java多态面向对象多态入门-java入门超经典教程

45 篇文章 1 订阅
23 篇文章 3 订阅

转自: 百度百家号
作者:茶山梦语

1.1. 多态(掌握)

多态时面向对象三大特征:封装、继承、多态。

在继承关系,是一种”is A”的关系,也就说子类是父类的一种特殊情况,有如下代码:

public class Animal{}

public class Dog extends Animal{}

public class Cat extends Animal{}

那么我们可以认为狗和猫都是一种特殊的动物,那么可以使用动物类型类来表示狗或猫。

Dog d = new Dog(); //创建一只狗对象,赋给子类类型变量

Animal a =new Cat(); //创建一只猫对象,赋给父类类型变量

此时对象(a)具有两种类型:

n 编译类型:声明对象变量的类型——>Animal

n 运行类型:对象的真实类型——>Dog

当编译类型和运行类型不一致的时候,此时多态就产生了:

注意:编译类型必须是运行类型的父类或接口。

所谓多态,表示一个对象具有多种形态。

Animala = null;

a = new Dog();//a此时表示Dog类型的形态

a = new Cat();//a此时表示Cat类型的形态

多态的前提,可以是继承关系(类和类),也可以是实现关系(接口和实现类),在开发中,一般都指接口和实现类之间的关系,什么是多态?

一言以蔽之:父类引用变量指向于子类对象,调用方法时实际调用的是子类的方法。

我家有一种动物,你猜它的叫声是怎么样的,猜不到,因为这个动物有多种形态。

n 如果该动物是狗,叫声是:旺旺旺…

n 如果该动物是猫,叫声是:妙妙妙…

多态操作有两种定义格式和操作语法:

n 操作继承关系(开发中不是很多):

父类 变量名 = new 子类();

变量名.方法();

n 操作实现关系(开发中最频繁):

接口 变量名 = new 实现类();

变量名.方法();

1.1.1. 操作继承关系(掌握)

接口 变量名 = new 实现类();

变量名.方法();

Animal类:

这里写图片描述

Cat类:
这里写图片描述

Dog类:
这里写图片描述

测试类:
这里写图片描述

运行结果:

妙妙妙…

旺旺旺…

验证结论:父类引用变量指向于子类对象,调用方法时实际调用的是子类的方法。

1.1.2. 操作实现关系(重点掌握)

接口 变量名 = new 实现类();

变量名.方法();

ISwimable 接口:

public interface ISwimable {

void swim();

}

Fish类:
这里写图片描述

测试类:
这里写图片描述

运行结果:

游啊游…

1.1.3. 多态时方法调用问题(重点掌握)

把子类对象赋给父类变量,此时调用方法:

Animal a = new Cat();

a.shout();

那么a对象调用的shout方法,是来自于Animal中还是Cat中?判断规则如下:

一张图,看懂到底调用的是哪一个类中的方法!

这里写图片描述

文字解释,先判断shout方法是否在父类Animal类中:

找不到:编译报错

找到:再看shout方法是否在子类Cat类中:

找不到:运行父类方法

找到:运行子类方法(这个才是真正的多态方法调用)

1.1.4. 类型转换和instanceof运算符(了解)

自动类型转换:把子类对象赋给父类变量(多态)

Animal a = new Dog();

Object obj = new Dog();//Object是所有类的根类:

强制类型转换:把父类类型对象赋给子类类型变量(前提:该对象的真实类型应该是子类类型)

Animal a = new Dog();

Dogd = (Dog) a;//正确

Cat c = (Cat) a;//错误

instanceof 运算符:判断该对象是否是某一个类的实例,在开发中运用不是很多

语法格式:boolean b = 对象A instanceof 类B; //判断 A对象是否是 B类的实例?如果是,返回true

代码如下:

Animal a = new Dog();

System.out.println(a instanceof Animal);//true

System.out.println(a instanceof Dog);//true

System.out.println(a instanceof Cat);//false

1.1.5. 多态的好处-USB案例(掌握)

需求:模拟在主板上安装鼠标、键盘等,比较没有规范和有规范的区别。

没有统一规范:

鼠标类:
这里写图片描述

键盘类:

这里写图片描述
主板类:
这里写图片描述

上述代码是没有统一规范的,我们能发现其中的问题:

n 不同设备中工作的方法名称是不一致的

n 每次需要安装中设备,都需要在主板类上新增一个方法(这个问题严重)

没有统一规范:

USB规范接口:
这里写图片描述

在Mouse和Keyboard类遵循于USB规范——工作的方法名称也就相同了。

这里写图片描述
主板类,在安装方法plugin上也体现出了多态的特征:
这里写图片描述

面向接口编程,体现的就是多态,其好处:把实现类对象赋给接口类型变量,屏蔽了不同实现类之间的实现差异,从而可以做到通用编程。

测试类,无论是否使用多态,测试代码相同:
这里写图片描述

请问:使用USB接口后,哪里出现多态了?

本系列教程为叩丁狼Java基础班内部教材,若要获得最好的学习效果,需要配合对应教学视频一起学习。需要完整教学视频,请私信作者。百度百家号
作者:茶山梦语
如有侵权请联系管理员删除。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值