抽象类与接口
1、抽象类
用abstract修饰的类就是抽象类
当一个方法没有实现价值的时候,永远不会执行该方法是,就把这个方法设置为抽象方法
1)概述
在JAVA中abstract是抽象的意思,可以修饰类和成员方法
抽象类:
修饰符 abstract class 类名{
修饰符 abstract 返回值类型 方法名称(形参列表);//抽象方法
}
注意:抽象方法只有方法签名,不能声明方法体
一个类中定义了抽象方法,这个类必须声明为抽象类
2)使用场景

继承抽象类时,一定要重写这个抽象类的全部抽象方法,不然这个类也要被定义成抽象类
3)抽象类的特征与注意事项
-
类有的东西,抽象类都有
-
抽象类中可以没有抽象方法,但是有抽象方法的类必然是抽象类
-
一个类继承了抽象类,必须重写玩抽象类的全部抽象方法,否则这个类也必须定义为抽象类
-
不能用abstract修饰变量、代码块、构造器
-
得到了抽象方法,失去了创建对象的能力-------反证法:假设可以创建,对象调用抽象方法时没有方法体。就算没有抽象方法他也是不完整的设计图
//所以Animal a = new Animal();会报错 //强制要求父类的引用指向子类的实例 //即里氏替换原则 Animal a = new Cat(); -
final和abstract的关系:互斥关系(一个要继承一个不能继承,一个方法不能重写一个必须重写)
-
也不能同时用static 和abstract,因为static方法可以直接用类名.方法名调用 ,但抽象方法是没有方法体的
-
也不能同时用private和abstract(其他访问修饰符可以),因为抽象方法为私有就不能被实现了
4)设计模式:模板方法模式
当系统中出现同一个功能多处在开发,而该功能中大部分代码是一样的,只有其中部分可能不同的时候。
实现步骤:
1. 把功能定义成一个所谓的模板方法,放在抽象类中,模板方法只定义通用且能确定的代码。
- 模板方法不能决定的功能定义成抽象方法让具体子类去实现

但是最好设置为final修饰,因为其为模板用final修饰后就不能更改


2、接口
当一个类中所有的方法都没有具体实现价值的时候,这个类中所有的方法都是抽象方法的时候。我们就可以将其定义为接口。
接口也是一种数据类型----引用数据类型
1)接口概述
接口就是一种规范
常量默认public static final,方法默认public abstract
//格式如下:
//JDL1.8之前只能接口中只能定义常量和抽象方法
//声明一个接口:体现一种规范,规范则一定是公开的,默认类型就是public,可以不写
//常量默认public static final,方法默认public abstract
public interface 接口名{
//常量----使用很少
//抽象方法
}
2)接口的用法
接口是用来被类实现(implements)的,实现接口的类称为实现类,可理解为所谓的子类
修饰符 class 实现类 implements 接口1,接口2...{
}
//接口不能被实例化
//接口引用指向实现类的实例
//接口的多态!!!!!!!!!
Usb usb = new ApplePhone();
usb.meth();
接口可以被类单实现,也可被类多实现
注意:一个类实现接口,必须重写完全部接口的抽象方法,不然需要被定义为抽象类
接口中没有构造器、没有成员变量、成员方法
而抽象类中类有的他都有
3)接口与接口的关系:多继承

接口多继承的作用:规范合并,整合多个接口为同一个接口,便于子类实现
eg:用sportMan继承Law与People

这样BasketBallMan只需要implements Sportman(但里面要重写的方法还是一样的)

4)JDK 8后接口新增方法
允许接口中直接定义带有方法体的方法
但实际开发中接口仍然只定义抽象方法
- 默认方法
//类似之前写的普通实例方法:必须用default修饰
//默认会public修饰。需要用接口的实现类的对象来调用
default void run(){
syso("--开始跑--");
}
- 静态方法
//默认会public修饰,必须static修饰
//注意:接口的静态方法必须用本身的接口名来调用
static void inAddr(){
syso("都在快乐学习");
}
3. 私有方法
//就是私有的实例方法;必须用private修饰 jdk1.9才开始有
//只能在本类中被其他1的莫仍方法或私有方法访问
private void go(){
syso("--准备--");
}
5)接口注意事项
-
A接口继承多个接口,多个接口中有相同的抽象方法,继承后A接口中只有一个,实现类实现也只实现一个。
一个实现类实现两个接口,接口中有一样的抽象方法也只用实现一个。

-
接口不能创建对象(接口更加彻底的抽象)
-
一个类实现多个接口,多个接口中有相同的静态方法不冲突
接口的静态方法要用接口自己调用
-
一个类继承了父类,同时又实现了接口,父类中和接口中有同名方法,默认用父类的
一个类在声明时要先写继承(extends)再写实现(implements)
-
一个类实现了多个接口,多个接口中存在同名的默认方法,不冲突,这个类要重写该方法
-
一个接口继承多个接口,是没有问题的,但如果多个接口中存在规范冲突则不能多继承
6)接口与抽象类的区别
相同点:
1、都不能实例化
2、都有抽象方法
不同点:
1、抽象类是用来被继承的(单继承),接口是用来实现的(多实现),也可以多继承
2、抽象类更多用来设计抽象属性,接口更多是设计用来抽象行为
3、抽象类可以有成员变量,但接口中的只有静态常量
4、抽象类有构造方法,接口中没有

浙公网安备 33010602011771号