1. 程式人生 > >java學習(十二)——介面

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();		
		}
	}
}

執行結果

返回目錄