接口就是一種公共的規(guī)范標(biāo)準(zhǔn),只要符合規(guī)范標(biāo)準(zhǔn),大家都可以通用
java中的接口更多的體現(xiàn)在對(duì)行為的抽象
接口的特點(diǎn)
- 接口用關(guān)鍵字
interface
修飾 - 類實(shí)現(xiàn)接口用
implements
表示 - 接口不能直接實(shí)例化
- 接口實(shí)例化參考多態(tài)的方式,通過(guò)實(shí)現(xiàn)類對(duì)象實(shí)例化,這叫接口多態(tài)
- 多態(tài)的形式: 具體類多態(tài),抽象類多態(tài),接口多態(tài)
- 多態(tài)的前提: 有繼承或者實(shí)現(xiàn)關(guān)系;有方法重寫;有父(類/接口)引用指向(子/實(shí)現(xiàn))類對(duì)象
- 接口的實(shí)現(xiàn)類
- 要么重寫接口中的所有抽象方法
- 要么本身就是抽象類
接口的成員特點(diǎn)
- 成員變量
- 只能是常量
- 默認(rèn)修飾符:
public static final
- 構(gòu)造方法
- 接口沒(méi)有構(gòu)造方法,因?yàn)榻涌谥饕菍?duì)行為進(jìn)行抽象的,是沒(méi)有具體存在的
- 一個(gè)類如果沒(méi)有父類,默認(rèn)繼承自O(shè)bject類
- 成員方法
- 只能是抽象方法
- 默認(rèn)修飾符:
public abstract
案例: 貓和狗
public abstract class Animal {
private String name;
private int age;
public Animal() {
}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public abstract void eat();
}
public interface Jumping {
void jump();
}
public class Cat extends Animal implements Jumping {
public Cat() {
}
public Cat(String name, int age) {
super(name, age);
}
@Override
public void jump() {
System.out.println("貓?zhí)?);
}
@Override
public void eat() {
System.out.println("貓吃魚(yú)");
}
}
public class Dog extends Animal implements Jumping{
public Dog() {
}
public Dog(String name, int age) {
super(name, age);
}
@Override
public void jump() {
System.out.println("狗跳高");
}
@Override
public void eat() {
System.out.println("狗吃屎");
}
}
public static void main(String[] args) {
Jumping j = new Cat();
j.jump();
System.out.println("--------------");
Animal a = new Cat();
a.setName("黑貓");
a.setAge(5);
System.out.println(a.getName() + "," + a.getAge() + "歲");
a.eat();
// a.jump(); // Animal 中沒(méi)有jump方法
((Cat)a).jump();
a = new Cat("白貓",6);
System.out.println(a.getName() + "," + a.getAge() + "歲");
a.eat();
System.out.println("--------------");
Dog d = new Dog("黑狗",5);
System.out.println(d.getName() + "," + d.getAge() + "歲");
d.eat();
d.jump();
}
類和接口的關(guān)系
- 類和類的關(guān)系
- 繼承關(guān)系,只能單繼承,但是可以多層繼承
- 類和接口的關(guān)系
- 實(shí)現(xiàn)關(guān)系,可以單實(shí)現(xiàn),也可以多實(shí)現(xiàn),還可以在繼承一個(gè)類的同時(shí)實(shí)現(xiàn)多個(gè)接口
- 接口和接口的關(guān)系
- 繼承關(guān)系,可以單繼承,也可以多繼承
抽象類和接口的區(qū)別
- 成員區(qū)別
- 抽象類: 變量,常量;有構(gòu)造方法;有抽象方法,也有非抽象方法
- 接口: 常量;抽象方法
- 關(guān)系區(qū)別
- 類與類: 繼承,單繼承
- 類與接口: 實(shí)現(xiàn),可以單實(shí)現(xiàn),也可以多實(shí)現(xiàn)
- 接口與接口: 繼承,單繼承,多繼承
- 設(shè)計(jì)理念區(qū)別
- 抽象類: 對(duì)類抽象,包括屬性,行為
- 接口: 對(duì)行為抽象,主要是行為
抽象類名作為形參和返回值
- 方法的形參是抽象類名,其實(shí)需要的是該抽象類的子類對(duì)象
- 方法的返回值是抽象類名,其實(shí)返回的是該抽象類的子類對(duì)象
public abstract class Animal {
public abstract void eat();
}
public class AnimalOperator {
public void useAnimal(Animal a) {
// Animal a = new Cat(); 編譯看左邊,執(zhí)行看右邊
a.eat();
}
public Animal getAnimal() {
Animal a = new Cat();
return a;
}
}
public class Cat extends Animal{
@Override
public void eat()
{
System.out.println("貓吃魚(yú)");
}
}
public static void main(String[] args) {
AnimalOperator ao = new AnimalOperator();
Animal a = new Cat();
ao.useAnimal(a);
Animal a2 = ao.getAnimal();
a2.eat();
}
接口名作為形參和返回值
- 方法的形參是接口名,其實(shí)需要的是該接口的實(shí)現(xiàn)類對(duì)象
- 方法的返回值是接口名,其實(shí)需要返回的是該接口的實(shí)現(xiàn)類對(duì)象
public interface Jumping {
void jump();
}
public class JumpingOperator {
public void useJumping(Jumping j) { // 多態(tài): Jumping j = new Cat();
j.jump();
}
public Jumping getJumping() {
Jumping j = new Cat();
return j;
}
}
public class Cat implements Jumping{
@Override
public void jump()
{
System.out.println("貓?zhí)?);
}
}
public static void main(String[] args) {
JumpingOperator jo = new JumpingOperator();
Jumping j = new Cat();
jo.useJumping(j);
Jumping j2 = jo.getJumping();
j2.jump();
}