18.1接口
18.1.1接口的概念
- 接口是功能的集合,比抽象类更抽象,是一个实现类。
- 只描述所应具备的方法,没有具体实现,由接口的实现类来完成。
- 将定义和实现进行了分离
18.1.2接口的定义
public interface 接口名 {
/*
* 接口中只能定义常量;
* static代表被类名.调用,final最终固定住变量的值
* pubic static final可以省略不写,也可以选择性书写
*/
public static final int a = 1;
变量2;
变量3;
/*
* public abstract修饰符可不写,也可以选择性书写
*/
public abstract 返回值类型 方法名字(参数列表);
抽象方法2;
抽象方法3;
}
- 接口编译后仍为从.java到.class文件
- 接口中的方法都是公共访问的抽象方法
- 接口中无法定义普通的成员变量,只能定义常量
18.1.3类实现接口
class 类 implements 接口 {
重写接口中的方法
}
- 实现类实现接口但是没有全部重写抽象方法,这个实现类是一个抽象类
18.1.4类实现多接口
class 类 impelements Inter1, Inter2 {
... ...
}
- 多实现没有安全隐患,关键在于接口中的方法都是抽象方法,没有主体
- 多实现解决了单继承的局限性
18.1.5重复定义
public interface A {
public abstract void a();
}
public interface B {
public abstract int a();
}
public class C implements A,B {
public void a() {
......
}
public int a() {
......
}
}
- 避免出现以上情况
- 这不是方法的重载
18.1.6类继承类的同时实现接口
18.1.7接口的多继承
- 类没有多继承,接口有多继承
interface D extends A,B,C {
......
}
18.1.8接口的好处(面向接口编程)
- 接口的出现扩张了功能
- 接口其实就是暴露出来的规则
- 接口的出现降低了耦合性,设备与设备之间实现了解耦
18.1.9接口与抽象类的区别
- 抽象类为部分方法提供了实现,避免了子类重复实现这些方法,提高了代码的复用性。接口只能包含抽象方法。
- 一个类只能继承一个直接父类,却可以实现多个接口。
- 抽象类中是你应当具备的内容,继承体系类似于is...a
- 接口是这个事物的额外功能,继承体系类似于like...a
- 优先用接口,因为耦合性低
- 需要定义子类的行为又要为子类提供共性功能时才选用抽象类
18.2多态
18.2.1多态的概述
- 同一对象可以有多种形态,多态的前提是继承。
- 体现:父类引用指向子类对象。
- 分类:类的多态,接口的多态。
- 在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法
public static void main(String[] args) {
Student s = new Student();
Person p = new Student();
}
18.2.2多态的定义和使用格式
- 普通多态的定义格式
class Fu {}
class Zi extends Fu {}
main () {
Fu fu = new Zi();
}
- 抽象类多态定义的格式
- 接口多态定义的格式
18.2.3多态-成员的特点
class Fu { int a = 1}
class Zi { int a = 2}
main() {
Fu f = new zi;
f.a; // a = 1;
}
- 对于成员变量和成员方法而言,在编译的时候,参考父类有没有这个变量或方法
- 在运行的时候,调用的变量运行的是父类中的变量
- 在运行的时候,调用的方法运行的是父类中的方法
- 总结:(方法)编译看左边运行看子类;(变量)编译运行都看左边;
18.2.4instanceof关键字
- 比较引用数据类型:一个引用数据类型的变量是不是这个类型的对象
- instanceof关键字用于有继承关系的两个类
boolean b = p instanceof Student;
18.2.5多态中的转型
- 向上转型(可以调用子类父类的公共属性,但是不能调用子类特有的方法)
Fu f = new Zi(); //范围小的子类向上转型提升为范围大的父类
- 向下转型(可以调用子类特有的方法)
Student stu = (Student)p; //变量p指向Student对象;