interface 接口和多态
目录
interface 接口和多态
1. interface 接口
1.1 接口到底做了什么???
常见接口:
USB-B USB-C Type-C HDMI VGA DP RJ45 Lighting mirco-usb 3.5MM SATA M.2 SATA PCI-E
电源 电动车插口
接口可以做什么???
USB为例
鼠标,键盘,声卡,网卡,U盘,移动硬盘,充电,游戏手柄,蓝牙...
可以拓展当前设备的功能!!!增强功能!!!
1.2 Java中定义 interface 接口的格式
定义接口关键字:
interface
格式:
interface 接口名 {
成员变量;
成员方法;
}
interface A {
/*
* The blank final field num may not have been initialized
* final 修饰的成员变量 num 可能尚未初始化。
*
* Outline 提示 num 变量 绿色空心圈 SF 修饰
* 绿色空心圈 public
* SF ==> static final
*
* 接口中成员变量【缺省属性】 public static final
*/
public static final int NUM = 10;
/*
* Abstract methods do not specify a body
* abstract修饰方法没有方法体!!!
*
* 接口中成员方法【缺省属性】 public abstract
*/
void test();
}
1.3 类【遵从】接口的格式和要求
关键字:
implements
格式:
class 类名 implements 接口名 {
}
/*
* The type TypeA must implement the inherited abstract method A.test()
* TypeA 必须实现 遵从 接口 A 得到 abstract 方法
*
* @Override
* 开启代码格式严格检查!!!要求 TypeA 类中的 test 方法必须和接口 A 中的 test 方法声明一致
*/
class TypeA implements A {
@Override
public void test() {
System.out.println("TypeA 类遵从接口 A 实现 test 方法");
}
}
public class Demo1 {
public static void main(String[] args) {
TypeA typeA = new TypeA();
typeA.test();
// 接口 A 有自己的 类对象吗???
}
}
1.4 接口的特殊语法
1.4.1 JDK 1.8 新特征
default 关键字
default 关键字可以在接口中修饰方法,该方法为默认方法!!!
package com.qfedu.a_interface;
interface B {
void test();
/*
* This method requires a body instead of a semicolon
* 该方法需要一个方法体来替换 分号
*
* default 修饰接口中的方法可以有方法体,为默认方法,【缺省属性】 public
*/
default void testDefault() {
System.out.println("default 修饰的默认方法");
}
}
class TypeB implements B {
/*
* 蓝紫色空心箭头
* implements com.qfedu.a_interface.B.test
* 实现 接口 B 中的 test 方法
*/
@Override
public void test() {
System.out.println("遵从接口 B 实现 test 方法");
}
/*
* 绿色实心箭头
* overrides com.qfedu.a_interface.B.testDefault
* 重写 接口 B 中的 testDefault 方法
*/
/*
* Default methods are allowed only in interfaces.
* default 修饰方法有且只允许在接口中存在
*/
@Override
public void testDefault() {
System.out.println("测试");
}
}
public class Demo2 {
public static void main(String[] args) {
TypeB typeB = new TypeB();
typeB.test();
typeB.testDefault();
}
}
1.4.2 类可以同时遵从多个接口
interface C {
void testC();
}
interface D {
void testD();
}
/**
* 一个类可以同时遵从多个接口,不同的接口使用逗号隔开.
* @author Anonymous
*
*/
class TypeC implements C, D {
@Override
public void testD() {
System.out.println("遵从接口 D 实现 testD 方法");
}
@Override
public void testC() {
System.out.println("遵从接口 C 实现 testC 方法");
}
}
1.4.3 接口继承
关键字:
extends
interface E {
void testE();
}
interface F {
void testF();
}
interface G {
void testG();
}
/*
* USB接口多继承其他接口,为什么不需要使用其他接口中的缺省属性为 public abstract 修饰方法???
* abstract修饰方法,可以存在于 abstract 修饰类内 和 interface 接口内。
* USB 接口继承多个接口,当前 USB 接口可以作为父接口 abstract 存在环境。
*/
interface USB extends E, F, G {
void usbConnect();
}
/*
* 一个非 abstract 修饰类,遵从接口,要求实现接口中所有尚未实现的 abstract 方法,
* 如果当前接口有父接口,当前类需要同时将父接口中的 abstract 一并实现。
*/
class TypeD implements USB {
@Override
public void testE() {
System.out.println("E方法");
}
@Override
public void testF() {
System.out.println("F方法");
}
@Override
public void testG() {
System.out.println("G方法");
}
@Override
public void usbConnect() {
System.out.println("usbConnect方法");
}
}
2. 生活实例分析
2.1 动物园
动物是不是一个类???
是
老虎算不算一个类???
熊猫算不算一个类???
猴子算不算一个类???
算
老虎 熊猫 猴子 算不算动物???
算
你去动物园喂动物!
喂熊猫算不算???
喂老虎算不算???
喂猴子算不算???
算
总结:
1. 方法参数所需类型为父类类型,这里可以传入父类对象本身或者其子类对象,还可以是间接子类对象。
2. 方法返回值类型为父类类型,这里可以返回值的实际对象可以是父类对象本身或者其子类对象,还可以是间接子类对象
3. 数据类型强制转换,是从大类型 ==> 小类型。要求数据的真实情况和目标转换的小类型一致。
引用数据类型强制转换,类型没有问题的情况下,不存在数据精度丢失,数据空间丢失,对于后期操作有利。
2.2 USB 接口
USB是一个接口
鼠标,键盘可以看做是USB设备
电脑可以通过该 USB 连接 USB 设备
3. 多态总结
1. 拓宽方法的参数范围:
方法所需参数为父类类型,可以传入其父类对象本身,直接子类对象或者间接子类对象。
方法所需参数为接口类型,要求传入的实际参数是接口实现类对象或者间接实现类对象
2. 拓宽方法的返回值数据范围
方法返回值类型是父类类型,可以返回父类对象本身,直接子类对象或者间接子类对象
方法返回值类型是接口类型,可以返回接口的实现类对象或者间接实现类对象,后期极为常见!!!
interface java.sql.Connection 数据连接对象
interface java.sql.PreparedStatement 数据库 SQL 语句预处理搬运工对象。
3. 强制类型转换
大类型 ==> 小类型
格式:
小类型 对象名 = (小类型) 大类型对象;
【重点】:
必须明确大类型对象存储到底是什么内容。
后期强制类型转换需要类型判断!!!
4. static 面试题
class Demo {
public static Demo d1 = new Demo();
public static Demo d2 = new Demo();
{
System.out.println("构造代码块");
}
static {
System.out.println("静态代码块");
}
public Demo() {
System.out.println("构造方法");
}
public static void main(String[] args) {
Demo d = new Demo();
}
}