1.抽象类
1.1抽象类总结
- 抽象类的定义
[修饰符列表] abstract class 类名{
类体;
}
- 抽象类是无法被实例化的(创建对象),抽象类是引用数据类型,用来被子类继承的
- 抽象类虽然无法实例化,但是有构造方法,这个构造方法是供子类使用的
- final修饰的类是无法被继承的,与abstract是对立的,两者无法联合使用
- 抽象类的子类可以滴抽象类,也可以是非抽象类
- 抽象类中不一定有抽象方法,抽象方法只能出现在抽象类中
- 一个非抽象类,继承抽象类,必须将抽象类中的抽象方法进行覆盖/重写/实现
判断题:Java语言中凡是没有方法体的方法都是抽象方法。
错误,反例:Object类的public native inthashCode();
该方法底层抵用C++写的动态链接库程序。修饰符列表中没有abstract,native表示调用JVM本地程序
示意图:
1.2抽象方法
抽象方法的定义
public abstract void doSome();
抽象方法表示没有实现的方法,特点:
- 没有方法体,以分号结尾
- 前面的修饰符列表中有abstract关键字
1.3抽象编程
Animal a = new Bird();
a.move();
Animal为抽象类,利用多态,面向抽象编程,不要面向具体编程,降低程序的耦合度,提高程序的扩展力。符合OCP原则
2.接口
2.1接口的基础语法
- 接口是一种“引用数据类型”
- 接口是完全抽象的,抽象类是半抽象的,或则说接口是特殊的抽象类
- 接口的定义
[修饰符列表] interface 接口名{
常量;
抽象方法;
}
- 接口支持多继承
- 接口只包含两部分:常量 、抽象方法
- 接口中所有的元素都是public修饰的
- 接口中的方法都是抽象方法,没有方法体,定义时 public abstract 可以省略
- 接口中常量的 public static final 可以省略
- 一个非抽象的类实现接口的时候,必须将接口中的所有方法加以实现
- 一个类可以实现多个接口
- extends和implements 可以共存,extends在前,implements在后
class Cat extends Animal implements Flyable{ }
- 使用接口写代码时,可以使用多态
2.2接口在开发中的作用
接口在开发中的作用类似多态在开发中的作用,接口的使用离不开多态机制
接口+多态才能达到降低耦合度:接口无法直接创建对象,需要向上转型 FoodMenu cc = new ChineseCook();
接口可以将调用者和实现者解耦合:调用者面向接口调用,实现者面向接口编写实现
大项目开发中,一般将项目分离为一个模块一个模块。模块间采用接口衔接,降低耦合度
编写接口由经验丰富的开发人员完成:架构师、项目经理、高级软件工程师、系统分析师…
3.类与类之间的关系
- is a: Cat is an Animal 凡是满足is a 的表示继承
A extends B
- has a:I has a Pen 凡是满足has a 关系的表示“关联关系”,通常以“属性”的形式存在
A{
B b;
}
- like a :Cook like a FoodMenu 凡是能够满足like a 关系的表示“实现关系”,通常为:类实现接口
A implements B
4.抽象类与接口的区别
- 抽象类是半抽象的,接口是完全抽象的
- 抽象类中有构造方法,接口中没有构造方法
- 类与类之间只能单继承,接口之间支持多继承
- 一个类只能继承一个类,可以同时实现多个接口
- 接口中只允许出现常量和抽象方法
以后接口使用的比抽象类多,接口一般是对行为的抽象
5.示例
public interface FoodMenu {
//炒鸡蛋
void chaoJIDan();
//红烧肉
void hongShaoRou();
}
public class AmericanCook implements FoodMenu {
@Override
public void chaoJIDan() {
System.out.println("美国厨师炒鸡蛋");
}
@Override
public void hongShaoRou() {
System.out.println("美国师傅烧红烧肉");
}
}
public class ChineseCook implements FoodMenu {
@Override
public void chaoJIDan() {
System.out.println("中餐师傅炒鸡蛋");
}
@Override
public void hongShaoRou() {
System.out.println("中餐师傅烧红烧肉");
}
}
public class Customer {
private FoodMenu foodMenu;
public Customer(){
}
public Customer(FoodMenu foodMenu) {
this.foodMenu = foodMenu;
}
public FoodMenu getFoodMenu() {
return foodMenu;
}
public void setFoodMenu(FoodMenu foodMenu) {
this.foodMenu = foodMenu;
}
public void order(){
// FoodMenu foodMenu = this.getFoodMenu()
foodMenu.chaoJIDan();
foodMenu.hongShaoRou();
}
}
public class Test {
public static void main(String[] args) {
FoodMenu cooke1 = new ChineseCook();
Customer customer = new Customer(cooke1);
customer.order();
}
}