首先來(lái)介紹一下基類(lèi)(超類(lèi))的概念:當(dāng)一個(gè)類(lèi)與另一個(gè)具有相同功能又不能直接集成的時(shí)候慷吊,需要抽取共同所屬關(guān)系,可以把他們抽取出來(lái)的作為一個(gè)基類(lèi)曹抬「绕浚基類(lèi)就是父類(lèi)。
一谤民、抽象類(lèi)
public abstract class Animal {
public void eated(){
System.out.println("eat");
}
//抽象方法
public abstract void howl();
}
一堰酿、什么是抽象類(lèi)为牍?
抽象類(lèi)凌那,即可以理解為不具體的類(lèi)块攒,沒(méi)有具體的信息來(lái)描述它趣避,比如上述代碼中的Animal類(lèi)住练,Animal是什么樣子的岭埠,我們是描述不出來(lái)的止喷,但是我們可以通過(guò)別的類(lèi)來(lái)進(jìn)行特定的描述技羔,比如貓等。同時(shí),人、手機(jī)等都是抽象類(lèi)檩赢。抽象類(lèi)用abstract關(guān)鍵字修飾,抽象類(lèi)可以作為一個(gè)基類(lèi)來(lái)使用。
二、使用抽象類(lèi)時(shí)的注意事項(xiàng):
1抽象類(lèi)不能被實(shí)例化赞季,實(shí)例化的工作應(yīng)該交由它的子類(lèi)來(lái)完成叨橱,它只需要有一個(gè)引用即可钢猛。
2抽象方法必須由子類(lèi)來(lái)進(jìn)行重寫(xiě)壶愤。
3只要包含一個(gè)抽象方法的抽象類(lèi)勃救,該方法必須要定義成抽象類(lèi)宵统,不管是否 還包含有其他方法。
4抽象類(lèi)中可以包含具體的方法疑枯,當(dāng)然也可以不包含抽象方法具钥。
5子類(lèi)中的抽象方法不能與父類(lèi)的抽象方法同名四啰。
6abstract不能與final并列修飾同一個(gè)類(lèi)垂寥。
7abstract 不能與private箍镜、static蚀狰、final或native并列修飾同一個(gè)方法。
二刹勃、接口
一次洼、什么是接口:
Java接口是一系列方法的聲明亥啦,是一些方法特征的集合,一個(gè)接口只有方法的特征沒(méi)有方法的實(shí)現(xiàn)濒旦,因此這些方法可以在不同的地方被不同的類(lèi)實(shí)現(xiàn),而這些實(shí)現(xiàn)可以具有不同的行為(功能)炎疆。
二、下面來(lái)舉一個(gè)例子:
提到接口苞慢,大家可能會(huì)想到USB接口,就用這個(gè)來(lái)舉例箩言,電腦可以通過(guò)USB接口來(lái)連接外接設(shè)備鸵赖,為外接設(shè)備提供電能,同時(shí)也能為電腦提供數(shù)據(jù)傳輸饼煞,即接口只有一些方法的特征卻沒(méi)有方法實(shí)現(xiàn)砖瞧,想要這些特征被實(shí)現(xiàn),就需要不同的類(lèi)薇搁,即電腦和鼠標(biāo)等。
下附例子代碼:
1、USB的接口:在USB接口中寫(xiě)出提供電量秉氧、數(shù)據(jù)傳輸?shù)姆椒ǎ唤涌诘亩x需要用到interface關(guān)鍵字蚤假。
public interface USB {
public void powerUp();
public void dataTransport();
}
2栏饮、鼠標(biāo)類(lèi):通過(guò)實(shí)現(xiàn)USB這個(gè)接口,來(lái)實(shí)現(xiàn)USB這個(gè)接口磷仰,一個(gè)類(lèi)想要實(shí)現(xiàn)接口需要用到implements關(guān)鍵字袍嬉。
public class Mouse implements USB{
@Override
public void powerUp() {
System.out.println("鼠標(biāo)供電");
}
@Override
public void dataTransport() {
System.out.println("鼠標(biāo)數(shù)據(jù)接通");
}
}
3、鍵盤(pán)類(lèi):通過(guò)實(shí)現(xiàn)USB這個(gè)接口灶平,來(lái)實(shí)現(xiàn)USB這個(gè)接口伺通,一個(gè)類(lèi)想要實(shí)現(xiàn)接口需要用到implements關(guān)鍵字。
public class Keyboard implements USB{
@Override
public void powerUp() {
System.out.println("鍵盤(pán)供電");
}
@Override
public void dataTransport() {
System.out.println("鍵盤(pán)數(shù)據(jù)接通");
}
}
4逢享、電腦類(lèi):在類(lèi)中定義一個(gè)USB對(duì)象罐监,寫(xiě)出其set方法,用來(lái)實(shí)現(xiàn)USB的供電瞒爬,數(shù)據(jù)傳輸功能笑诅。
public class Computer {
private USB usb;
public USB getUsb() {
return usb;
}
public void setUsb(USB usb) {
this.usb = usb;
usb.powerUp();
usb.dataTransport();
}
}
5调缨、在Main中:new出Computer、Mouse吆你、Keyboard的對(duì)象,將mouse俊犯、keyboard作為參數(shù)set給computer妇多,來(lái)讓電腦實(shí)現(xiàn)鍵盤(pán)、鼠標(biāo)中的功能燕侠。
public class Main {
public static void main(String[] args) {
// write your code here
Computer computer = new Computer();
Mouse mouse = new Mouse();
computer.setUsb(mouse);
Keyboard keyboard = new Keyboard();
computer.setUsb(keyboard);
}
}
6者祖、運(yùn)行結(jié)果:通過(guò)運(yùn)行,發(fā)現(xiàn)實(shí)現(xiàn)了鼠標(biāo)和鍵盤(pán)類(lèi)中的功能绢彤。
三七问、關(guān)于接口的特點(diǎn)及注意事項(xiàng):
1、Java接口中的成員變量默認(rèn)都是public,static,final類(lèi)型的(都可省略),必須被顯示初始化,即接口中的成員變量為常量(大寫(xiě),單詞之間用”_”分隔)
2茫舶、Java接口中的方法默認(rèn)都是public,abstract類(lèi)型的(都可省略),沒(méi)有方法體,不能被實(shí)例化
3械巡、Java接口中只能包含public,static,final類(lèi)型的成員變量和public,abstract類(lèi)型的成員方法
4、接口中沒(méi)有構(gòu)造方法,不能被實(shí)例化
5饶氏、一個(gè)接口不能實(shí)現(xiàn)(implements)另一個(gè)接口,但它可以繼承多個(gè)其它的接口
6讥耗、Java接口必須通過(guò)類(lèi)來(lái)實(shí)現(xiàn)它的抽象方法
7、當(dāng)類(lèi)實(shí)現(xiàn)了某個(gè)Java接口時(shí),它必須實(shí)現(xiàn)接口中的所有抽象方法,否則這個(gè)類(lèi)必須聲明為抽象類(lèi)
8疹启、不允許創(chuàng)建接口的實(shí)例(實(shí)例化),但允許定義接口類(lèi)型的引用變量,該引用變量引用實(shí)現(xiàn)了這個(gè)接口的類(lèi)的實(shí)例
9古程、一個(gè)類(lèi)只能繼承一個(gè)直接的父類(lèi),但可以實(shí)現(xiàn)多個(gè)接口,間接的實(shí)現(xiàn)了多繼承,并且沒(méi)有菱形缺陷 相當(dāng)于多繼承的優(yōu)化案喊崖。