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();
	}
}
posted @ 2022-05-15 23:04  qtyanan  阅读(92)  评论(0编辑  收藏  举报