接口(上篇)
- 1.概念
- 2.語法規則
- 3.使用和特性
- 4.實現多接口
- 5.接口間繼承
1.概念
接口就是公共的行為規范標準,大家在實現時,
只要符合規范標準,就可以通用。
在Java中,接口可以看成是:多個類的公共規范,是一種引用數據類型
2.語法規則
接口的定義格式與定義類的格式基本相同,
將class關鍵字換成 interface 關鍵字,就定義了一個接口
3.使用和特性
接口不能直接使用,必須要有一個"實現類"來"實現"該接口,
實現接口中的所有抽象方法
- 接口類型是一種引用類型,但是不能直接new接口的對象
- 接口中每一個方法都是public的抽象方法,
即接口中的方法會被隱式的指定為 public abstract - 接口中的方法是不能在接口中實現的,只能由實現接口的類來實現
- 重寫接口中方法時,不能使用默認的訪問權限
- 接口中可以含有變量,
但是接口中的變量會被隱式的指定為 public static ?nal 變量 - 接口中不能有靜態代碼塊和構造方法
- 接口雖然不是類,但是接口編譯完成后字節碼文件的后綴格式也是.class
- 如果類沒有實現接口中的所有的抽象方法,則類必須設置為抽象類
- jdk8中:接口中還可以包含default方法
public class Computer {public void powerOn() {System.out.println("打開電腦...");}public void powerOff() {System.out.println("關閉電腦.....");}public void useDevice(IUSB iusb) {iusb.openDevice();if(iusb instanceof KeyBoard ) {KeyBoard keyBoard = (KeyBoard)iusb;keyBoard.input();}if(iusb instanceof Mouse) {Mouse mouse = (Mouse)iusb;mouse.click();}iusb.closeDevice();}
}
public interface IUSB {void openDevice();void closeDevice();//public abstract
}
public class KeyBoard implements IUSB{@Overridepublic void openDevice() {System.out.println("打開鍵盤服務....");}public void input() {System.out.println("鍵盤輸入數據.....");}@Overridepublic void closeDevice() {System.out.println("關閉鍵盤服務....");}
}
public abstract class MicroPhone implements IUSB{public abstract void test();
}class ITest extends MicroPhone {@Overridepublic void openDevice() {}@Overridepublic void closeDevice() {}@Overridepublic void test() {}
}
public class Mouse implements IUSB{@Overridepublic void openDevice() {System.out.println("打開鼠標服務...");}public void click() {System.out.println("點擊鼠標.....");}@Overridepublic void closeDevice() {System.out.println("關閉鼠標服務...");}
}
public class Test {public static void main(String[] args) {Computer computer = new Computer();computer.powerOn();computer.useDevice(new KeyBoard());computer.useDevice(new Mouse());computer.powerOff();}}
4.實現多接口
在Java中,類和類之間是單繼承的,一個類只能有一個父類,
即Java中不支持多繼承,但是一個類可以實現多個接口
public abstract class Animal {public String name;public int age;public Animal(String name, int age) {this.name = name;this.age = age;}public abstract void eat();//如果把 跑 游泳 飛 這些功能寫到這里面 可以不可以 1:可以 2:不可以 -》 2// 不是所有的動物 都具備 這些功能
}
public class Bird extends Animal implements IFlyable{public Bird(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(this.name+" 正在吃鳥糧....");}@Overridepublic void fly() {System.out.println(this.name+" 正在飛....");}
}
public class Dog extends Animal implements ISwimmable,IRunable {public Dog(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(this.name+" 正在吃狗糧.....");}@Overridepublic void run() {System.out.println(this.name+" 正在跑...");}@Overridepublic void swim() {System.out.println(this.name+" 正在游泳...");}}
public class Duck extends Animal implements IFlyable,IRunable,ISwimmable{public Duck(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(this.name+" 正在鴨糧....");}@Overridepublic void fly() {System.out.println(this.name+" 正在飛....");}@Overridepublic void run() {System.out.println(this.name+" 正在跑....");}@Overridepublic void swim() {System.out.println(this.name+" 正在游泳....");}
}
public interface IFlyable {void fly();
}
public interface IRunable {void run();
}
public interface ISwimmable {void swim();
}
public class Robot implements IRunable{@Overridepublic void run() {System.out.println("機器人在跑.....");}
}
public class TestDemo {public static void walk(IRunable runable) {runable.run();}public static void swim(ISwimmable iSwimmable) {iSwimmable.swim();}public static void fly(IFlyable iFlyable) {iFlyable.fly();}public static void main(String[] args) {Bird bird = new Bird("小鳥·",3);Dog dog = new Dog("小狗",13);Duck duck = new Duck("小鴨",5);Robot robot = new Robot();walk(duck);walk(dog);walk(robot);System.out.println("=====");swim(duck);swim(dog);System.out.println("====");fly(duck);fly(bird);}public static void eatFun(Animal animal) {animal.eat();}}
5.接口間繼承
在Java中,類和類之間是單繼承的,一個類可以實現多個接口,接口與接口之間可以多繼承
interface A {void testA();
}
interface B {void testB();
}
//extends 拓展
interface C extends A,B {void testC();
}public class TestDemo2 implements C{@Overridepublic void testA() {}@Overridepublic void testB() {}@Overridepublic void testC() {}
}