1.2 介面 1.2.1 介面的概念 介面是一種數據類型,引用數據類型。interface定義介面。 1.1.1 介面的特性 [1] 介面中所有變數都是static final 類型,且都是預設都是public訪問許可權。 [2] 介面沒有構造方法 => 介面不能實例化。 [3] 介面中所有的方法都是 ...
1.2 介面
1.2.1 介面的概念
介面是一種數據類型,引用數據類型。interface定義介面。
public interface 介面名{ }
1.1.1 介面的特性
[1] 介面中所有變數都是static final 類型,且都是預設都是public訪問許可權。
public interface MyInterface { int count = 10; public static final int count2 = 2; }
[2] 介面沒有構造方法 => 介面不能實例化。
[3] 介面中所有的方法都是抽象方法(public abstract)。
public interface AInterface { // void showInfo(); // public abstract void showInfo(); // 推薦寫法 // public void showInfo(); }
[4] A介面中定義的抽象方法可以被一個B類實現。
類B稱為A介面的實現類(implement class)
ð 實現類必須實現介面中的抽象方法
public class ImplClass implements AInterface { @Override public void showAInfo() { } }
一個實現類可以實現多個介面。
public class ImplClass implements AInterface,BInterface{ @Override public void showAInfo() { System.out.println("實現A介面的方法"); } @Override public void showBInfo() { System.out.println("實現B介面的方法"); } }
一個類可以繼承一個類,實現多個介面。繼承在前,實現在後。
public class ImplClass extends AbstractClass implements AInterface,BInterface{ @Override public void showAInfo() { System.out.println("實現A介面的方法"); } @Override public void showBInfo() { System.out.println("實現B介面的方法"); } @Override public void test() { // TODO Auto-generated method stub } }
如果抽象父類定義的方法和介面定義的方法同名時,優先實現父類的同名抽象方法。實際開發規則此現象發生。
[5] 介面可以實現多繼承,實現類如果實現了多繼承的介面,需要把其他介面中的方法都實現。
public interface CInterface extends AInterface,BInterface{ public void test(); }
public class ImplClass implements CInterface{ @Override public void showAInfo() { // TODO Auto-generated method stub } @Override public void showBInfo() { // TODO Auto-generated method stub } @Override public void test() { // TODO Auto-generated method stub } }
總結:
介面定義了一些抽象方法。
ð 實現類實現介面中所有的抽象方法
ð 實現類具有了介面中定義的行為 => 實現類 has a 介面中定義的能力。
ð 介面拓展了實現類的能力
1.1 介面的應用
[1]介面可以實現多態
public class Test01 { public static void main(String[] args) { DriveInterface driveInterface = null; // 介面new實現類 driveInterface = new Student("二狗"); driveInterface.drive(); driveInterface = new Teacher("kallen"); driveInterface.drive(); } }
[2] 介面描述的是一種能力,提現在介面的方法上。
介面中定義的能力都是抽象方法。本身不提供任何實現。
ð 介面本身不關心方法如何實現,完全取決於實現類。
public class FaceDoor extends Door implements LockInterface{ @Override public void open() { System.out.println("自動開門..."); } @Override public void close() { System.out.println("自動關門"); } @Override public void lock() { System.out.println("刷臉上鎖!"); } @Override public void unlock() { System.out.println("刷臉開鎖!"); } }
思考:介面描述一種能力,有何用?
1.1 面向介面編程(A)
public class Test01 { public static void main(String[] args) { InkBoxInterface inkBoxInterface = null; inkBoxInterface = new ColorfulInkBox(); PaperInterface paperInterface = null; paperInterface = new A4Paper(); paperInterface = new B3Paper(); Writer writer = new Writer(paperInterface,inkBoxInterface); writer.print(); } }
介面也表示一種約定(規範),約定實現類應該具備什麼能力。
介面更關心實現類具備什麼能力,而不關心實現類如何實現。
面向介面編程
當完成一個系統性的工程時,需要多個模塊之間進行配合實現。如果一個模塊A需要模塊B、C… 組合實現A模塊的功能時,A模塊需要預留出介面,約定支持模塊應該具備的能力。
當B、C等模塊不在滿足系統需要時,在更換模塊時,新模塊只需要實現A模塊預留的介面即可
抽象類和介面的比較
- 抽象類和介面都是引用數據類型,他們都不能創建對象。
- 他們都可以定義抽象方法,都可以實現多態。但是抽象可以定義非抽象方法,而介面中定義的都是抽象方法。
- 抽象類和介面都具有傳遞性。抽象類是單根性(單繼承),而介面是多繼承。
- 在概念上,都可以重寫抽象方法。子類重寫抽象類,實現類實現介面
- 抽象類和子類解決的是模塊內的問題(代碼重用,重寫,多態)而介面解決的是模塊間的問題 => 高內聚,低耦合。
1.1 Object
Object類是java的所有類的根類。
一個類如果沒有繼承任何類,預設繼承Object
1.1.1 toString
返回對象的字元串表示形式。
public class Test01 { public static void main(String[] args) { Student student = new Student("二狗", 20); // 當直接輸出對象時,預設調用toString方法 System.out.println(student); System.out.println(student.toString()); } }
如果要自定義對象的輸出信息時,可以重寫toString()方法。通過代碼生成即可。
1.1.1 equals
一般用於比較兩個對象是否內容相等。Object預設提供的是比較記憶體地址是否相等。如果要比較內容是否相等,一定要重寫equals()方法。
兩個對象的內容相等的標準:屬性值都相等。
@Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Student other = (Student) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (no == null) { if (other.no != null) return false; } else if (!no.equals(other.no)) return false; return true; }
1.1 內部類
類組織關係
[1] 平行關係。可以在一個文件中定義兩個類。如果是一個文件定義兩個類,一定有一個是主類(public 修飾)。主類一定和文件名保持一致。
public class Student { } class Teacher{ }
[2] 包含關係。可以在一個類中定義另外一個類。
public class Outer { class Inner{ } }
1.1.1 成員內部類
Inner類可以作為Outer類的成員而存在。Inner是Outer類的成員內部類,可以根據業務需要加訪問修飾符。
public class Outer { class Inner{ public void showInfo() { System.out.println("我是Inner:showInfo"); } } }
[1] 創建成員內部類對象
package cn.sxt12.inner; import cn.sxt12.inner.Outer.Inner; public class Test01 { public static void main(String[] args) { // 【1】創建外部類對象 Outer outer = new Outer(); // 【2】創建內部類對象 Inner inner = outer.new Inner(); inner.showInfo(); } }
[2] 成員內部類可以直接訪問外部類的私有屬性(A)。
public class Outer { private String name = "Outer"; class Inner{ public void showInfo() { System.out.println("我是Inner:showInfo"); System.out.println(name); } } }
[3]如果內部類定義了和外部類同名的私有屬性時(C)。
public class Outer { private String name = "Outer"; class Inner{ private String name = "Inner"; public void showInfo() { System.out.println("我是Inner:showInfo"); System.out.println(name); System.out.println(this.name); // 訪問外部類的私有屬性 System.out.println(Outer.this.name); } } }
1.1.1 靜態內部類
如果一個內部類被static修飾,就變成了靜態內部類。
public class Outer { static class Inner{ public void showInfo() { System.out.println("我是Inner:static showInfo"); } } }
[1] 創建靜態內部類對象
package cn.sxt12.staticinner; import cn.sxt12.staticinner.Outer.Inner; public class Test01 { public static void main(String[] args) { Inner inner = new Outer.Inner(); inner.showInfo(); } }
[2] 靜態內部類中可以直接訪問外部類的(私有)靜態成員。(A)
public class Outer { static String name = "outer"; static class Inner{ public void showInfo() { System.out.println("我是Inner:static showInfo"); System.out.println(name); } } }
[3] 靜態內部類定義了和外部類同名的靜態屬性時(C)
public class Outer { static String name = "outer"; static class Inner{ static String name = "inner"; public void showInfo() { System.out.println("我是Inner:static showInfo"); // 預設訪問內部類 System.out.println(name); System.out.println(Inner.name); System.out.println(Outer.name); } } }
1.1.1 方法內部類
如果一個類定義方法中,這個類稱為方法內部類。
public class Outer { public void test() { class Inner{ public void showInfo() { System.out.println("method:inner class"); } } } }
[1] 創建方法內部類對象
public class Outer { public void test() { class Inner{ public void showInfo() { System.out.println("method:inner class"); } } // Inner inner = new Inner(); // inner.showInfo(); // 匿名對象(只使用一次的對象) new Inner().showInfo(); } }
[2]方法內部類中的方法可以直接訪問方法的局部變數。
public class Outer { public void test() { // 方法的局部變數 int a = 10; class Inner{ public void showInfo() { System.out.println("method:inner class"); System.out.println("a="+a); // a = 100;(error) } } new Inner().showInfo(); } }
總結:
在方法中的局部變數進入方法內部類時被加了final修飾。在方法內部類中只能讀取方法的局部變數,不能修改。
思考:在方法內部類中定義同名的局部變數時,該如何訪問?(C)
1.1.1 匿名內部類(A)
當一個類只使用一次時,可以把這個類聲明為匿名類。
匿名類一般在方法中使用,形成方法匿名內部類,簡稱匿名內部類。
匿名內部類一般只使用一次。
匿名內部類在形式上一定會出現:實現介面(implement)
public class Outer { public void test() { /* class Inner implements MyInterface{ @Override public void showInfo() { System.out.println("showinfo"); } } new Inner().showInfo(); */ // 匿名內部類 new MyInterface(){ @Override public void showInfo() { System.out.println("showinfo"); } }.showInfo(); } }