抽象類
- 強(qiáng)制子類重寫其定義的抽象方法。
- 抽象類中可以不定義抽象方法,這樣做僅僅是不讓該類建立對(duì)象。
抽象類的注意事項(xiàng)
抽象類和抽象方法都必須用abstract修飾,抽象方法必須存放在抽象類中。
abstract不能與private,static,final共用修飾函數(shù)。
抽象方法不存在方法體,通過(guò) new 對(duì)象調(diào)用方法,沒(méi)意義。
抽象類中的方法要被調(diào)用,必須由子類重寫其所有的抽象方法后,建立子類對(duì)象調(diào)用,如果子類只重寫了部分抽象方法,那么該子類還是一個(gè)抽象類。
抽象類只是比一般類多了抽象方法,不存在抽象屬性
public static void main(String[] args) {
new DemoImpl().getCount();
}
//抽象類
abstract class IDemo{
public String mStr = "DemoString";
//抽象方法,將不確定的部分交給實(shí)現(xiàn)類去實(shí)現(xiàn)
abstract int addCount();
public void getCount(){
System.out.println(addCount());
}
}
//實(shí)現(xiàn)類
class DemoImpl extends IDemo{
@Override
int addCount() {
return 1;
}
}
接口
接口的注意事項(xiàng)
接口是一個(gè)特殊的抽象類,不能創(chuàng)建對(duì)象,原因和抽象類相同。
接口沒(méi)有構(gòu)造方法,成員變量都是常量,默認(rèn)的修飾符為public static final,方法都是抽象方法,默認(rèn)的修飾符為public abstract。
非抽象類實(shí)現(xiàn)一個(gè)接口時(shí),必須要把接口中所有的方法全部實(shí)現(xiàn),抽象類實(shí)現(xiàn)一個(gè)接口時(shí),可以實(shí)現(xiàn)也可以不實(shí)現(xiàn)接口中的方法。
一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,不同接口用 , 分隔。
class 類名 implements 接口類A,接口類B{
public void 接口實(shí)現(xiàn)方法名();
}
- 接口與接口之間可以多繼承。
public interface 接口類名 extends 接口A,接口B{
}
接口的作用
1.定義約束規(guī)范
假設(shè)為手機(jī)的功能定義類,大部分手機(jī)功能都相似,在寫代碼時(shí),如果不用接口統(tǒng)一定義這些功能,難免陷入粘貼復(fù)制的局面。
定義規(guī)范
public interface IFirstPhone {
void call();
void sms();
}
具體實(shí)現(xiàn)
public class PhoneImpl implements IFirstPhone {
@Override
public void call() {
printf("call");
}
@Override
public void sms() {
printf("sms");
}
public void printf(String message) {
System.out.println(message);
}
}
2.功能拓展
接口可以多繼承,多實(shí)現(xiàn),如果有了新產(chǎn)品功能添加可以多定義一個(gè)接口。
public interface ISecondPhone extends IFirstPhone{
void netConnection();
void photo();
}
public class PhoneImpl implements IFirstPhone ,ISecondPhone{
@Override
public void call() {
printf("call");
}
@Override
public void sms() {
printf("sms");
}
@Override
public void netConnection() {
printf("netConnection");
}
@Override
public void photo() {
printf("photo");
}
public void printf(String message) {
System.out.println(message);
}
}
3.程序解耦
是對(duì)于多態(tài)的利用,一個(gè)類實(shí)現(xiàn)了接口后,這個(gè)接口即可以作為這個(gè)類的父類引用,隱藏內(nèi)部實(shí)現(xiàn)。
public class Main {
public static void main(String[] args){
ISecondPhone secondPhone = new PhoneImpl();
secondPhone.call();
secondPhone.sms();
secondPhone.netConnection();
secondPhone.photo();
}
}
接口補(bǔ)充
JDK1.8前,當(dāng)一個(gè)類實(shí)現(xiàn)接口時(shí),必須重寫接口中所有的方法,否則這個(gè)類將會(huì)成為一個(gè)抽象類。
但是在實(shí)際開(kāi)發(fā)中,接口中有些方法不需要重寫,針對(duì)這個(gè)問(wèn)題,1.8后提供了接口的默認(rèn)方法。
public interface IFirstPhone {
void call();
void sms();
default void cell() {
System.out.println("不需要強(qiáng)制重寫");
}
}
public class PhoneImpl implements IFirstPhone {
@Override
public void call() {
}
@Override
public void sms() {
}
}
可以根據(jù)實(shí)際決定默認(rèn)方法是否需要重寫
public class PhoneImpl implements IFirstPhone {
@Override
public void call() {
}
@Override
public void sms() {
}
@Override
public void cell() {
}
}
接口中也提供了相應(yīng)的靜態(tài)方法
public interface IFirstPhone {
void call();
void sms();
default void cell() {
System.out.println("不需要強(qiáng)制重寫");
}
static void demo(){
System.out.println("只能通過(guò)接口名調(diào)用");
}
}
public class Main {
public static void main(String[] args){
IFirstPhone firstPhone = new PhoneImpl();
firstPhone.cell();
firstPhone.sms();
IFirstPhone.demo();//靜態(tài)只能通過(guò)接口名調(diào)用,不能通過(guò)引用
}
}