目標(biāo)
今天我們學(xué)習(xí)了接口和抽象類,這兩個(gè)東西在Java這個(gè)面向?qū)ο蟮木幊陶Z言中用處很多,抽象類相比于普通類的抽象程度更高,而接口相比于抽象類更加抽象。
技術(shù)
抽象類的特點(diǎn)
抽象類和普通類一樣,可以有成員變量(屬性),可以有成員方法,可以有構(gòu)造方法,與普通類唯一區(qū)別就是可能存在抽象的成員方法。抽象類的初衷是“抽象”,即規(guī)定這個(gè)類“是什么”,具體的實(shí)現(xiàn)暫不確定,是不完整的,因此不允許直接創(chuàng)建實(shí)例。
1.抽象類是由子類具有相同的一類特征抽象而來,也可以說是其基類或者父類
2.抽象類和抽象方法由abstract修飾符修飾,抽象方法必須為 public 或者 protected(因?yàn)槿绻麨?private,則不能被子類繼承,子類便無法實(shí)現(xiàn)該方法),缺省情況下默認(rèn)為 public
3.抽象類不能用來創(chuàng)建對(duì)象
4.抽象方法必須由子類來實(shí)現(xiàn)
5.如果一個(gè)類繼承于一個(gè)抽象類,則子類必須實(shí)現(xiàn)父類的抽象方法,如果子類沒有實(shí)現(xiàn)父類的抽象方法,則必須將子類也定義為抽象類
abstract class text{
String name="你的名字";//可以定義常量和變量
String yourName;
public abstract void show();//抽象方法
//普通方法
public void shows(){
System.out.println("你好");
}
class text2{
public void showing(){
System.out.print("內(nèi)部類");
}
}
}
接口的特點(diǎn)
我們可以將接口當(dāng)成一個(gè)類來看待,相比于抽象類中還可以寫普通的方法,接口則是完完全全的由抽象方法和常量組成。接口由interface修飾符修飾。
1.我們知道在Java里面是不能實(shí)現(xiàn)多繼承的但是接口不同,一個(gè)類可以同時(shí)實(shí)現(xiàn)多個(gè)接口,不管這些接口之間有沒有關(guān)系,所以接口彌補(bǔ)了抽象類不能多繼承的缺陷。
2.接口是抽象類的延伸,它可以定義沒有方法體的方法,要求實(shí)現(xiàn)者去實(shí)現(xiàn)。
3.接口的所有方法訪問權(quán)限自動(dòng)被聲明為 public
4.接口中可以定義“成員變量”,會(huì)自動(dòng)變?yōu)?public static final 修飾的靜態(tài)常量
5.可以通過類命名直接訪問:ImplementClass.name
實(shí)現(xiàn)接口的非抽象類必須實(shí)現(xiàn)接口中所有方法,抽象類可以不用全部實(shí)現(xiàn)
6.接口不能創(chuàng)建對(duì)象,但可以申明一個(gè)接口變量,方便調(diào)用
例子
interface testInterface{
int I=100;//自動(dòng)變?yōu)?public static final 修飾的靜態(tài)常量
int Count=20;
void text();//接口里面的方法只能為抽象方法
//接口里面可以定義內(nèi)部類
public static class inner{
int name;
public void show(){
System.out.print("內(nèi)部類");
}
}
}
接口和抽象類的區(qū)別
接口和抽象類之間盡管有很多相似之處但是它們之間還是有所區(qū)別
1.抽象類和抽象類、類之間由于java出于數(shù)據(jù)安全性 的考慮只能采用單繼承
2.類和接口之間可以多實(shí)現(xiàn),這也為java不能實(shí)現(xiàn)多繼承開辟了另外的道路
3.接口與接口之間可以實(shí)現(xiàn)多繼承
4.抽象類與接口的成員組成:接口與抽象類相比只能存在抽象成員方法,且只能存在成員常量
接口的多繼承和多實(shí)現(xiàn)
interface interfaceA{
void showA();
}
interface interfactB{
void showB();
}
//接口的多繼承 被繼承的接口和接口之間用','隔開
interface interfaceC extends interfaceA,interfactB{
void showC();
}
//接口的實(shí)現(xiàn)用implements
//實(shí)現(xiàn)接口的類必須實(shí)現(xiàn)接口里面的全部抽象類
class textInterface implements interfaceA,interfactB {
@Override
public void showA() {
System.out.println("實(shí)現(xiàn)抽象方法A");
}
@Override
public void showB(){
System.out.println("實(shí)現(xiàn)抽象方法B");
}
}
寫代碼
今天寫的代碼算是自打那個(gè)撲克牌“賭博”游戲以來我能聽懂的一個(gè)了,也算是這個(gè)代碼比較簡(jiǎn)單的緣故。不過po代碼就算了
另外還有一個(gè)小程序
package day_7;
public class Lishubo {
public static void main(String[] args){
MyCode text=new MyCode();
text.calculate();
}
}
abstract class TimeTemplate{
//通過實(shí)現(xiàn)這個(gè)方法 獲得具體測(cè)量的代碼
public abstract void code();
//實(shí)現(xiàn)測(cè)量
public void calculate(){
long start = System.currentTimeMillis();
//測(cè)量的代碼
code();
long end = System.currentTimeMillis();
System.out.print(end-start);
}
}
class MyCode extends TimeTemplate{
@Override
public void code() {
int total = 0;
for (int i = 0; i < 100000; i++){
total += i;
}
}
}
這里面運(yùn)用到了我們今天學(xué)習(xí)的知識(shí),很容易懂。
寫在后面
說實(shí)話在進(jìn)入了java學(xué)習(xí)階段之后我感覺寫的demo難了一大截。但是俺覺得這都是為了我們學(xué)習(xí)Android開發(fā)做鋪墊,人不能總是走在平地,也會(huì)經(jīng)歷腳下有石子,前方有山包,你要越過小溪,也要走過一片雜草叢生的草地。加油