多态的概述
面向对象的三大特征:封装性,继承性。多态性
extends继承或者implements实现,是多态性的前提

多态的格式与使用

package demo05;
/*
代码当中体现多态性,其实就是一句话,父类当中引用指向子类对象
格式:父类名称 对象名 = new 子类名称();
或者:
接口名称 对象名称 = new 实现类名称();*/
public class Demo01Multi {public static void main(String[] args) {//使用多态的写法//左侧父类的引用,指向了右侧子类的对象Fu obj = new Zi();obj.method();obj.methodFu();}}
package demo05;public class Fu {public void method() {System.out.println("父类方法!");}public void methodFu() {System.out.println("父类特有方法!");}
}
package demo05;public class Zi extends Fu{@Overridepublic void method() {// TODO Auto-generated method stubsuper.method();System.out.println("子类方法!");}}

多态中成员变量的使用特点

package demoo05;/*
访问成员变量的两种方式:1、直接通过对象名称访问成员变量,看等号左边是谁,优先用谁,没有则向上找
2、间接通过成员方法访问成员变量,看该方法属于谁,则优先用谁,没有则向上找*/
public class Demo01MultiField {public static void main(String[] args) {//使用多态的写法,父类引用指向子类对象Fu obj = new Zi();System.out.println(obj.num);//错误写法
//      System.out.println(obj.age);System.out.println("=====================");//子类没有覆盖重写,就是fu,10//子类如果覆盖重写,就是子,20obj.showNum();}}
package demoo05;public class Fu /*extends Object*/{int num = 10;public void showNum() {System.out.println(num);}
}
package demoo05;public class Zi extends Fu{int num = 20;int age = 16;@Overridepublic void showNum() {// TODO Auto-generated method stubsuper.showNum();System.out.println(num);}
}

多态中成员方法的使用特点

package demoo05;/*
在多态的代码当中,成员方法的访问规则是;
看new的是谁,就优先用谁,没有则向上找注意:编译看左边,运行看右边对比一下:
成员变量:编译看左边,运行还看右边
成员方法:编译看左边,运行看右边*/
public class Demo02MultiMethod {public static void main(String[] args) {Fu obj = new Zi();//多态obj.method();//父子都有,优先用子obj.methodFu();//子类没有,父类有,向上找到父类//编译看左,左边是Fu,Fu当中没有method方法,所以编译报错。//     obj.methodZi();//错误写法!}
}
package demoo05;public class Fu /*extends Object*/{int num = 10;public void showNum() {System.out.println(num);}public void method() {System.out.println("父类方法!");}public void methodFu() {System.out.println("父类特有方法!");}}
package demoo05;public class Zi extends Fu{int num = 20;int age = 16;@Overridepublic void showNum() {// TODO Auto-generated method stubsuper.showNum();System.out.println(num);}@Overridepublic void method() {System.out.println("子类方法!");}public void methodZi() {System.out.println("子类特有方法!");}
}

使用多态的好处

对象的向上转型

package demoo05;public abstract class Animal {public abstract void eat();}
package demoo05;public class Cat extends Animal{@Overridepublic void eat() {// TODO Auto-generated method stubSystem.out.println("猫吃鱼!");}}
package demoo05;public class Demo01Main {public static void main(String[] args) {// TODO Auto-generated method stub//对象的向上转型,就是,父类引用指向子类对象Animal animal = new Cat();animal.eat();}}

对象的向下转型

package demoo05;public abstract class Animal {public abstract void eat();}
package demoo05;public class Cat extends Animal{@Overridepublic void eat() {// TODO Auto-generated method stubSystem.out.println("猫吃鱼!");}//子类特有方法public void catchMouse() {System.out.println("猫抓老鼠");}}
package demoo05;public class Dog extends Animal{@Overridepublic void eat() {// TODO Auto-generated method stubSystem.out.println("狗吃SHI");}public void watchHouse() {// TODO Auto-generated method stubSystem.out.println("狗看家");}}
package demoo05;/*
向上转型一定是安全的,没有问题的,正确的。但是也有一个弊端对象一旦向上转型为父类,那么就无法调用子类原本特有的内容解决方案:用对象的向下转型还原*/
public class Demo01Main {public static void main(String[] args) {// TODO Auto-generated method stub//对象的向上转型,就是,父类引用指向子类对象Animal animal = new Cat();//本来创建的时候是一只猫animal.eat();//猫吃鱼//animal.catchMouse();//错误写法!//向下转型,进行还原动作Cat cat = (Cat)animal;cat.catchMouse();//猫抓老鼠//下面是错误的向下转型//本来new的时候就是一只猫,现在非要当作狗Dog dog = (dog)animal;//类转换异常}}

用instanceof关键字进行

package demoo05;/*
如何才能知道一个父类引用的对象,本来是什么子类?格式:
对象 instanceof 类名称
这将会得到一个Boolean值结果,也就是判断前面的对象能不能当做后面类型的实例*/
public class Demo02Instanceof {public static void main(String[] args) {Animal animal = new Dog();//本来是一只狗animal.eat();//狗吃shit//如果希望调用子类特有方法,需要向下转型,//判断一下父类引用animal本来是不是Dogif(animal instanceof Dog) {Dog dog = (Dog)animal;dog.watchHouse();}//判断一下animal本来是不是Catif(animal instanceof Cat) {Cat cat = (Cat)animal;cat.catchMouse();}giveMeAPet(new Dog());}public static void giveMeAPet(Animal animal) {if(animal instanceof Dog) {Dog dog = (Dog)animal;dog.watchHouse();}if(animal instanceof Cat) {Cat cat = (Cat)animal;cat.catchMouse();}}
}
package demoo05;public class Dog extends Animal{@Overridepublic void eat() {// TODO Auto-generated method stubSystem.out.println("狗吃SHI");}public void watchHouse() {// TODO Auto-generated method stubSystem.out.println("狗看家");}}
package demoo05;public class Cat extends Animal{@Overridepublic void eat() {// TODO Auto-generated method stubSystem.out.println("猫吃鱼!");}//子类特有方法public void catchMouse() {System.out.println("猫抓老鼠");}}
package demoo05;public abstract class Animal {public abstract void eat();}

笔记本USB接口案例分析


笔记本USB接口案例实现

package demo07;public class DemoMain {public static void main(String[] args) {//首先创建一个笔记本电脑Computer computer = new Computer();computer.powerOn();//准备一个鼠标,供电脑使用
//      Mouse mouse = new Mouse();//首先进行向上转型USB usbMouse = new Mouse();//参数是USB类型,我正好传递进去的就是USB鼠标computer.useDevice(usbMouse);//创建一个USB键盘Keyboard keyboard = new Keyboard();//没有使用多态写法//方法参数是USB类型,传递进去的是实现类对象computer.useDevice(keyboard);//正确.也发生了向上转型//使用子类对象匿名对象也是可以的
//      computer.useDevice(new Keyboard());//也是正确写法computer.powerOff();System.out.println("===========================");method(10.0);//正确写法,double---->doublemethod(20);//正确写法,int -------------->doubleint a = 30;method(a);//正确写法,int-->double}public static void method(double num) {System.out.println(num);}
}
package demo07;public class Computer {public void powerOn() {System.out.println("笔记本电脑开机");}public void powerOff() {System.out.println("笔记本电脑关机");}//使用USB设备的方法,使用接口作为方法的参数public void useDevice(USB usb) {usb.open();//打开设备if(usb instanceof  Mouse) {//一定要先判断Mouse mouse = (Mouse) usb;//向下转型mouse.click();}else if(usb instanceof Keyboard) {//先判断Keyboard keyboard = (Keyboard) usb;//向下转型keyboard.type();}usb.close();//关闭设备}
}
package demo07;//键盘就是一个USB设备
public class Keyboard implements USB{@Overridepublic void open() {// TODO Auto-generated method stubSystem.out.println("打开键盘");}@Overridepublic void close() {// TODO Auto-generated method stubSystem.out.println("关闭键盘");}public void type() {System.out.println("键盘输入");}
}
package demo07;//鼠标就是一个USB设备
public class Mouse implements USB{@Overridepublic void open() {// TODO Auto-generated method stubSystem.out.println("打开鼠标");}@Overridepublic void close() {// TODO Auto-generated method stubSystem.out.println("关闭鼠标");}public void click() {System.out.println("鼠标点击");}
}
package demo07;public interface USB {public abstract void open();//打开设备public abstract void close();//关闭设备
}

Java语言高级-02继承与多态-第4节 多态相关推荐

  1. Java语言高级-02继承与多态-第7节内部类

    内部类的概念和分类 如果一个事物的内部包含另一个事物,那么这就是一个类内部包含另一个类 例如:身体和心脏的关系.又如:汽车和发动机的关系. 分类: 1.成员内部类 2.局部内部类(包含匿名内部类) 成 ...

  2. 《Java语言高级特性(阿里云大学)》笔记 第7~14章 类库+正则+国际化+比较器(文档+思维导图)

    课程链接:https://edu.aliyun.com/course/1012 第1~6章 关于线程:https://blog.csdn.net/weixin_43494837/article/det ...

  3. java语言类间继承关系是,Java语言类间的继承关系是(    )。

    Java语言类间的继承关系是(    ). 更多相关问题 [判断题] 持有OPEN票的游客不需要机票的确认,可直接按票面时间去机场乘坐飞机.() [填空题] 导游服务性质是().().().().() ...

  4. java语言基础02

    一.Java语言基础(常量的概述和使用)(掌握) 1:什么是常量 就是在程序的执行过程中其值不发生改变的量. 2:Java中常量的分类 (1):字面值常量 (2):自定义常量(面向对象部分讲解) 3: ...

  5. Java语言高级(第一部分)常用API 继承与多态 ->(个人学习记录笔记)

    文章目录 第一章 常用API 1. API概述和使用 2. Scanner概述及其API文档 2.1 什么是Scanner类 2.2 引用类型使用步骤 2.3 练习:键盘输入两数字求和 2.4 练习 ...

  6. Java语言高级(第四部分)File类与IO流 ->(个人学习记录笔记)

    文章目录 第六章 File类与IO流 1. File类 1.1 概述 1.2 构造方法 1.3 常用方法 获取功能的方法 绝对路径和相对路径 判断功能的方法 创建删除功能的方法 1.4 目录的遍历 2 ...

  7. java语言中的 继承_Java语言有关继承的总结

    一.继承 1.继承的概念 继承机制是面向对向程序设计不可缺少的关键概念,是实现软件可重用的根基,是提高软件系统的可扩张性与可维护性的主要途径.(它允许创建分等级层次的类). 继承是指一个类的定义可以基 ...

  8. 零基础java自学流程-Java语言高级577

    HTTP Request header 使用Fiddler 能很方便的查看Reques header, 点击Inspectors tab ->Request tab-> headers  ...

  9. 零基础java自学流程-Java语言高级369

    //存放矩阵每行的查找结果 public class Result {private int data[];public Result(int size) {data=new int[size];}p ...

最新文章

  1. vim 用次数做简单的算术运算(笔记)
  2. python调用ansysworkbench_Workbench通过Python设定材料参数
  3. 容器编排技术 -- Kubernetes kubectl autoscale 命令详解
  4. 取出客户端卸载CKEditor中的内容,放入数据库中的方案
  5. java io类filereader,39. Java IO: FileReader
  6. ubuntu 16.04 + zabbix 3.4 + postgresql libzbxpgsql
  7. 首个完全武器化的 Spectre Exploit 现身
  8. 思考题2(人车关系)
  9. pygame精灵组有哪些方法_利用 pygame 开发一款游戏:「跳跳兔」(六)
  10. Mozilla Thimble,在线html,javascript编辑器
  11. GEE学习笔记3:Landsat8 植被指数计算
  12. 随着无人机将承担更多的作战任务,“AI辅助空战”或将应运而生
  13. 【技术讨论】从弹弹堂说起,如何用2D物理引擎编写一个游戏一2011-11-05 10:36...
  14. linux分区btrfs,系统基础之Btrfs文件系统详解
  15. 《Java语言程序设计与数据结构》编程练习答案(第七章)(一)
  16. 3.21 华丽丽的颜色渐变工具 [原创Ps教程]
  17. 光猫+路由器双工配置
  18. 人——Web3的新平台
  19. 广积粮筑高墙缓称王[写给求职的刚毕业的]
  20. 敬业签苹果ios手机便签里的完成记录如何筛选查看

热门文章

  1. Codeforces847M Weather Tomorrow
  2. 小猫爪:i.MX RT1050学习笔记20-安全启动4-实现HAB签名和HAB加密
  3. 如何与不使用Apple产品的朋友共享iCloud照片
  4. pandas数据分析基础之时间序列
  5. Ubuntu 18.04 更换最优软件更新源
  6. Kubernetes在宜信落地实践
  7. HTML5 canvas 瀑布流文字 (骇客帝国效果)
  8. NET Core 模板项目 - NuGet
  9. Credit Card Fraud Detection(信用卡欺诈检测相关数据集)
  10. 使用Feed43为网页生成RSS订阅源