• JAVA_多态(面向对象进阶)学习笔记


    目录

    多态的概述

    多态成员访问特点

    多态下的类型转换

    案例


    多态的概述

    同类型的对象,执行同一行为,会表现出不同的特征。

    java中多态的形式

    1. 父类类型 对象名称 = new 子类构造器;
    2. 接口 对象名称 = new 实现类构造器;

    如下包中:

    test为测试类、A为父类、Son1为第一个子类、Son2为第二个子类

     

     

    1. public abstract class A {
    2. abstract void run(); //用抽象方法写了一个run方法
    3. }
    1. public class Son1 extends A {
    2. @Override
    3. void run() {
    4. System.out.println("跑起来了");
    5. }
    6. }
    1. public class Son2 extends A{
    2. @Override
    3. void run() {
    4. System.out.println("跑不动——");
    5. }
    6. }
    1. //演示的重点还是那句话:
    2. //多态:同类型的对象,执行同一行为,会表现出不同的特征。
    3. public class test {
    4. public static void main(String[] args) {
    5. A a = new Son1();
    6. a.run();
    7. A b = new Son2();
    8. b.run();
    9. }
    10. }

    多态成员访问特点

    方法调用编译看左边,运行看右边。

    如:

    1. A a = new Son1();
    2. a.run();

     编译时先看A中有没有run方法 
     有run方法然后就执行Son1中的所编写的run方法的内容

    变量调用编译看左边,运行也看左边。

    如:

    在父类A类中定义一个叫name的变量

    public String name = "路飞"

    然后在test测试类中访问 

    1. A a = new Son1();
    2. System.out.println( a.name);

    所访问出的都是父类中的变量

    多态使用的前提:

    有继承/实现关系;有父类引用指向子类对象;有方法重写(多态侧重行为多态)

     

    多态的优势:

    在多态形式下,右边对象可以实现解耦合,便于扩展和维护。

    随对象变化而彼变化,无需修改主要代码

    定义方法的时候,使用父类型作为参数,该方法就可以接收这父类的一切子类对象,体现出多态的扩展性与便利。

     

    *注意:

    多态下不能访问子类的独有功能

    多态下的类型转换

    自动类型转换(从子到父):

     A a = new Son1();

    强制类型转换(从父到子)  可以转换成真正的子类类型,从而调用子类独有功能。

    子类 对象变量 = (子类)父类类型的变量
    
    1. A a = new Son1();
    2. Son1 c = (Son1)a;
    3. c.run();

    作用:可以解决多态下的劣势,可以实现调用子类独有的功能。

    注意: 有继承/实现关系的类就可以在编译阶段进行强制类型转换;但是,如果转型后的类型和对象真实对象的类型不是同一种类型,那么在运行代码时,就会出现ClassCastException

    Java建议强转转换前使用instanceof判断当前对象的真实类型,再进行强制转换 

    变量名 instanceof 真实类型
    

     判断关键字左边的变量指向的对象的真实类型,是否是右边的类型或者是其子类类型,是则返回true,反之。

    1. //使用instanceof判断当前对象的真实类型,再进行强制转换
    2. A a = new Son1();
    3. if (a instanceof Son1){ // 对象变量名 instanceof 真实类型
    4. Son1 s = (Son1) a;
    5. s.eat(); //调用 Son1 中的方法对象
    6. }else if(a instanceof Son2){
    7. Son2 s = new Son2();
    8. s.sit(); //调用 Son2 中的方法对象
    9. }

    强制类型转换需要注意

    有继承关系/实现的2个类型就可以进行强制转换,编译无问题。

    运行时,如果发现强制转换后的类型不是对象真实类型则报错(ClassCastException)

    案例

    模拟开发一款动物表演类的游戏

    思路:

    1. 定义一个USB的接口(申明USB设备的规范必须是:可以接入和拔出)。
    2. 提供2个USB实现类代表鼠标和键盘,让其实现USB接口,并分别定义独有功能。
    3. 创建电脑对象,创建2个USB实现类对象,分别安装到电脑中并触发功能的执行

    在USB包中 USB为公共接口、Computer为电脑对象类、KeyBorad为键盘类对象、Mouse为鼠标类对象、test为测试类

     

    1. //usb接口规范
    2. public interface USB {
    3. //接入
    4. void connet();
    5. //拔出
    6. void unconnet();
    7. }
    1. public class Computer {
    2. private String name;
    3. public void start(){
    4. System.out.println("开机————");
    5. }
    6. public String getName() {
    7. return name;
    8. }
    9. public void setName(String name) {
    10. this.name = name;
    11. }
    12. public Computer(String name) {
    13. this.name = name;
    14. }
    15. //提供USB安装入口
    16. public void installUSB(USB usb){
    17. //多态 USB 可能是鼠标也可能是键盘
    18. usb.connet(); //接入
    19. //调用独有功能 先判断后强转类型
    20. if (usb instanceof KeyBoard){
    21. KeyBoard k = (KeyBoard)usb;
    22. k.print();
    23. }else if (usb instanceof Mouse){
    24. Mouse m = (Mouse)usb;
    25. m.open();
    26. }
    27. usb.unconnet(); //拔出
    28. }
    29. }
    1. public class Mouse implements USB{
    2. private String name ;
    3. public Mouse(String name) {
    4. this.name = name;
    5. }
    6. public String getName() {
    7. return name;
    8. }
    9. public void setName(String name) {
    10. this.name = name;
    11. }
    12. public void open(){
    13. System.out.println("打开——————");
    14. }
    15. @Override
    16. public void connet() {
    17. System.out.println(name+"鼠标成功连接电脑");
    18. }
    19. @Override
    20. public void unconnet() {
    21. System.out.println(name+"鼠标拔出");
    22. }
    23. }
    1. public class test {
    2. public static void main(String[] args) {
    3. //创建电脑对象
    4. Computer c = new Computer("神舟");
    5. c.start();
    6. //创建键盘对象 鼠标对象
    7. USB a = new KeyBoard("惠普");
    8. c.installUSB(a);
    9. USB b = new Mouse("罗技");
    10. c.installUSB(b);
    11. }
    12. }

     执行效果

     

  • 相关阅读:
    MySQL 教程 1.1
    Java后端使用POST请求向mysql中插入Json数据的问题
    如何将C/C++代码转成webassembly
    Java和JavaScript区别与联系
    linux上 more 和 cat 区别
    17. 如何通过 SAP ABAP OData $expand 操作在同一个 HTTP 请求中返回多个节点的数据
    10.STM32外部中断实验
    题目 1059: 二级C语言-等差数列
    python LeetCode 刷题记录 28
    Vue | Vue.js 基础 模版语法
  • 原文地址:https://blog.csdn.net/dafsq/article/details/125467622