1. 基础知识

多态:子类对象的多种父类形态;也就是把子类对象当做父类来使用,会丧失一些功能。

多态引用:子类对象赋值于父类类型的引用变量,父类类型的引用指向子类对象。例如Person P = new Chinese();多态引用中子类的特有成员/方法不可以访问

编译时类型(等号左边) 与  运行时类型(等号右边) 不一致,就出现了多态。

虚拟方法调用*****:当使用多态时,Person P = new Chinese();,多态引用P调用覆盖方法时,编译时会调用父类方法,而在运行时,会调用子类的重写方法。编译时编译器检查父类中是否有这个方法,编译通过后,在运行时会执行子类的重写方法。父类中的方法不执行,但又必须存在,所以称为虚拟方法,唯一作用是骗过编译器。

多态绑定:运行时运行谁的方法是不确定的,取决于右边所new出来的对象实体。

2. 代码测试

测试过程:创建父类Person,子类Chinese、American,BeiJing,其中Chinese、American继承Person类,BeiJing类继承Chinese类,并提供给三个类特有的属性和方法,最后在PersonTest类中完成多态的测试。

package com.hike.javase.polymophysm;public class Person {private String name;private int age;private String gender;public Person() {}public Person(String name, int age, String gender) {super();this.name = name;this.age = age;this.gender = gender;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public String say() {return "姓名:" + name + ",年龄" + age + ",性别:"+ gender;}public void sayHello() {      //虚拟方法,不执行的方法,但必须存在System.out.println("打个招呼");}
}package com.hike.javase.polymophysm;/** 子类继承父类所有成员,不包括构造器*/
public class Chinese extends Person{private String shuXiang;public Chinese() {super();}public Chinese(String name, int age, String gender,String shuXiang) {super(name, age, gender);this.shuXiang = shuXiang;}public String getShuXiang() {return shuXiang;}public void setShuXiang(String shuXiang) {this.shuXiang = shuXiang;}@Overridepublic String say() {return super.say() + ",属相:" + shuXiang;}@Overridepublic void sayHello() {System.out.println("吃了吗?");}public void spring() {System.out.println("中国人民过大年");}
}package com.hike.javase.polymophysm;public class BeiJing extends Chinese{public BeiJing() {super();}public BeiJing(String name, int age, String gender, String shuXiang) {super(name, age, gender, shuXiang);}@Overridepublic void sayHello() {System.out.println("吃了吗您呐?");}}package com.hike.javase.polymophysm;public class American extends Person{private boolean hasGun;public American() {super();}public American(String name, int age, String gender,boolean hasGun) {super(name, age, gender);this.hasGun = hasGun;}public boolean isHasGun() {return hasGun;}public void setHasGun(boolean hasGun) {this.hasGun = hasGun;}@Overridepublic String say() {return super.say() + ",是否有枪:" + hasGun;}@Overridepublic void sayHello() {System.out.println("How are you?");}public void christmas() {System.out.println("merry christmas!");}
}package com.hike.javase.polymophysm;public class PersonTest {//    多态参数方法:参数是父类类型,可以接受其子类类型public static void test(Person p) {p.sayHello();
//      使用子类特有方法必须使用强转类型语句,强转有风险,强转前要判断
//      判断左侧的引用是否是右侧类型的实例,是返回true
//      是北京人一定是中国人,中国人不一定是北京人,所以要将范围最小的子类优先判断if(p instanceof BeiJing){((BeiJing)p).spring();}else if(p instanceof Chinese) {Chinese ch = (Chinese)p;ch.spring();}else if(p instanceof American) {((American)p).christmas();//.的优先级最高,先完成强转,再调用特有方法}else{System.out.println("普通人类");}}
//  多态参数方法,提高兼容性public static void main3(String[] args) {Person p = new Person("王五",16,"男");Person pCh = new Chinese("张三",20,"男","鼠");Person pBj = new BeiJing("李四",15,"女","牛");Person pAm = new American("lisa",32,"male",true);test(p);test(pCh);test(pBj);test(pAm);}
//  多态的应用:多态数组public static void main2(String[] args) {
//      创建一个数组,存储不同类型的对象,需要用到多态Person[] arr = new Person[4];arr[0] = new Person("王五",16,"男");arr[1] = new Chinese("张三",20,"男","鼠");arr[2] = new BeiJing("李四",15,"女","牛");arr[3] = new American("lisa",32,"male",true);System.out.println("##########1.say()方法与sayHello()方法的调用##########");for(Person temp : arr) {System.out.println(temp.say());temp.sayHello();}System.out.println("##########2.按照年龄大小排序##########");for(int i = 0; i < arr.length; i++) {for(int j = 0; j < arr.length - i - 1; j++) {if(arr[j].getAge() > arr[j + 1].getAge()) {Person temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}for(Person temp : arr) {System.out.println(temp.say());}System.out.println("##########3.按照年龄大小排序(选择排序)##########");for(int i = 0; i < arr.length; i++) {int minIndex = i;for(int j = i + 1; j < arr.length; j++) {if(arr[j].getAge() < arr[minIndex].getAge()) {minIndex = j;}}Person temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}for(Person temp : arr) {System.out.println(temp.say());}}
//  多态基本使用方法public static void main1(String[] args) {Person p = new Person("王五",16,"男");p.sayHello();Person pCh = new Chinese("张三",20,"男","鼠");
//      通过多态引用调用虚拟方法pCh.sayHello();             Person pBj = new BeiJing("李四",15,"女","牛");pBj.sayHello();Person pAm = new American("lisa",32,"male",true);pAm.sayHello();}
}

java基础[多态基础,多态数组,多态参数方法]相关推荐

  1. java 申请不定长度数组_java中申请不定长度数组ArrayList的方法

    如下所示: import java.util.ArrayList; //java中申请不定长度数组 public class Test01 { public static void main(Stri ...

  2. java数组的长度不确定怎么办_java中申请不定长度数组ArrayList的方法

    如下所示: import java.util.arraylist; //java中申请不定长度数组 public class test01 { public static void main(stri ...

  3. Java基础篇——三大特性(多态)

    这是Java三大特性的最后一篇文章,本篇主要讲解多态的概念和应用.如果是对Java有兴趣的小伙伴可以关注一下,后续会推出一系列的Java基础和进阶的总结(或者说是个人的理解吧!)可以让你学到一些基础但 ...

  4. JavaSE基础知识(十八)--Java多态之向上转型(多态初步)

    Java SE 是什么,包括哪些内容(十八)? 本文内容参考自Java8标准 再次感谢Java编程思想对本文的启发! 开篇一句很重要的话:在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种 ...

  5. java基础知识(一)--多态

    什么是多态? 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消息做出不同的响应 ...

  6. Python|装饰器|执行时间|递归|动态属性|静态方法和类|继承和多态|isinstance类型判断|溢出|“魔法”方法|语言基础50课:学习记录(6)-函数的高级应用、面向对象编程、进阶及应用

    文章目录 系列目录 原项目地址: 第16课:函数的高级应用 装饰器(记录执行时间的例子) 递归调用 简单的总结 第17课:面向对象编程入门 类和对象 定义类 创建和使用对象 初始化方法 打印对象 面向 ...

  7. [.net 面向对象编程基础] (13) 面向对象三大特性——多态

    [.net 面向对象编程基础] (13) 面向对象三大特性--多态 前面两节,我们了解了面向对象的的封装和继承特性,面向对象还有一大特性就是多态.比起前面的封装和继承,多态这个概念不是那么好理解.我们 ...

  8. C++基础之三大特性之多态(顾客,别走啊,我这是羊肉,不是狗肉啊)

    多态:多种形态 举个例子,你有两个fun函数,第一个类中fun的功能是打印1,第二个类的fun的功能是打印2,你建一个类的对象,调fun,想打印1就能打印1,想打印2就能打印2,这就是多态,这就是多种 ...

  9. Java面向对象三大特性(封装继承多态)解释及案例

    文章目录 包 包基本语法 命名规则 命名规范 导入包实例 访问修饰符 面向对象编程-封装 面向对象编程-继承 super关键词 super和this的比较 方法重写/覆盖 (override) 注意事 ...

  10. Java继承_Hachi君浅聊Java三大特性之 封装 继承 多态

    Hello,大家好~我是你们的Hachi君,一个来自某学院的资深java小白.最近利用暑假的时间,修得满腔java语言学习心得.今天小宇宙终于要爆发了,决定在知乎上来一场根本停不下来的Hachi君个人 ...

最新文章

  1. [ python ] 类的组合
  2. 浅谈 EHT 黑洞照片拍摄原理
  3. “java程序打成jar包 如何处理第三方jar包”
  4. 《网易编程题》分苹果
  5. java.lang.OutOfMemoryError:GC overhead limit exceeded
  6. C#并发编程之异步编程(一)
  7. myeclipse8.5 离线装SVN
  8. 解决子元素和父元素同时触发onclick
  9. 几步教你用 Python 制作一个 RPA 机器人!
  10. c++低通数字滤波器_快速扫盲之一阶RC低通数字滤波器算法实现
  11. python中await async_asyncio中的async和await
  12. 计算机组成王道考研ppt,2022计算机408考研-计算机组成原理课件-第一章.pdf
  13. 分布式事务处理【TX-LCN】
  14. 荣耀8桌面添加计算机,华为荣耀手机如何添加快捷开关到快捷功能界面中
  15. 程序设计基础课程设计——学生成绩管理程序
  16. spack Bootstrapping Mirrors
  17. 【新书推荐】【2019】基于Kronecker积波束形成的阵列处理
  18. [译]不再对 MVVM 感到绝望
  19. 10005---CSS语法
  20. OSChina 周二乱弹 ——快晒晒你们公司的圣诞小姐姐啊!

热门文章

  1. 2021年中国传统文化锦集(中国人必须了解的)
  2. 主数据系统的设计与实现
  3. 激荡四十年,中国企业家群画像
  4. Win10切换虚拟桌面
  5. Kylin使用Spark构建Cube
  6. 电脑键盘部分按键失灵_笔记本键盘个别按键失灵怎么处理win10
  7. 计算机推免资源(不定期更新)
  8. Vue图片切换过渡设计
  9. 计算机保存文件夹纵向排序,文件夹怎么自己排序,文件夹里怎么排序
  10. 重复独立事件,伯努利概型 (概统1)