我们为什么需要抽象类、接口?
当我们实际工作中,常常遇到跨部门协作,多人共同开发一个系统的情况,众人拾柴火焰高嘛。但人一多,就涉及到分工的问题,有人专注于设计功能,有人设计程序的规范,用人来实现具体的代码内容,等等。此时就有一种情况很常见:上游程序员负责将需要的功能定义出来,但他并没有精力去逐一实现,而是需要下游程序员的协作来实现具体代码。此时Java的抽象类与接口,就很适用于这种情况。
抽象类
我们将用abstract 修饰的类,称为抽象类。《abstract 修饰符》
抽象类的特点:
- 1.抽象类不能直接创建对象,但是可以有构造器。
- 2.抽象类当中,可以有抽象方法,也可以有非抽象方法。有抽象方法的类必须为抽象类。
- 3.若子类也为抽象类,则子类可以不覆盖父类抽象方法。但子类为非抽象类,则必须重写所有父类的抽象方法。
- 4.抽象类可以有自己的成员变量。
- 5.不能用final修饰。
- 6.Java中,一个类只能继承一个抽象类。
来个实例:
abstract class Person { //抽象类,注意不能同时被 abstract 和 final 修饰
public static int totalnum; // 抽象类可以有自己的
private String name;
private int age;
Person(String name,int age) { // 抽象类可以有构造器
this.name = name;
this.age = age;
}
public abstract void die(); //抽象类中可以有抽象方法,有抽象方法一定要声明为抽象类
public static void destroy() { //抽象类中也可以有非抽象方法
totalnum = 0;
}
}
class student extends Person{
student(String name, int age) {
super(name, age);
}
@Override
public void die() { //非抽象子类,必须重写父类的所有抽象方法
System.out.println("Die");
}
}
public class Test {
public static void main(String[] args){
new Person(); // 报错,抽象类无法实例化
}
}
接口
接口,在我的理解中,就是一种比抽象类还抽象的,它太抽象了,已经抽象到不再是一个类Class,而是另用了interface这个词来表示接口。
接口的特点:
- 1.接口没有构造器,所以也不能实例出对象。
- 2.接口中的方法是也必须是public abstract的,即使省略没写这两个修饰符,依旧也是public abstract的。接口中的方法不能有实现。
- 3.接口当中定义的变量,都是全局静态常量(public stsatic final),即使没写也是。
- 4.接口中的内部类,也都是public abstract的。
- 5.接口中不能有静态代码块及静态方法。(不能有static)
- 6.接口是可以被继承的,并且可以多继承。
来个实例:
//----------------------------接口----------------------------------
interface Living{ // 活着的,接口
void breathe(); // 抽象方法“呼吸”
}
interface Animal{ // 动物,接口
int max_age = 100; // 接口中的变量都是全局静态常量public stsatic final
void eatFood();
}
interface Pet extends Animal,Living{ // 宠物接口,接口继承接口时,用extends,可以多继承
void Clingy(); // 抽象方法“粘人”
}
//-------------------------------类----------------------------------
class Cat implements Animal,Pet,Living{ // 类实现接口时,用implements,而不是extends。
// 此处其实等效于实现Pet一个接口即可,列出来时为了强调可以实现多个接口
@Override
public void eatFood() {
System.out.println("猫吃小鱼干");
}
@Override
public void Clingy() {
System.out.println("猫粘人");
}
@Override
public void breathe() {
System.out.println("呼吸");
}
}
抽象类与接口的异同
抽象类与接口的相同点
- 都不能直接实例化对象,需要被其它类继承或实现
- 都可以定义抽象方法
抽象类与接口的不同点
- 接口没有构造器,抽象类中有构造器
- 抽象类可以包含实现方法,而接口中只可以有抽象方法
- 抽象类中成员变量为默认权限,接口中为public static final
- 非抽象子类继承抽象类,使用extends。非接口子类实现接口,用implements。
- 抽象类可以实现接口。即可以abstract class 抽象类名 implements 接口名{ }