抽象类
- 抽象类无法实例化:抽象类是类和类之间的共同特征,将这些具有共同特征进一步抽象成了抽象类。由于类本身是不存在的,所以抽象类无法创建对象,而对象是现实中存在的。
- 语法
[修饰符列表] abstract class 类名{
类体;
}
- 抽象类的子类可以是抽象类
- 抽象类虽然无法实例化,但是抽象类有构造方法。这个构造方法是供子类使用的。
- 抽象方法:表示没有实现的方法,没有方法体的方法
exp:
public abstract void doSome();
- 抽象类不一定有抽象方法
- 如果一个方法是抽象方法,那么它所在的类一定是抽象类。
exp:
abstarct class Animal{
public abstract void move();
}
- 【重要】一个非抽象的类继承抽象类,必须将抽象类中的抽象方法实现了。
- 抽象类属于引用数据类型
- 抽象的本质是为了多态:Animal a = new Bird();
接口类
- 也是一种引用数据类型,编译后也生产.class文件
- 接口是完全抽象的
- [修饰符列表] interface 接口名()
- 接口支持多继承 interface C extends A,B{}
- 接口只包含两个部分,一个是常量,一个是抽象方法。public abstract 可省略。接口中的所有内容都是public。接口中的常量public static final可以省略。
- 接口中的方法都是抽象方法,这些方法不能有方法体。
- 类实现接口要实现所有的方法。且实现后public不能省略。
- 有了接口就有了“可插拔”,类似于内存条一般可以“插拔”,十分简便。
exp:
interface MyMath{
int sum(int a,int b);
}
class MyMathImpl implements MyMath{
//int sum(int a,int b){
// return a+b;
//}
public int sum(int a,int b){
return a+b;
}
}
一个类可以实现多个接口
Java中类和类只支持单继承,实现多个接口,实际上就类似多继承,从而弥补单继承的缺陷。
继承和实现都存在时,如何写代码?
extends关键字在前,implements关键字在后
exp:
main函数中:
Flyable f = new Cat();//多态
interface Flyable{
void fly();
}
Class Cat extends Animal implements Flyable{//实现飞猫
接口在开发中的作用
接口在开发中的作用类似于多态在开发中的作用
exp:
public class Master{
public void feed(Dog d){..}
public void feed(Cat c){..}
}
上述代码当再新增宠物的时候需要改动代码,扩展力差
使用多态
exp:
public void feed(Animal a){
//面向Animal父类编程,父类比子类更抽象
//面向抽象编程,不要面向具体编程
//如此,程序扩展力强
}
仅需修改,Animal a = new Cat();Animal a = new Dog();即可
从项目上看接口的意义
有了接口之后,我们可以将项目划分为多个项目组,分工完成。如下Food Menu接口实现了America Cooker和China Cooker实现类,项目组一根据这两个实现类与Food Menu接口完成项目。而项目组二直接根据Food Menu类和Customer类来完成项目。
刚入门的程序员抽象能力不佳,多是去写一些实现方法。当成为慢慢成为系统架构师,高级软件工程师,项目经理,系统分析师之后,就开始写接口程序。