java接口詳解
/**
* 測試接口 interface
*/
public interface Sheeny {
? ?//接口用interface 不再是class
? ?int LUMINANCE = 2000;
? ?//接口只能定義常量和方法 默認(rèn)修飾 public static final int
? ?void shine();
? ?//和抽象類一樣不寫方法體 默認(rèn)public abstract修飾 子類必須實現(xiàn)
}
interface Long{
? ?void pl();
? ?default void def(){
? ? ? ?System.out.println("接口還可以定義默認(rèn)方法,接口的默認(rèn)方法必須用default修飾");
? ? ? ?System.out.println("默認(rèn)方法必須要有方法體實現(xiàn),子類不必須重寫實現(xiàn),可直接調(diào)用");
? ?}
}
class Mouse implements Sheeny{
? ?//定義類 實現(xiàn)implements 接口 ? ?不再是繼承extends
? ?//Mouse為Sheeny接口的實現(xiàn)類
? ?@Override
? ?public void shine() {
? ? ? ?System.out.println("mouse.shine");
? ?}
}
class Wand implements Long{
? ?@Override
? ?public void pl() {
? ? ? ?System.out.println("Wand.pl");
? ?}
}
class LaserSword implements Sheeny,Long{
? ?//一個類可以實現(xiàn)多個接口
? ?@Override
? ?public void shine() {
? ? ? ?//實現(xiàn)的抽象方法也同樣要求public
? ? ? ?System.out.println("LaserSword.shine");
? ?}
? ?@Override
? ?public void pl() {
? ? ? ?System.out.println("LaserSword.pl");
? ?}
? ?int a = LUMINANCE;
? ?//常量直接調(diào)用
}
class Test{
? ?public static void main(String[] args) {
? ? ? ?Mouse m1 = new Mouse();
? ? ? ?int a = m1.LUMINANCE;
? ? ? ?//和繼承一樣 Mouse實現(xiàn)Sheeny接口后可以通過對象m1.調(diào)用LUMINANCE常量
? ? ? ?Sheeny l1 = new LaserSword();
? ? ? ?//和繼承中的 父類引用指向子類地址 相同 接口可以聲明引用變量類型 不能new創(chuàng)建實例
? ? ? ?a += l1.LUMINANCE;
? ? ? ?//l1.pl()報錯 編譯類型無法使用執(zhí)行時類型的方法
? ? ? ?Wand w1 = new Wand();
? ? ? ?w1.def();
? ? ? ?//Wand類可以直接調(diào)用接口的默認(rèn)方法 也可以重寫
? ?}
}
interface P1{
? ?static void printP1(){
? ? ? ?//接口中可以定義靜態(tài)方法 默認(rèn)修飾 public static
? ? ? ?System.out.println("P1.instance initializer");
? ?}
}
class P2 implements P1{
? ?{
? ? ? ?/*
? ? ? ?printP1()報錯,接口的靜態(tài)方法只能通過接口調(diào)用
? ? ? ?實現(xiàn)類無法直接調(diào)用 這和繼承不同
? ? ? ?繼承中子類可以在類內(nèi)直接調(diào)用父類的靜態(tài)方法
? ? ? ? */
? ?}
}
class P3{
? ?public static void main(String[] args) {
? ? ? ?P1.printP1();
? ? ? ?/*
? ? ? ?P2.printP1()報錯,接口的靜態(tài)方法不屬于實現(xiàn)類
? ? ? ?無法通過實現(xiàn)類調(diào)用接口的靜態(tài)方法 這和繼承不同
? ? ? ?繼承中子類繼承了父類的靜態(tài)方法 通過P1.printP1()或者P2.printP1()都可以調(diào)用該方法
? ? ? ? */
? ?}
}
class P4 implements P1{
? ?static void printP1(){
? ? ? ?System.out.println("實現(xiàn)類可以定義同名靜態(tài)方法,但不屬于重寫");
? ? ? ?System.out.println("該靜態(tài)方法和接口的同名方法是兩個相互無關(guān)的方法");
? ?}
}
interface A1{
? ?void pa1();
}
interface A2{
? ?void pa2();
}
interface A3 extends A1,A2{
? ?//接口可以多繼承 子接口會繼承父接口的一切
? ?void pa3();
}
class A4 implements A3{
? ?//實現(xiàn)類需要實現(xiàn)pa3()以及A3繼承自A1A2的pa1()pa2()
? ?@Override
? ?public void pa1() {
? ?}
? ?@Override
? ?public void pa2() {
? ?}
? ?@Override
? ?public void pa3() {
? ?}
}