接口,就是一种公共的规范标准
只要符合规范标准,就可以大家通用。
接口就是多个类的公共规范。
接口是一种引用数据类型,最重要的内容是其中的:抽象方法
public interface 接口名称 {
// 接口内容
}
注: 换成了interface之后,编译生成的字节码文件仍然是
.class
文件
如果是java 7
,那么接口中可以包括:
如果是java 8
,那么还可以额外包括:
3. 默认方法
4. 静态方法
如果是java 9
,那么接口中可以包括:
5. 私有方法
注意:
1. 接口中的抽象方法,修饰符必须是两个固定的关键字public abstract
2. 这两个关键字可以省略其中一个,也可以都省略(推荐)。
3. 方法的三要素可以随便定义
public class 实现类名称 implements 接口名称 {
}
如果没有实现所有的抽象方法,那么这个就是一个抽象类。
默认方法,一般是用来进行接口升级 的,设想这样的场景:有一个接口已经投入了使用(有多个实现类,并且已经对象化),能继续添加抽象方法嘛?(添加了之后,所有的实现类,都必须添加实现方法哦)
public default 返回值类型 函数名称() { // public可省略
...
}
也是使用类名.
直接调用
public static 返回值类型 方法名称(参数列表) { // public可省略
方法体
}
如果接口中多个方法中,有重复的方法,可以独立的封装出来,然后进行调用即可。而这个被调用的方法,它只是用来解决重复代码,而不希望被访问,所以应为私有方法。
解决方案:
private 返回值类型 方法名(参数列表) {
...
}
private static 返回值类型 方法名(参数列表) {
...
}
接口中可以定义成员变量 ,但是必须使用public static final
三个关键字进行修饰(在写法上可以省略)。从效果上看,这是一个【常量】
public
(公共的);static
(静态的);final
(最终的,不可变的)
public static final 数据类型 常量名称 = 数据值; // 必须赋值,不然报错
注意: 常量名使用 完全大写 和 下划线
public class 类名 implements 接口1, 接口2 {
// 覆盖重写所有抽象方法;
}
多态的前提:extends
或者implements
多态性: 菱形具有四边形形态,也具有图形形态(四边形类继承自图形类),这就是对象的多态性。
父类引用指向子类对象
父类名称 对象名 = new 子类名称();
接口名称 对象名 = new 实现类名称();
一只猫就是一只动物
动物 小花 = new 猫();
成员变量:编译看左,运行看右
成员变量:编译看左,运行还看左
程序员要工作,管理者要工作,保洁要工作…作为老板,我管谁工作,只要都在工作就行。俗话说的好,“一类人就是™好管”,一个老板,思考如何让程序员工作,如何让管理者工作,如何让保洁工作,太掉价了。只要思考,如何让员工工作就行了。这就是多态的好处
程序员 小承 = new 程序员();
小承.工作();
管理者 关关 = new 管理者();
关关.工作();
保洁 老鸨 = new 保洁();
老鸨.工作();
员工 小承 = new 程序员();
小承.工作();
员工 关关 = new 管理者();
关关.工作();
员工 老鸨 = new 保洁();
老鸨.工作();
多态就是向上转型(父类引用指向子类对象):比如把猫看作动物
向上转型一定是安全的 , 它是从小范围到大范围
// 类似自动类型转换
父类名 对象名 = new 子类名();
向下转型: 想让猫抓老鼠,可是现在把它看作了动物,动物不是都会抓老鼠的,怎么办?向下转型!
向下转型是一种【还原】
// 格式上类似强制类型转换
子类名 对象名 = (子类名) 父类对象名; // 两个对象名可一致
为了安全,向下转型应该使用instanceof
关键字。
如何确定动物
向下转型是转型成猫
还是转型成狗
呢?
动物 instanceof 猫; // 返回一个布尔值,可以作为if条件判断
为什么这个函数,需要接受double类型,可是传入int,编译却通过了?因为发生了自动类型转换。
我们之前说到,向上转型,就相当于自动类型转换。所以,当参数需要一个类(接口)时,可以传入它的子类或实现类(甚至匿名对象),会自动地向上转型。
一台电脑,通过USB接口,连接鼠标和键盘
定义一个抽象方法,作为USB协议,实现中国抽象方法表示同意协议
定义设备连接方法和弹出方法
电脑需具备开关机功能
电脑需能连接USB设备,并使用它(鼠标的点击方法,键盘的打字方法)
鼠标/键盘需重写抽象方法,表示同意USB协议。鼠标有自己的点击方法,键盘有自己的打字方法(在电脑类已被调用)