对于接口和抽象类,自己也不是很清楚,特别是对于其内部的一些约束,总是记不得,所以在此做一定的记录,供大家学习使用。
在java语言中,abstract class和interface是支持抽象类定义的两种机制。在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的(类具体化),如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
我们直接从代码上来进行解析:
abstract class
abstract class Animal{
// 表示该动物有多少条腿,注意可以是私有的
// 当然,这里只是演示用
private int legs;
public abstract void move();
public void eat(){
System.out.println("吃东西");
}
}
class Fish extends Animal{
// 实现抽象类中的抽象方法,不实现就会报错
public void move(){
System.out.println("游泳");
}
}
class Rabbit extends Animal{
// 实现抽象类中的抽象方法,不实现就会报错
public void move(){
System.out.println("跳");
}
}
在这里,我们定义抽象类需要遵循以下几条规则:
- 一个类如果包含抽象方法,那么这个类就必须声明为abstract,而且不能使private的(要不然子类怎么继承啊)
- 抽象类中可以没有抽象方法
- 抽象类无法创建实例,只能被继承
- 非抽象类继承抽象类,就必须实现抽象类中的所有抽象方法
- 抽象类可以继承抽象类,可以不重写父类的方法
interface
接口和抽象类很类似,接口是抽象方法的集合,用interface来声明。
- 接口不能用于实例化对象。
- 接口没有构造方法。
- 接口中所有方法都必须是抽象的。
- 接口不能包含成员变量,除了 static 和 final 变量。
- 接口不是被继承,而是需要被类实现,使用implements。
- 通过接口,我们可以实现多继承。
代码示例
interface AttackWay{
// 注意,抽象方法不能有方法体
void attack();
}
interface MoveWay{
void move();
}
class Person implements AttackWay,MoveWay{
public void attack(){
System.out.println("使用拳头攻击");
}
public void move(){
System.out.println("使用脚攻击");
}
}
至于这二者系统的区别,我觉得有一张图很不错,贴在下面:
参照了网上的部分博客,发现有一篇总结的很好,在此推荐给大家。
java中接口(interface)和虚基类(abstract class)的区别