Java语言进阶 #继承&多态 #Day10 #接口 #多态 #USB接口实现 #向上转型 #编译看左,运行看右

文章目录

  • 一、接口
    • 1. 接口的定义基本格式
    • 2. 接口的抽象方法定义
    • 3. 接口的实现
    • 4. 接口的默认方法定义
    • 5. 接口的静态方法定义
    • 6. 接口的私有方法定义
    • 7. 接口的常量
    • 8. 接口和类的区别
  • 二、多态
    • 1. 多态的实现
    • 2. 多态的特点
    • 3. 编译看左,运行看右
    • 4. 多态的好处
    • 5. 向上转型
    • 6. 向下转型
    • 7. 注意
  • Test:USB接口
    • 1. 需求分析
    • 2. USB接口实现
    • 3. 电脑类
    • 4. 鼠标类/键盘类
    • 5. 运行

一、接口

接口,就是一种公共的规范标准
只要符合规范标准,就可以大家通用。

1. 接口的定义基本格式

接口就是多个类的公共规范
接口是一种引用数据类型,最重要的内容是其中的:抽象方法

public interface 接口名称 {
	// 接口内容
}

注: 换成了interface之后,编译生成的字节码文件仍然是.class文件

如果是java 7,那么接口中可以包括:

  1. 常量
  2. 抽象方法

如果是java 8,那么还可以额外包括:
3. 默认方法
4. 静态方法

如果是java 9,那么接口中可以包括:
5. 私有方法

2. 接口的抽象方法定义

  1. 输入文件名后,可以按↑↓来选择接口这一选项
    Java语言进阶 #继承&多态 #Day10 #接口 #多态 #USB接口实现 #向上转型 #编译看左,运行看右_第1张图片
  2. 输入抽象方法
    Java语言进阶 #继承&多态 #Day10 #接口 #多态 #USB接口实现 #向上转型 #编译看左,运行看右_第2张图片

注意:
1. 接口中的抽象方法,修饰符必须是两个固定的关键字public abstract
2. 这两个关键字可以省略其中一个,也可以都省略(推荐)。
3. 方法的三要素可以随便定义

3. 接口的实现

  1. 接口不能直接使用,必须有一个实现类 来实现该接口。
public class 实现类名称 implements 接口名称 {
}
  1. 接口的实现类必须覆盖重写(实现)接口中所有的抽象方法。
    Java语言进阶 #继承&多态 #Day10 #接口 #多态 #USB接口实现 #向上转型 #编译看左,运行看右_第3张图片

如果没有实现所有的抽象方法,那么这个就是一个抽象类。

  1. 创建实现类的对象进行使用
    Java语言进阶 #继承&多态 #Day10 #接口 #多态 #USB接口实现 #向上转型 #编译看左,运行看右_第4张图片

4. 接口的默认方法定义

默认方法,一般是用来进行接口升级 的,设想这样的场景:有一个接口已经投入了使用(有多个实现类,并且已经对象化),能继续添加抽象方法嘛?(添加了之后,所有的实现类,都必须添加实现方法哦)

public default 返回值类型 函数名称() {  // public可省略
	...
}

解决办法: 定义一个默认方法,这个默认方法会继承给实现类。
在这里插入图片描述
Java语言进阶 #继承&多态 #Day10 #接口 #多态 #USB接口实现 #向上转型 #编译看左,运行看右_第5张图片

  1. 接口的默认方法,可以通过接口的实现类对象,直接调用。
  2. 接口的默认方法,也可以被接口实现类,进行覆盖重写

5. 接口的静态方法定义

也是使用类名.直接调用

public static 返回值类型 方法名称(参数列表) {  // public可省略
	方法体
}

Java语言进阶 #继承&多态 #Day10 #接口 #多态 #USB接口实现 #向上转型 #编译看左,运行看右_第6张图片

6. 接口的私有方法定义

如果接口中多个方法中,有重复的方法,可以独立的封装出来,然后进行调用即可。而这个被调用的方法,它只是用来解决重复代码,而不希望被访问,所以应为私有方法。
Java语言进阶 #继承&多态 #Day10 #接口 #多态 #USB接口实现 #向上转型 #编译看左,运行看右_第7张图片
Java语言进阶 #继承&多态 #Day10 #接口 #多态 #USB接口实现 #向上转型 #编译看左,运行看右_第8张图片
解决方案:

  1. 普通私有方法: 解决多个默认方法间重复代码问题
private 返回值类型 方法名(参数列表) {
	...
}
  1. 静态私有方法: 解决多个静态方法间重复代码问题
private static 返回值类型 方法名(参数列表) {
	...
}

Java语言进阶 #继承&多态 #Day10 #接口 #多态 #USB接口实现 #向上转型 #编译看左,运行看右_第9张图片
Java语言进阶 #继承&多态 #Day10 #接口 #多态 #USB接口实现 #向上转型 #编译看左,运行看右_第10张图片

7. 接口的常量

接口中可以定义成员变量 ,但是必须使用public static final三个关键字进行修饰(在写法上可以省略)。从效果上看,这是一个【常量】
public(公共的);static(静态的);final(最终的,不可变的)

public static final 数据类型 常量名称 = 数据值;  // 必须赋值,不然报错

注意: 常量名使用 完全大写 和 下划线

在这里插入图片描述
Java语言进阶 #继承&多态 #Day10 #接口 #多态 #USB接口实现 #向上转型 #编译看左,运行看右_第11张图片

8. 接口和类的区别

  • 接口不能有静态代码块、不能有构造方法
  • 一个类只能有一个直接父类,但是可以有多个接口
public class 类名 implements 接口1, 接口2 {
    // 覆盖重写所有抽象方法;
}
  • 实现类需要覆盖重写所有抽象方法,如果多个接口抽象方法同名,实现一个就好(我妈叫我去吃饭,我爸叫我去吃饭,我只要吃了饭就可)
  • 如果同名的是默认方法,那么必须重写这个默认方法。
  • 如果直接父类的默认方法与接口默认方法同名,那么会用直接父类的默认方法。(继承优先接口实现

  • 类与类之间,是单继承 的,直接父类只有一个
  • 类与接口之间,是多实现 的,一个类可以实现多个接口
  • 接口与接口之间,是多继承

二、多态

多态的前提:extends或者implements
多态性: 菱形具有四边形形态,也具有图形形态(四边形类继承自图形类),这就是对象的多态性。

1. 多态的实现

父类引用指向子类对象

父类名称 对象名 = new 子类名称();
接口名称 对象名 = new 实现类名称();

2. 多态的特点

一只猫就是一只动物

动物 小花 = new();
  • 方法怎么使用呢?new的是猫,所以创建的是猫,会优先使用猫方法。这个前面讲过了。
  • 变量怎么使用呢?我们认为小花现在是作为动物的,所以它的属性是动物属性(成员变量是不能进行覆盖重写的)
  • 方法看右边new的是谁,变量看左边是谁。(前面也说过的,没有任何区别)

3. 编译看左,运行看右

成员变量:编译看左,运行看右

  • 父类有的方法,子类重写。编译看左,父类方法被编译。运行看右,子类重写方法被执行。
  • 父类有的方法,子类没有。编译看左,父类方法被编译。运行看右,子类没有该方法向上找。
  • 父类没有的方法,子类有。编译看左,编译不通过,报错。

成员变量:编译看左,运行还看左

  • 父类有的变量,子类不管有没有。编译看左,父类变量被编译。

4. 多态的好处

程序员要工作,管理者要工作,保洁要工作…作为老板,我管谁工作,只要都在工作就行。俗话说的好,“一类人就是™好管”,一个老板,思考如何让程序员工作,如何让管理者工作,如何让保洁工作,太掉价了。只要思考,如何让员工工作就行了。这就是多态的好处

  • 不使用多态的写法
程序员 小承 = new 程序员();
小承.工作();

管理者 关关 = new 管理者();
关关.工作();

保洁 老鸨 = new 保洁();
老鸨.工作();
  • 使用多态的写法(有没有发现清爽多了)
员工 小承 = new 程序员();
小承.工作();

员工 关关 = new 管理者();
关关.工作();

员工 老鸨 = new 保洁();
老鸨.工作();

5. 向上转型

多态就是向上转型(父类引用指向子类对象):比如把猫看作动物
向上转型一定是安全的 , 它是从小范围到大范围

// 类似自动类型转换
父类名 对象名 = new 子类名();

6. 向下转型

向下转型: 想让猫抓老鼠,可是现在把它看作了动物,动物不是都会抓老鼠的,怎么办?向下转型!
向下转型是一种【还原】

// 格式上类似强制类型转换
子类名 对象名 = (子类名) 父类对象名;  // 两个对象名可一致

为了安全,向下转型应该使用instanceof关键字。
如何确定动物向下转型是转型成还是转型成呢?

动物 instanceof;  // 返回一个布尔值,可以作为if条件判断

7. 注意

为什么这个函数,需要接受double类型,可是传入int,编译却通过了?因为发生了自动类型转换。
Java语言进阶 #继承&多态 #Day10 #接口 #多态 #USB接口实现 #向上转型 #编译看左,运行看右_第12张图片
我们之前说到,向上转型,就相当于自动类型转换。所以,当参数需要一个类(接口)时,可以传入它的子类或实现类(甚至匿名对象),会自动地向上转型。
Java语言进阶 #继承&多态 #Day10 #接口 #多态 #USB接口实现 #向上转型 #编译看左,运行看右_第13张图片

Test:USB接口

1. 需求分析

一台电脑,通过USB接口,连接鼠标和键盘

  • 电脑: USB母口(使用设备useDevice),开机powerOn,关机powerOff
  • 鼠标: USB公口,连接设备linkDevice,弹出设备popDevice,点击click
  • 键盘: USB公口,连接设备linkDevice,弹出设备popDevice,打字type

2. USB接口实现

定义一个抽象方法,作为USB协议,实现中国抽象方法表示同意协议
定义设备连接方法和弹出方法
Java语言进阶 #继承&多态 #Day10 #接口 #多态 #USB接口实现 #向上转型 #编译看左,运行看右_第14张图片

3. 电脑类

电脑需具备开关机功能
Java语言进阶 #继承&多态 #Day10 #接口 #多态 #USB接口实现 #向上转型 #编译看左,运行看右_第15张图片
电脑需能连接USB设备,并使用它(鼠标的点击方法,键盘的打字方法)
Java语言进阶 #继承&多态 #Day10 #接口 #多态 #USB接口实现 #向上转型 #编译看左,运行看右_第16张图片

4. 鼠标类/键盘类

鼠标/键盘需重写抽象方法,表示同意USB协议。鼠标有自己的点击方法,键盘有自己的打字方法(在电脑类已被调用)
Java语言进阶 #继承&多态 #Day10 #接口 #多态 #USB接口实现 #向上转型 #编译看左,运行看右_第17张图片
Java语言进阶 #继承&多态 #Day10 #接口 #多态 #USB接口实现 #向上转型 #编译看左,运行看右_第18张图片

5. 运行

编写运行文件(开机、使用设备、关机)
Java语言进阶 #继承&多态 #Day10 #接口 #多态 #USB接口实现 #向上转型 #编译看左,运行看右_第19张图片
结果为
Java语言进阶 #继承&多态 #Day10 #接口 #多态 #USB接口实现 #向上转型 #编译看左,运行看右_第20张图片

你可能感兴趣的:(java)