接口
當(dāng)一個(gè)抽象類(lèi)中的方法都是抽象的時(shí)候 可以將該抽象類(lèi)用另一種方式表示 即接口
定義接口的關(guān)鍵字是 Interface
例如
abstract class Demo1
{
abstract void show1(){};
abstract boid show2(){};
}
interface Demo
{
abstract void show1()廊敌;
abstract boid show2();
}
接口中常見(jiàn)的成員:
1.全局常量--->pubic static final
2.抽象方法--->public abstract
接口中的成員都是公共的權(quán)限~
interface Demo
{
public static final int Num = 1;
public abstract void show1();
public abstract void show2();
}
//類(lèi)與類(lèi)之間是繼承關(guān)系 類(lèi)與接口直接是實(shí)現(xiàn)過(guò)程
/*
1.接口不可以實(shí)例化 只能由實(shí)現(xiàn)了接口的子類(lèi)并覆蓋了接口中的所有抽象方法后
該子類(lèi)才可以實(shí)例化,否則這個(gè)字類(lèi)就是一個(gè)抽象類(lèi)
*/
class DemoImpl implements Demo
{
public void show1(){}
public void show2(){}
}
interface Demo
{
public static final int Num = 1;
public abstract void show1();
public abstract void show2();
}
class InterfaceDemo
{
public static void main(String[] arr){
DemoImpl d = new DemoImpl();
System.out.println(d.Num);
System.out.println(DemoImpl.Num);
System.out.println(Demo.Num);
}
}
在Java中不直接支持多繼承慷垮,會(huì)出現(xiàn)調(diào)用的不確定性
所以Java將多繼承機(jī)制進(jìn)行了改良 變成了多實(shí)現(xiàn)--↓
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口。
interface A
{
public void show();
}
interface B
{
public void show();
}
class C
{
public void method()
{}
}
class Test implements A,B//多實(shí)現(xiàn)
{
public void show()
{
}
}
class Test extends C implements A,B
{
}
class InterfaceDemo
{
public static void main(String[] arr)
{
Test t = new Test();
t.show();
}
}
一個(gè)類(lèi)在繼承另一個(gè)類(lèi)的同時(shí) 才可以實(shí)現(xiàn)多個(gè)接口
class Test extends C implements A,B
{
}
接口的出現(xiàn)避免了單繼承的局限性
接口可以多繼承
interface A{}
interface B{}
interface C extends A,B{}
接口的特點(diǎn)
抽象類(lèi)和接口的異同點(diǎn):
相同點(diǎn):都是不斷向上抽取而來(lái)的
不同點(diǎn):
1.抽象類(lèi)需要給繼承强胰,桥嗤,而且只能單繼承
接口需要被實(shí)現(xiàn),而且可以多實(shí)現(xiàn)
2.抽象類(lèi)中可以定義抽象方法和非抽象方法督怜,子類(lèi)繼承后丘跌,可以直接使用非抽象方法
? 接口中只能定義抽象方法袭景,必須由子類(lèi)去實(shí)現(xiàn)
3.抽象類(lèi)的繼承是所有的關(guān)系,在定義該體系的基本共性內(nèi)容
接口的實(shí)現(xiàn)是'like'即'像'的關(guān)系闭树,在定義體系額外功能
多態(tài)
定義:某一類(lèi)事物的多種存在形態(tài)
對(duì)象的多態(tài)性
class Animal
{}
class Cat extends Animal
{}
class Dog extends Animal
{}
Cat x = new Cat();
Animal x = new Cat();//父類(lèi)型指向子對(duì)象? 一個(gè)對(duì)象兩種形態(tài)
//Cat這類(lèi)事物既具備了Cat的形態(tài)耸棒,也具備了Animal的形態(tài),這就是對(duì)象的多態(tài)性
簡(jiǎn)單說(shuō):就是一個(gè)對(duì)象對(duì)應(yīng)著不同的類(lèi)型
多態(tài)在代碼中的體現(xiàn):
父類(lèi)或者接口的引用指向其子類(lèi)的對(duì)象
多態(tài)示例:
class Animal
{
abstract void eat();
}
class Dog extends Animal
{
void eat()
{
syso;
}
void look()
{
syso;
}
}
class Cat extends Animal
{
void eat()
{
syso;
}
void Catch()
{
syso;
}
}
class Pig extends Animal
{
void eat()
{
syso;
}
void pigWork
{
syso;
}
}
class DuoTaiDemo
{
public static void main(String[] arr)
{
Cat c = new Cat();
Dog d = new Dog();
//c.eat();
method(c);
method(d);
method(new Pig());
}
/*
public static void method(Cat c)
{
c.eat();
}
public static void method(Dog c)
{
d.eat();
}
public static void method(Pig p)
{
p.eat();
}*/
public static void method(Animal a)
{
a.eat();
}
}
由上可見(jiàn),多態(tài)的好處:
提高了代碼的擴(kuò)展性报辱,前期定義的代碼可以使用后期的內(nèi)容
多態(tài)的局限性:
前期定義的內(nèi)容不能調(diào)用后期子類(lèi)的特有功能
多態(tài)的前提:
1.必須有關(guān)系与殃,繼承,實(shí)現(xiàn)
2.要有覆蓋
Animal a = new Cat();
//自動(dòng)類(lèi)型提升碍现,Cat對(duì)象提升了Aniaml類(lèi)型幅疼,但是Cat特有功能無(wú)法訪問(wèn)
//作用就是限制特有功能訪問(wèn)--->向上轉(zhuǎn)型
Cat c = (Cat)a;//向下轉(zhuǎn)型是為了使用子類(lèi)特有功能
//向下轉(zhuǎn)型? 可以訪問(wèn)特有功能