一、抽象类
使用abstract修饰符修饰的类。
官方点的定义就是:如果一个类没有包含足够多的信息来描述一个具体的对象,这样的类就是抽象类。
抽象类在实际应用中,更多的是因为类中有抽象方法。抽象方法:只声明,不实现。具体的实现由继承它的子类来实现。实际点就是:被abstract修饰的方法,只有方法名没有方法实现,具体的实现要由子类实现。方法名后面直接跟一个分号,而不是花括号。例如:
public abstract int A();
一个类中含有抽象方法(被abstract修饰),那么这个类必须被声明为抽象类(被abstract修饰)。
public abstract class Bird{ // 定义一个抽象类abstract void walk();
}public abstract class Airplane{ // 定义一个抽象类abstract void run();
}
和普通类的区别主要有:
- 抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public,class面前加abstract标识
- 抽象类不能用来创建对象
- 如果一个类继承于一个抽象类,则子类必须实现父类的所有抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。不具有实现接口功能
相同点大致有:
- 都有静态变量和静态方法
- 可以有非静态的变量和方法
- 可以继承
二、接口
官方定义:接口在java中是一个抽象类型,是抽象方法的集合。一个类通过继承接口的方式,从而继承接口的抽象方法。
从定义上看,接口是个集合,并不是类。类描述了属性和方法,而接口只包含方法(未实现的方法)。接口和抽象类一样不能被实例化,因为不是类。但是接口可以被实现(使用 implements 关键字)。实现某个接口的类必须在类中实现该接口的全部方法。虽然接口内的方法都是抽象的(和抽象方法很像,没有实现)但是不需要abstract关键字。
- 接口中没有构造方式(因为接口不是类)
- 接口中的方法必须是抽象的(不能实现)
- 接口中除了static、final变量,不能有其他变量
- 接口支持多继承(一个类可以实现多个接口)
和抽象类的区别为:
- 抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
- 抽象类可以有静态代码块和静态方法,而接口中不能含有静态代码块以及静态方法;
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
- 抽象方法比接口速度快。
举例:鸟和飞机都具有飞的功能,但是他们并不是同一类事物,所以对于这中“功能”的抽象,我们应该用接口实现,虽然我们定义成抽象类也能实现。
public interface Fly{ // 定义一个接口void fly();
}public abstract class Bird{ // 定义一个抽象类abstract void walk();
}public abstract class Airplane{ // 定义一个抽象类abstract void run();
}
同时,鸟有自己的走方法,飞机有跑方法,这是这一类事物的抽象,子类都具有,所以我们此时定义为抽象类最合适不过
我们再看燕子和战斗机的类:
public class Swallow extends Bird implement Fly{ Swallow类继承了Bird类,并对Fly接口进行了实现void fly(){};void walk(){};
}// Battleplaneextends继承了Airplane类,并对Fly接口进行了实现
public class Battleplaneextends Airplane implement Fly{ void fly(){};void run(){};
}
- 抽象类侧重某一类事物抽象,接口侧重某一种功能抽象
更多代码示例地址:Day13