介面的概述,特點以及介面和抽象類的區別
第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();
}
}