第十二篇(多态) :《据说是:“当今社会最有前途!最值得学习的语言!”》让我们来了解一下这是什么样的一种语言!
多态
前言
所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
1. 理解和掌握多态的使用
多态概念:
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。简单的说:就是用父类的引用指向子类的对象。
多态实例:
有一个Animal类,它有Cat,和Dog两个子类,在Animal中有个 howl(嚎叫)方法,当Cat调用这个方法的时候输出的是“小猫喵喵喵”,当Dog调用这个方法时,输出的是“小狗汪汪汪”,这就是Java多态的实现。
多态的最基本使用方法:
-
父类的引用作为方法的形参。
// 父类的引用作为方法的形参 public void toHospital(Pet pet) { System.out.println("给宠物挂号"); System.out.println("给宠物吃药...."); pet.setHealth(pet.getHealth() + 5); }
-
父类的引用可以作为方法的返回值类型。
// 父类的引用作为方法的返回值类型 public Pet runPet(int choice) { if(choice == 1) { Dog dog = new Dog("小黄", 20, 60, "阿拉加斯"); System.out.println("开心的叫了起来!"); return dog; }else if(choice == 2) { Cat cat = new Cat(); cat.setName("小绿"); cat.setHealth(40); cat.setLove(60); cat.setGender('母'); System.out.println("开心的跳起来了"); return cat; } return null; }
2. 掌握instanceof关键字的使用
它是多态使用之后的必然产物,因为多态场景下,无法区分当前的父类引用具体指向了何子类对象。所以可以通过instanceof关键字来判断当前引用了何类型的对象。
对象名 instanceof 类型名
类型转型:
1.向上类型转换
Pet pet = new Dog(); 其实就是一种类型转换而已,类似于double num = 10; 在面向对象这一块,它被称为向上类型转换。
2.向下类型转换
同样的有了多态之后,有些时候我们得到的是父类引用的对象,但是如果现在希望对子类特有的信息进行操作,依靠于父类引用无法实现。
Cat cat = (Cat) pet cat.setGender(); 类似于 int num = (int)10.1; 在面向对象这一块,它被称为向下类型转换。
String的equals方法:
// Object类的此方法 是给所有的类使用的 希望所有的类在比较相等时都采用此方法 // 所以使用了多态:父类的引用(Object anObject)作为方法的形参 将此方法可扩展性大大的提升了 // 继承自Object类 并且进行了重写 方便我们进行[字符串的相等比较] /* String str1 = "hello World"; String str2 = "hello WoRld"; str1.equals(str2) */ public boolean equals(Object anObject) { // str1:this anObject:str2 // 判断地址值是否相同 == 比较引用数据类型 比较地址值 if (this == anObject) { return true; } // 判断要比较的对象 是否是String类型 原因是Object类型多态可以传入任何类型的子类对象 猫、狗 if (anObject instanceof String) { // 向下类型转型 因为Object是父类 父类的引用无法直接使用子类的特有信息 String anotherString = (String)anObject; // 获取this的字符数组长度 (String底层是char数组) int n = value.length; // 获取anObject的字符数组长度 判断是否和this的字符数组长度相同 if (n == anotherString.value.length) { // 获取this的字符数组 char v1[] = value; // 获取anObject的字符数组 char v2[] = anotherString.value; // 循环比较两个字符数组的每一个元素是否相同 int i = 0; while (n-- != 0) { // 只要有不同的内容 直接返回false if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
3. 了解getClass()和instanceof关键字的区别
- instanceof 用法:实例变量 instanceof 类 (该类必须是实例变量的本类或者父类,否则编译失败,显示Inconvertible types)
- 而getClass(): return The Class object that represents the runtime class of this object.
用法:实例变量.getClass() == 类.class ;如果想返回true,则实例变量必须是运行时指向对象*的实例。 - ==用于比较数值类型:即使数值类型不同,只要它们值相等,也会返回true。
- ==用于比较引用类型时,那么只有当两个引用变量的类型具有父子关系时才可以比较(否则会 报编译错误),而且这两个引用必须指向同一个对象才会返回true。
class A
class B extends A
instanceof:【本类对象和子类对象】
b instanceof A true
b instanceof B true
a instanceof A true a instanceof B false
getClass:【只考虑本类对象】
bclass == Aclass false
bclass == Bclass true
aclass == Aclass true aclass == Bclass false
- 第十三篇(抽象和接口) :《据说是:“当今社会最有前途!最值得学习的语言!”》让我们来了解一下这是什么样的一种语言!
- 第十五篇(集合框架(一)) :《据说是:“当今社会最有前途!最值得学习的语言!”》让我们来了解一下这是什么样的一种语言!
- 第十四篇(异常[exception]) :《据说是:“当今社会最有前途!最值得学习的语言!”》让我们来了解一下这是什么样的一种语言!
- 第十九篇(输入和输出(I/O)处理(一)) :《据说是:“当今社会最有前途!最值得学习的语言!”》让我们来了解一下这是什么样的一种语言!
- 第二十篇(输入和输出(I/O)处理(二)) :《据说是:“当今社会最有前途!最值得学习的语言!”》让我们来了解一下这是什么样的一种语言!
- 第二十一篇(多线程) :《据说是:“当今社会最有前途!最值得学习的语言!”》让我们来了解一下这是什么样的一种语言!
- 第十八篇(实用类(二)) :《据说是:“当今社会最有前途!最值得学习的语言!”》让我们来了解一下这是什么样的一种语言!
- 第二十二篇(网络编程) :《据说是:“当今社会最有前途!最值得学习的语言!”》让我们来了解一下这是什么样的一种语言!
- 学习Python语言,需要先了解一下Python有什么优缺点?
- 以学习的身份使用一种语言完成工作是否值得?目标:从文件中分割多个章节
- 大家了解纸箱包装设备吗?下面让我们一起学习一下吧!
- 很多人都患有一种毛病,将自己看得过高,自认样样都最好,而别人则个个不如自己,唯有自己看得较顺眼,这是非常错误的,因世上每个人都有些优点值得我们学习。因此我们必须“取他人之长。补自己之短”这样才能在从事涉及人事复杂的销售生意时更加胜任,更加愉快!
- 据说程序员是最爱学习的群体,IT男都知道,这个行业日新月异,必须不断地学习新知识,不断地为自己注入新鲜的血液,才能使自己跟上技术的步伐。 今天我们来讲一下Android中BroadcastReceiv
- PLC编程的5种专用语言 ,学习PLC编程得先了解一下!
- 值得关注的10个Python语言学习博客
- 最值得阅读学习的 10 个 C 语言开源项目代码
- GEF -- 学习一下调色板,我们不知道的东西(三)影子武士Tracker
- Spring AOP详解 一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博
- 【一个不错的oracle数据库诊断例子,值得学习一下】Oracle数据库诊断案例-redo log日志组处于高激活状态
- 世界需要一种什么样的语言?