文章目录
- 1.抽象类
- 1.1抽象方法
- 2.接口
- 3.抽象类和接口的区别
- 3.1代码中区分:
- 3.2设计层面区分
在面向对象编程中,抽象是非常重要的一个特征。在Java中可以通过抽象类或接口的形式实现这一特性。
1.抽象类
Java关键字 abstract对应抽象类的使用
1.1抽象方法
在Java中有一种方法,没有具体实现只有声明,这就是抽象方法。
abstract void test();
一个类只要有一个抽象方法,那么这个类必须用abstract关键字修饰,即这个类为抽象类。
创建一个动物的抽象类,拥有一个eat的抽象方法
public abstract class Animal {
abstract void eat();
}
因为抽象方法没有实现,所以抽象类便是为了继承而产生的。通过子类继承该抽象类,重写实现抽象类的方法。抽象方法不能是private类型,因为子类无法重写,默认为public类型。
public class Cat extends Animal{
@Override
void eat() {
System.out.println("cat eat");
}
}
猫继承动物这个抽象类,所以可以重写eat这个抽象方法,但是需要注意,一定要重写父类所有的抽象方法,否则会报错。如果子类不想实现抽象方法,那么子类也必须是抽象类,即抽象类继承抽象类。
public abstract class Animal {
public Integer age;
abstract void eat();
public void sleep(){
System.out.println("sleep");
}
}
抽象类并不是只能有抽象方法,同样可以拥有普通方法和成员变量
抽象类并不能被实例化,只能实例化他的子类。
2.接口
接口通常是提供别人调用的方法或者函数,Java关键字 interface对应接口的定义,实现接口使用implement关键字。
在接口中的抽象方法,会被隐式的指定为public abstract类型。同样的,接口也可以拥有成员变量,但同样会被隐式指定为public static final类型,使用其余关键字修饰会报错。
接口可以感觉比抽象类更抽象的存在,并且接口不支持方法的实现,只能声明方法。
3.抽象类和接口的区别
3.1代码中区分:
- 抽象类中可以实现方法,并且允许非抽象方法存在,允许不同关键字修饰方法;接口中只能有public abstract 修饰的抽象方法,并且只有声明,没有实现。
- 抽象类中的成员变量可以有不同关键字修饰,但接口中的成员变量只允许public static final关键字修饰。
- 如果是非抽象类实现接口,那么需要重写接口的所有方法,如果是抽象类实现接口,那么可以不需要重写,类似于抽象类继承抽象类不一定要重写所有抽象方法。
- 抽象类允许静态方法和代码块,接口不允许静态方法和代码块。
- 类只能继承一个抽象类,但可以实现多个接口。
3.2设计层面区分
抽象类是对整体事物进行抽象,接口是对局部行为抽象。具体一点就相当于飞机和鸟可以分别抽象为两个抽象类类,而飞行不能是一个类,但是可以设计为一个飞行接口,然后鸟类和飞机类用不同的方式实现飞行这个接口。不同的鸟和飞机分别继承对应的抽象类,可以飞行的实现飞行接口,不能的则不实现。