栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

[Java笔记11] 面向对象5(多态、内部类)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[Java笔记11] 面向对象5(多态、内部类)

目录

多态

多态的常见形式

多态下引用数据类型的类型转换

内部类

静态内部类

成员内部类

局部内部类

匿名内部类


视频教程传送门 -> https://www.bilibili.com/video/BV1Cv411372m?p=109

多态

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

多态的常见形式

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

多态的前提:
有继承/实现关系;有父类引用指向子类对象;有方法重写

多态中成员访问特点:
方法调用 -> 编译看左边,运行看右边。(多态侧重行为多态)
变量调用 -> 编译、运行都看左边。

优势:
在多态形式下,右边对象可以实现解耦合,便于扩展和维护。
定义方法的时候,使用父类型作为参数,该方法就可以接收这父类的一切子类对象。

问题:
多态下不能使用子类的独有功能  => 通过强制类型转换解决

多态下引用数据类型的类型转换

自动类型转换(从子到父):子类对象赋值给父类类型
强制类型转换(从父到子)
此时必须进行强制类型转换:子类 对象变量 = (子类)父类类型的变量

强制类型转换

- 可以转换成真正的子类类型,从而调用子类独有功能
- 有继承关系/实现的2个类型就可以进行强制转换,编译无问题
- 运行时,如果发现强制转换后的类型不是对象真实类型则报错
  类型转换异常:ClassCastException

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

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

【例】电脑USB接入功能,USB可以是多种设备          

需求:
设计一个电脑对象,可以安装2个USB设备
鼠标 -> 被安装时可以完成接入、调用点击功能、拔出功能
键盘 -> 被安装时可以完成接入、调用打字功能、拔出功能
分析:
定义一个USB的接口(申明USB设备的规范必须是:可以接入和拔出)-> USB.java
提供2个USB实现类代表鼠标(KeyBoard.java)和键盘(Mouse.java),让其实现USB接口,并分别定义独有功能
创建电脑对象(Computer.java),创建2个USB实现类对象,分别安装到电脑中并触发功能的执行

接口 USB.java

package com.itheima.d4_polymorphic_test;

public interface USB {
    void connect();
    void unconnect();
}

实现类 KeyBoard.java

package com.itheima.d4_polymorphic_test;


public class KeyBoard implements USB{
    private String name;

    public KeyBoard(String name) {
        this.name = name;
    }

    @Override
    public void connect() {
        System.out.println(name + "成功接入设备");
    }

    @Override
    public void unconnect() {
        System.out.println(name + "成功弹出设备");
    }

    
    public void keyDown(){
        System.out.println(name + "今天你的鲨鱼干嘛了>OO<");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

实现类 Mouse.java

package com.itheima.d4_polymorphic_test;


public class Mouse implements USB{
    private String name;

    public Mouse(String name) {
        this.name = name;
    }

    @Override
    public void connect() {
        System.out.println(name + "成功接入设备");
    }

    @Override
    public void unconnect() {
        System.out.println(name + "成功弹出设备");
    }

    
    public void click(){
        System.out.println(name + "一键三连~~~");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Comupter.java 提供安装USB的入口(定义了一个方法installUSB)

package com.itheima.d4_polymorphic_test;

public class Computer {
    
    public void installUSB(USB u){
        u.connect();

        // 独有功能
        if(u instanceof Mouse){
            Mouse m = (Mouse) u;
            m.click();
        }else if(u instanceof KeyBoard) {
            KeyBoard k = (KeyBoard) u;
            k.keyDown();
        }

        u.unconnect();
    }
}

测试类 Test.java

package com.itheima.d4_polymorphic_test;


public class Test {
    public static void main(String[] args) {
        // a、创建电脑对象
        Computer c = new Computer();

        // b、创建USB设备对象
        USB u = new Mouse("罗技鼠标");
        c.installUSB(u);
        System.out.println("----------------");
        USB k = new KeyBoard("CHERRY键盘");
        c.installUSB(k);
    }

}

输出:

内部类

内部类就是定义在一个类里面的类,里面的类可以理解成(寄生),外部类可以理解成(宿主)。

静态内部类

格式:外部类名.内部类名 对象名 = new 外部类名.内部类构造器;

特点、使用与普通类是一样的,类有的成分它都有,只是位置在别的类里面。
可以直接访问外部类的静态成员,不能直接访问外部类的实例成员。


成员内部类

格式:外部类名.内部类名 对象名 = new 外部类构造器.new 内部类构造器();
例如:Outer.Inner in =  new Outer().new  Inner();

无static修饰,属于外部类的对象。
可以直接访问外部类的静态成员,实例方法中可以直接访问外部类的实例成员。

在成员内部类中访问所在外部类对象 ,格式:外部类名.this

局部内部类

放在方法、代码块、构造器等执行体中。
 

匿名内部类

格式:
new 类|抽象类名|或者接口名() {
    重写方法;
};

特点:
匿名内部类是一个没有名字的内部类。
匿名内部类写出来就会产生一个匿名内部类的对象。
匿名内部类的对象类型相当于是当前new的那个的类型的子类类型。

Animal a = new Animal() {
    public void run() {
      System.out.println("鲨鲨游啊游");
    }
};
a. run();

作用:方便创建子类对象,最终目的为了简化代码编写。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/584200.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号