抽象方法:
抽象方法是一种只有声明,没有具体的实现的方法。
抽象方法是出现在基类中的一种方法,但要求在派生类中被重写。
一个抽象方法只有方法头,没有方法主体。
声明格式为:访问修饰符 abstract 返回类型 方法名(参数列表);
包含抽象方法的类就会自动变成抽象类,因此必须以abstract关键字声明。
•如果派生类没有重写抽象方法,编译器会报错。
•抽象方法被用来确保派生类会实现这个方法。
抽象类:
如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。
注意:抽象类不一定必须含有抽象方法,只是用abstract修饰的但不包含抽象方法的类也是抽象类。
声明格式为:public abstract class 类名
抽象类特点:
•可以拥有成员变量和普通的成员方法
•抽象类可以含零至多个普通方法,也可以含零至多个抽象方法。
•不论抽象类是否含抽象方法,其都不允许实例化,即抽象类不能用来创建对象(因为抽象类中含有无具体实现的方法)。它只能作为其他类的基类。
•若父类是抽象类,且子类不想成为抽象类,则子类必须将父类中的所有抽象法重写为带方法体的普通方法,否则子类仍必须是抽象类。
•抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。
接口:
接口泛指供别人调用的方法或者函数,是对行为的抽象。
声明格式为:public interface 接口名称
接口特点:
•接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误)。
•方法会被隐式地指定为public abstract方法且只能是public abstract方法。
•接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。
•一个类可以实现一个或者多个接口。
•接口不能被实例化, 而且在接口中所列的所有方法必须在别处被重写。
•接口的目的是为了给其他类提供行为说明。
•Java 允许一个类实现多个接口。
•当一个类实现多个接口,它必须实现所有接口中的方法。
•如果一个类要实现接口,需要写上关键字
public class MyClass implements Interface1,
Interface2,
Interface3
•与类的继承类似,接口之间也可以继承。接口只能继承接口,而不能继承类。接口的继承也表达了“is-a”的逻辑。
•与类只能继承一个父类不同,接口可以继承多个父接口。
•当一个类实现了接口,接口的继承关系就被建立了。
•当一个接口变量指向一个对象时:只有接口中声明的方法是有效的,并且当你想访问被接口引用变量所指向的对象的其他方法时,必须进行强行类型转换。
抽象类与接口的异同:
相同点:
1.抽象类和接口都不能用来创建对象(即实例化),都是实现了接口或者抽象类中的方法后才能被实例化。
(抽象类/接口)继承(抽象类/接口)时只是简单的继承,而在实现类中实例化。
2.可以将抽象类和接口类型作为引用类型
3.一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类
4.抽象类和接口都要有子类,子类都要覆写父类的全部抽象方法,依靠子类的向上转型实现实例化
不同点:
1.抽象类中可以定义构造方法(构造器),可以定义自己的数据成员变量,也可以有非抽象的成员方法。这些成员变量可以在子类重新新定义,也可以重新赋值。
而接口比抽象类更加抽象,接口中不能定义构造方法(构造器),接口中的方法全部都是抽象方法(接口中也可以没有方法,这样的接口称为空接口)
2.抽象类中的方法可以是private,protected,public,接口全部都是public
3.抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象
4.抽象类可以定义与实现,方法也是可以在抽象类中被实现。而接口只有定义,方法不能在接口中实现,只有实现接口类才能实现接口中定义的方法。
5.抽象类只能被继承(用extend),但是接口需要关键字implement来实现。
6.一个类可以实现多个接口,但是一个类只能继承一个抽象类,因此实现多个接口间接的达到多重继承。接口之间可以多继承。
7.抽象类可以有静态代码块和静态方法,而接口中不能含有静态代码块以及静态方法。
8.抽象类之间只能单继承,抽象类可以实现多个接口。
9.抽象类不是具体的类,无法通过new的方式实例化,但是可以通过子类的构造方法间接实例化,也可以通过生成匿名类的方式来实现。
接口也不是具体的类,无法通过new的方式实例化,可以通过生成匿名类的方式来实现。
10.抽象类保留一般类的特性,有普通成员方法,成员变量以及抽象方法等,而接口中只有final static修饰的常量以及抽象(abstract)方法声明。
举例:
继承是一个“是不是”的关系,而接口实现则是“有没有”的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,比如将鸟设计为一个类Bird类,不同种类的鸟直接继承Bird类即可。但是不能将飞行这一特性也设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。
而接口实现则是有没有、具备不具备的关系,比如鸟是否能飞(或者是否具备飞行这个特点),可以将飞行设计为一个接口Fly,包含方法fly(),能飞行则可以实现这个接口,不能飞行就不实现这个接口。



