java學習(十二)——介面
介面
介面是對類的一組需求的描述,這些類需要遵從介面描述的統一格式進行定義。
介面是一系列方法的宣告,是一些方法特徵的集合,一個介面只有方法的特徵沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行為。
作用:如果某個類實現了某個介面,那麼這個類就可以提供介面所描述的服務。
好處:Java不支援類多繼承(多繼承會讓語言本身變得非常複雜,效率也會降低)。在Java中每個類只能拓展與一個類,但是可以實現多個介面。介面可以提供多重繼承的大多數好處,同時還能避免多重繼承的複雜性和低效性。
介面的定義
java使用關鍵字interface來定義一個介面
格式
[修飾符] interface 介面名 { [public] [static] [final] 常量; [public] [abstract] 方法; }
特點
- 介面中所有的方法自動屬於public,因此可以省略。
- 介面中不能包含例項域或靜態方法,但可以包含常量。介面中的域會被自動設為public static final。
注:介面中還可以有靜態方法和預設方法。這是在 java SE 8之後引進的。
//宣告一個公共型別的介面
interface Animalable
{
int legs=4;
void eatFood();
//等價於下面
//public static final int legs=4;
//public abstract void eatFood();
}
介面的實現
介面定義中的抽象方法應該由使用該介面的類去實現(本質上是覆蓋方法)。
格式:
[修飾符] class 類名 implements 介面列表 //多個介面之間用逗號隔開 { //例項域 //成員方法 //介面的實現 }
class Cat implements Animalable
{
private int age;
public Cat(int age)
{
this.age=age;
}
public int getAge()
{
return age;
}
//void eatFood() //error:Cat中的eatFood()無法實現Animalable中的eatFood(),正在嘗試分配更低的訪問許可權:以前為public
public void eatFood() //實現介面Animalable中的eatFood方法
{
System.out.println("貓吃老鼠");
}
}
介面的繼承:介面可以實現多繼承。
格式:
[修飾符] interface 介面名 extends 父類介面列表{ [public] [static] [final] 常量; [public] [abstract] 方法; }
interface A
{
int a=0;
int sum();
}
interface B extends A
{
int b=1;
void showB();
}
interface C extends A,B //如果一個介面繼承多個父介面,則父介面之間用逗號隔開
{
int c=3;
void showC();
}
class D implements C
{
public int sum()
{
return a+b+c;
}
public void showB()
{
System.out.println("b="+b);
}
public void showC()
{
System.out.println("c="+c);
}
}
class InterfanceTest
{
public static void main(String[] args)
{
D d=new D();
System.out.println("a="+d.a+",b="+d.b+",c="+d.c+",a+b+c="+d.sum());
d.showB();
d.showC();
}
}
執行結果
為什麼介面可以實現多繼承而類不可以實現多繼承呢?
假設類可以實現多繼承 類A:有方法int sum(int a,int b){...} 類B:有方法int sum(int a,int b){...} 類C繼承了類A和類B。那麼,類C具有類A的sum方法,同時也有類B的sum方法。如果呼叫C的sum方法,系統不知道應該呼叫A類的sum()方法還是B類的sum()方法。 但是當使用介面時, 介面A:有方法int sum(int a,int b); 介面B:有方法int sum(int a,int b); 介面中的所有方法都是抽象的,sum方法的具體實現是由實現介面的類去實現的,不可能存在歧義。所有Java允許介面多繼承。
例項:物件陣列排序(實現Comparable介面)
Arrays 類中sort方法可以對實現 Comparable 介面的類的物件進行排序。Arrays.sort(Object[] a):根據元素的自然順序對指定物件陣列進行升序排序Comparable介面:該介面對實現它的每個類物件強加一個整體排序。這個排序被稱為類的自然排序,類的compareTo方法被稱為其自然比較方法。
interface Comparable
{
int compareTo(Object o);
/* 自然比較方法
作用:比較此物件與指定物件的順序.如果該物件小於、等於或者大於指定物件,則分別返回負整數、零或正整數。
*/
}
現在Comparable介面已經改進為泛型介面
interface Comparable<T>
{
int compareTo(T o);
}
import java.util.Arrays;
class Student implements Comparable
{
private String name;
private int no; //學號
private int age; //年齡
public Student(){
}
public Student(int no,int age,String name)
{
this.no=no;
this.age=age;
this.name=name;
}
public String toString()
{
return "學號:"+no+",名字:"+name+",年齡:"+age;
}
//對Comparable介面中的所有方法進行定義
public int compareTo(Object o)
{
Student other=(Student)o;
return this.no-other.no;
}
}
public class InterfaceDemo
{
public static void main(String[] args)
{
Student[] s=new Student[4];
s[0]=new Student(3,14,"張三");
s[1]=new Student(2,15,"李四");
s[2]=new Student(4,22,"王五");
s[3]=new Student(1,18,"葉葉");
System.out.println("-----排序前--------");
for(Student temp:s)
{
System.out.println(temp.toString());
}
Arrays.sort(s);
System.out.println("-----排序後--------");
for(Student temp:s)
{
System.out.println(temp.toString());
}
}
}
Student類 實現泛型介面
public class Student implements Comparable<Student>
{
//Comparable泛型介面的實現
public int compareTo(Student o)
{
return this.no-o.no;
}
}
執行結果
介面實現多型
interface Animalable
{
int age=0;
public void eat();
}
class Cat implements Animalable
{
public int age=4;
public void eat()
{
System.out.println("貓吃老鼠");
}
public void playGame()
{
System.out.println("貓喜歡玩毛線球");
}
}
class Dog implements Animalable
{
public int age=3;
public void eat()
{
System.out.println("狗啃骨頭");
}
}
class Pig implements Animalable
{
public void eat()
{
System.out.println("豬吃白菜");
}
}
class DuoTai3
{
public static void main(String[] args)
{
Animalable s=new Dog();
System.out.println(s.age); //呼叫的是介面的常量
s.eat();
System.out.println("-------------");
s=new Pig();
System.out.println(s.age); //呼叫的是介面的常量
s.eat();
System.out.println("-------------");
s=new Cat();
System.out.println(s.age); //呼叫的是介面的常量
s.eat();
System.out.println("-------------");
if(s instanceof Cat)
{
Cat d=(Cat)s;
System.out.println(d.age);
d.eat();
d.playGame();
}
}
}
執行結果