1. 程式人生 > >介面的概述,特點以及介面和抽象類的區別

介面的概述,特點以及介面和抽象類的區別

第1章 介面
1.1 介面的概述
介面是功能的集合,同樣可看做是一種資料型別,是比抽象類更為抽象的”類”。
介面只描述所應該具備的方法,並沒有具體實現,具體的實現由介面的實現類(相當於介面的子類)來完成。這樣將功能的定義與實現分離,優化了程式設計。

1.2 介面的格式&使用
1.2.1 介面的格式
與定義類的class不同,介面定義時需要使用interface關鍵字。
定義介面所在的仍為.java檔案,雖然宣告時使用的為interface關鍵字的編譯後仍然會產生.class檔案。這點可以讓我們將介面看做是一種只包含了功能宣告的特殊類。
定義格式:

    public interface 介面名 {
    抽象方法1;
    抽象方法2;
    抽象方法3;
    }

1.2.2 介面的使用
介面中的方法全是抽象方法,直接new介面來呼叫方法沒有意義,Java也不允許這樣幹
類與介面的關係為實現關係,即類實現介面。實現的動作類似繼承,只是關鍵字不同,實現使用implements
其他類(實現類)實現介面後,就相當於宣告:”我應該具備這個介面中的功能”。實現類仍然需要重寫方法以實現具體的功能。
格式:

class 類 implements 介面 {
	重寫介面中方法
} 

在類實現介面後,該類就會將介面中的抽象方法繼承過來,此時該類需要重寫該抽象方法,完成具體的邏輯。

1.2.3 案例程式碼一:

    package demo;
    /*
     * Java語言的繼承是單一繼承,一個子類只能有一個父類(一個兒子只能有一個親爹)
     * Java語言給我們提供了一種機制,用於處理繼承單一的侷限性的,介面
     * 
     * 介面:介面是一個比抽象類還抽象的類,接口裡所有的方法全是抽象方法,介面和類的關係是實現,implements
     * interface
     * 
     * 格式:
     * 		interface 介面名 {
     * 
     * 		}
     * 
     */
    public class InterfaceDemo {
    	public static void main(String[] args) {
    		BillGates gates = new BillGates();
    		gates.code();
    	}
    }    
    
    class Boss {
    	public void manage() {
    		System.out.println("管理公司");
    	}
    }
    
    class Programmer {
    	public void code() {
    		System.out.println("敲程式碼");
    	}
    }
    
    //比爾蓋茨
    class BillGates extends Programmer {
    }

1.3 介面中成員的特點
1、介面中可以定義變數,但是變數必須有固定的修飾符修飾,public static final 所以介面中的變數也稱之為常量,其值不能改變。後面我們會講解fnal關鍵字
2、介面中可以定義方法,方法也有固定的修飾符,public abstract
3、介面不可以建立物件。
4、子類必須覆蓋掉介面中所有的抽象方法後,子類才可以例項化。否則子類是一個抽象類。
1.3.1 案例程式碼二:

     package com.itheima_01;
    /*
     * 介面的成員特點:
     * 		只能有抽象方法
     * 		只能有常量
     * 		預設使用public&abstract修飾方法
     * 		只能使用public&abstract修飾方法
     * 		預設使用public static final來修飾成員變數
     * 
     * 建議:建議大家手動的給上預設修飾符
     * 
     * 注意:
     * 		介面不能建立物件(不能例項化)
     * 		類與介面的關係是實現關係,一個類實現一個介面必須實現它所有的方法
    
     */
    public class InterfaceDemo2 {
    	public static void main(String[] args) {
    		//Animal a = new Animal();
    		//Animal.num;
    	}
    }
    
    
    interface Animal {
    	public static final int num = 10;
    	
    	public abstract void eat();
    }
    
    class Cat implements Animal {
    
    	public void eat() {
    		
    	}    	
    }

1.4 介面和類的關係
A:類與類之間:繼承關係,一個類只能直接繼承一個父類,但是支援多重繼承
B:類與介面之間:只有實現關係,一個類可以實現多個介面
C:介面與介面之間:只有繼承關係,一個介面可以繼承多個介面
1.4.1 案例程式碼三:

         package com.itheima_01;
    /*
     * 
     * 類與類:繼承關係,單一繼承,多層繼承
     * 類與介面:實現關係,多實現
     * 介面與介面的關係:繼承關係,多繼承
     */
    public class InterfaceDemo3 {
    	public static void main(String[] args) {
    		
    	}
    }
    
    interface InterA extends InterB {
    	public abstract void method();
    }
    
    interface InterB {
    	public abstract void function();
    }
    
    interface InterC extends InterA {
    	
    }
    
    class Demo implements InterC {
    
    	@Override
    	public void method() {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void function() {
    		// TODO Auto-generated method stub
    		
    	}
    }

1.5 介面的思想
前面學習了介面的程式碼體現,現在來學習介面的思想,接下里從生活中的例子進行說明。
舉例:我們都知道電腦上留有很多個插口,而這些插口可以插入相應的裝置,這些裝置為什麼能插在上面呢?主要原因是這些裝置在生產的時候符合了這個插口的使用規則,否則將無法插入介面中,更無法使用。發現這個插口的出現讓我們使用更多的裝置。
介面的出現方便後期使用和維護,一方是在使用介面(如電腦),一方在實現介面(插在插口上的裝置)。例如:筆記本使用這個規則(介面),電腦外圍裝置實現這個規則(介面)。
集合體系中大量使用介面
Collection介面
List介面
ArrayList實現類
LinkedList實現類
Set介面

1.6 介面優點
1.類與介面的關係,實現關係,而且是多實現,一個類可以實現多個介面,類與類之間是繼承關係,java中的繼承是單一繼承,一個類只能有一個父類,打破了繼承的侷限性。
2.對外提供規則(USB介面)
3.降低了程式的耦合性(可以實現模組化開發,定義好規則,每個人實現自己的模組,提高了開發的效率)

1.7 介面和抽象類的區別
1.共性:
不斷的進行抽取,抽取出抽象的,沒有具體實現的方法,都不能例項化(不能建立物件)
2.區別1: 與類的關係
(1)類與介面是實現關係,而且是多實現,一個類可以實現多個介面,類與抽象類是繼承關係,Java中的繼承是單一繼承,多層繼承,一個類只能繼承一個父類,但是可以有爺爺類
(2)區別2: 成員
a.成員變數
抽象類可以有成員變數,也可以有常量
介面只能有常量,預設修飾符public static final
b.成員方法
抽象類可以有抽象方法,也可以有非抽象方法
介面只能有抽象方法,預設修飾符 public abstract
c.構造方法
抽象類有構造方法,為子類提供
介面沒有構造方法
1.8 運動員案例
在這裡插入圖片描述

1.8.1 案例程式碼四:

    //Person類
    package com.demo;
    
    public class Person {
    	private String name;//姓名
    	private int age;//年齡
    	private String gender;//性別
    	
    	public Person() {
    		super();
    		// TODO Auto-generated constructor stub
    	}
    	public Person(String name, int age, String gender) {
    		super();
    		this.name = name;
    		this.age = age;
    		this.gender = gender;
    	}
    	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 String getGender() {
    		return gender;
    	}
    	public void setGender(String gender) {
    		this.gender = gender;
    	}
    	
    	public void eat() {
    		System.out.println("吃飯...");
    	}
    	
    	public void sleep() {
    		System.out.println("Zzz....");
    	}	
    }
    //Player類
    package com.demo;
    
    //運動員
    public abstract class Player extends Person {
    	//學習
    	public abstract void study();
    }
    //Coach類
    package com.demo;
    
    //教練
    public abstract class Coach extends Person {
    	//教
    	public abstract void teach();
    }

    //PingPangPlayer類
    package com.demo;
    
    public class PingPangPlayer  extends Player {
    
    	@Override
    	public void study() {
    		System.out.println("學習抽球");
    	}
    
    }
    // BasketbalPlayer類
    package com.demo;
    
    public class BasketbalPlayer extends Player implements SpeakEnglish{
    
    	@Override
    	public void study() {
    		System.out.println("學習扣籃");
    	}
    
    	@Override
    	public void speak() {
    		System.out.println("說英語");
    	}
    }
    // PingPangCoach類
    package com.demo;
    
    public class PingPangCoach extends Coach{
    
    	@Override
    	public void teach() {
    		System.out.println("教抽球");
    	}
    }
    // BasketbalCoach類
    package com.demo;
    
    public class BasketbalCoach extends Coach implements SpeakEnglish{
    
    	@Override
    	public void teach() {
    		System.out.println("教扣籃");
    	}
    
    	@Override
    	public void speak() {
    		System.out.println("說英語");
    	}    
    }
    // SpeakEnglish類
    package com.demo;
    
    public interface SpeakEnglish {
    	public abstract void speak();
    }
    // InterfaceTest類
    package com.demo;
    /* 	
     * 	籃球運動員和教練
    	乒乓球運動員和教練
    	現在籃球運動員和教練要出國訪問,需要學習英語
    	請根據你所學的知識,分析出來哪些是類,哪些是抽象類,哪些是介面
     */
    public class InterfaceTest {
    	public static void main(String[] args) {
    		//建立籃球運動員的物件
    		BasketbalPlayer bp = new BasketbalPlayer();
    		bp.setName("女兆日月");
    		bp.setAge(35);
    		bp.setGender("男");
    		bp.eat();
    		bp.study();
    		bp.speak();
    		System.out.println("------------");
    		
    		//建立乒乓球教練
    		PingPangCoach ppc = new PingPangCoach();
    		ppc.setName("劉胖子");
    		ppc.setAge(40);
    		ppc.setGender("男");
    		ppc.eat();
    		ppc.teach();
    		
    		
    	}
    }