接口和內(nèi)部類未我們提供了一種將接口與實(shí)現(xiàn)分離的更加結(jié)構(gòu)化的方法
抽象類
描述
面向?qū)ο蟮念I(lǐng)域一切都是對(duì)象,通過具體的類來描述溉知,但不是所有類都是來描述對(duì)象的。如果一個(gè)類沒有足夠的信息來描述一個(gè)具體的對(duì)象玫荣,而需要其他具體的類來支撐它捅厂,那么這個(gè)類我們稱其為抽象類资柔。
抽象類一定是用來繼承的辙芍,同時(shí)在一個(gè)以抽象類為節(jié)點(diǎn)的繼承關(guān)系等級(jí)鏈中故硅,葉子節(jié)點(diǎn)一定是具體的實(shí)現(xiàn)類。
注意事項(xiàng)
- 抽象類不能實(shí)例化腾誉,實(shí)例化的工作應(yīng)該交由它的子類來完成妄辩,它只需要有一個(gè)引用即可眼耀。
- 抽象方法必須由子類進(jìn)行重寫哮伟。
- 只要包含一個(gè)抽象方法的抽象類,該類必須定義成抽象類抡驼。
- 抽象類中可以包含具體方法肿仑。
- 子類中的抽象方法不能與父類的抽象方法同名尤慰。
- abstract不能與final(修飾類時(shí)表示不能被繼承)同時(shí)修飾一個(gè)類杯道。
- abstract不能與private责蝠、static齿拂、final或native并列修飾同一個(gè)方法创肥。
public abstract class Animal {
public abstract void shout();
}
public class Cat extends Animal {
@Override
public void shout() {
System.out.println("cat : miaomiaomiao");
}
}
public class Dog extends Animal {
@Override
public void shout() {
System.out.println("dog : wangwangwang");
}
}
public class Test {
public static void main(String [] args){
Animal a = new Cat();
Cat cat = new Cat();
Dog dog = new Dog();
a.shout();
cat.shout();
dog.shout();
}
}
輸出結(jié)果:
cat : miaomiaomiao
cat : miaomiaomiao
dog : wangwangwang
接口
描述
接口可以描述為抽象類的抽象巩搏。接口本身并不是類贯底。通過使用implements關(guān)鍵字實(shí)現(xiàn)某個(gè)接口禽捆,接口實(shí)現(xiàn)了多繼承的功能胚想。
注意事項(xiàng)
- 接口中的方法的訪問權(quán)限被自動(dòng)聲明為public浊服。確切的說只能為public,當(dāng)然你可以顯示的聲明為protected腕扶、private(編譯不通過)
- 接口中的成員變量會(huì)自動(dòng)變?yōu)閜ublic static final半抱。
- 接口中不存在實(shí)現(xiàn)的方法。
- 實(shí)現(xiàn)接口的非抽象類必須實(shí)現(xiàn)接口中的所有方法棉磨。
- 不能使用new操作符實(shí)例化一個(gè)接口乘瓤,可以聲明一個(gè)接口變量策泣,該變量必須引用(refer to)一個(gè)實(shí)現(xiàn)該接口的類的對(duì)象统抬〈辖ǎ可以使用instanceof檢查一個(gè)對(duì)象是否實(shí)現(xiàn)了某個(gè)特定的接口金麸。
- 在實(shí)現(xiàn)多接口的時(shí)候一定要注意方法名重復(fù)挥下。
public interface Animal {
int a = 10;
public static final int b = 10;
public void eat();
void shout();
public void test(Animal a);
}
public class Cat implements Animal {
@Override
public void eat() {
System.out.println("cat : i like bone");
}
@Override
public void shout() {
System.out.println("cat : wangwangwang");
}
public void test(Animal a){
String str = "";
if(a instanceof Cat) {
str = "cat";
}
System.out.println(str);
}
}
public class Dog implements Animal {
@Override
public void eat() {
System.out.println("dog : i like fish");
}
@Override
public void shout() {
System.out.println("dog : wangwangwang");
}
public void test(Animal a){
String str = "";
if(a instanceof Dog) {
str = "dog";
}
System.out.println(str);
}
}
public class Test {
public static void main(String [] args){
Animal a = new Cat();
Cat cat = new Cat();
Dog dog = new Dog();
a.shout();
cat.shout();
dog.shout();
a.eat();
cat.eat();
dog.eat();
cat.test(a);
cat.test(cat);
cat.test(dog);
dog.test(a);
dog.test(cat);
dog.test(dog);
}
}
輸出結(jié)果
cat : wangwangwang
cat : wangwangwang
dog : wangwangwang
cat : i like bone
cat : i like bone
dog : i like fish
cat
cat
dog
抽象類與接口的區(qū)別
- 抽象層次不同:抽象類是對(duì)類抽象喜最,而接口是對(duì)行為的抽象禀苦。
- 跨域不同:抽象類所體現(xiàn)的是一種繼承關(guān)系,要想使得繼承關(guān)系合理,父類和派生類之間存在一種“is-a”關(guān)系慧邮。接口則不同误澳,它跟實(shí)現(xiàn)類之間是"like-a"關(guān)系忆谓。
- 設(shè)計(jì)層次不同:抽象類時(shí)自底向上抽象而來的,接口是自頂向下設(shè)計(jì)出來的。