抽象类和接口
任务
1.了解抽象类和普通类的区别
2.会使用抽象类和抽象方法
3.会定义接口、了解接口的含义和作用
1.抽象类和普通类的区别
在编写汽车租赁系统的时候,我们编写了一个方法。
public abstract class Motor{ // 车辆总类(父类)(有抽象方法的必为抽象类)// 省略属性...
// 我们在这里计算机金额是定义为double类型但实际上我们不会用double类型
// 因为Java和计算机对于浮点型数据计算有缺陷
// 在项目中我们的Java中计算金钱需要使用BigDecimal(了解)
// public double calRent(int rentDay){ //日租金 * 租赁天数 * 折扣 // return 0;
// }
// 因为两个子类在使用计算租金方法时,折扣信息规则不一致所以未来此方法必然要被子类进行重写,但是又因为我们要使用多态所以这个方法还必须在父类中定义着 Motor motor = new Car();
// 父类中的方法只是作为一种多态使用的接口而已,内容没有用处,那么我们就可以将其定义为抽象方法(没有方法体只有方法声明)
public abstract double calRent(int rentDay); // 抽象方法
}
// 在子类中重写方法
public class Car extends Motor{ // 轿车
// 重写计算租金方法
}
public class Bus extends Motor{ // 客车
// 重写计算租金方法
}
2.抽象类和抽象方法
(1):抽象类不是一个完整的类,它一般被用作于基类(基础类)。在面向对象方法中,抽象类主要用来进行类型隐藏和充当全局变量的角色。
(2)语法:
public abstract class 类名{
}
(3)抽象类的注意事项:
-
抽象类不能进行实例化(对象创建)。(未来可以通过匿名类来创建它的对象)
1.语义上。自然界不存在这具体的东西,没有哪个水果可以代替”水果”这个名词,没有哪个宠物可以代替”宠物”这个名词,所以它只能是作为一个分类名词用,创建动物/宠物的实例。
2.语法上。如果可以实例化,其包含的抽象方法,在运行程序时,JVM无法执行该方法,因为方法没有方法体。
3.一般作为基类也不需要进行使用。
-
抽象类可以作为多态使用。例如:Motor motor = new Car();
-
抽象类中可以有抽象方法,也可以没有抽象方法。但是有抽象方法的类一定是抽象类。
-
抽象类为父类时,子类必须要重写父类中的所有抽象方法,否则其也需要定义为抽象类。(父债子偿)
// 抽象方法没有方法体 目前掌握抽象方法只需要在此方法实现不确定时使用即可
// 构造方法不能抽象 静态方法也不允许抽象
// 构造方法语法:
访问修饰符 abstract 返回值类型 方法名(参数列表);
3.了解接口的含义和作用
(1) 生活中的“接口”
interface`接口
UI:User Interface
GUI:图形界面接口
API:应用程序接口
**壹.接口(物理接口):**USB接口、电脑接口、电源接口、网线接口
这些接口指的就是一些物理设备提供出来的一个其他外设的连接入口。
**贰.接口(第三方接口,程序接口):**开发一个天气APP(天气数据来源于中央气象局)、开发了一个APP需要支付的能力(接入微信支付、支付宝支付)、开发一个APP需要地图功能(接入百度地图、腾讯地图、高德地图)
各种开放平台:微信开放平台、微信支付开放平台、百度地图开放平台、蚂蚁金服开放平台、微博开放平台
叁.接口(Java Interface): 有些时候和上述接口也有相关联的地方
它是一种引用数据类型(特殊的类型)、为了补全单继承的缺陷。
我们Java中开发一个类,单继承(继承一个类)多实现(继承多个接口)
public interface 接口名{
// 属性
// 方法
}
public class 类名 extends 父类 implements 接口1,接口2...
(2)接口的注意事项:
- 接口中的属性默认都是静态常量(static final),而且权限修饰符为public
- 接口中的方法[都是]{JDK8以后出现了default关键字}公共的抽象方法。(public abstract)
- 接口不能实例化,但是也可以作为子类的引用(多态),未来也可以使用匿名内部类来创建所谓的对象。(抽象类一致)
- 一个类可以实现多个接口
- 接口之间也可以继承(extends)
- 接口本身一旦制定,就不允许随意修改
(3)is a的关系一般使用extends,has a的关系一般使用接口(implements interface)
抽象类和接口区别[面试题]
相同点:
- 代表系统的抽象层
- 都不能被实例化
- 都能包含抽象方法
不同点:
- 在抽象类中可以为部分方法提供默认实现,而接口中只能包含抽象方法
- 一个类只能继承一个直接的父类,但可以实现多个接口
补充:final[最终]的补充[面试题]
- final修饰了变量,变量就成为了常量。
- final修饰类,意味着此类将无法被继承!
- final修饰方法,无法被子类重写!