JAVA物件導向的三大特性 封裝,java物件導向
將類的某些資訊隱藏在類內部,不允許外部程式直接存取,而是通過該類提供的方法來實現對隱藏資訊的操作和訪問。優點:1隻能通過規定的方法訪問資料。2隱藏類的執行個體細節,方便修改和實現。
1 public class HelloWorld {2 private int a =1;3 public int getA() {4 return a;5 }6 public void setA(int a) {7 this.a = a;8 }9 }
封裝的實現步驟:修改屬性的可見度------private建立getter/setter方法------用於屬性讀寫在getter/setter方法中加入屬性控制語句(對屬性值得合法性進行判斷)
java中的包包的作用 :管理java檔案,解決同名檔案衝突。定義包:package包名(必須放在java來源程式的第一行,包名間可以使用"."號隔開)
java中的存取修飾詞存取修飾詞-----可以修飾實行和方法的存取範圍
java的this關鍵字1 this關鍵字代表當前對象:this.屬性 操作當前對象的屬性。this.方法 調用當前對象的方法。2 封裝對象的屬性的時候,經常會使用this關鍵字
java中的內部類內部類(InnerClass)就是定義在另外一個類裡面的類,與之對應,包含內部類的類稱為外部類內部類的主要作用:1 內部類提供了更好的封裝,可以把內部類隱藏在外部類之內,不允許同一個包中的其他類訪問該類2 內部類的方法可以直接存取外部類的所有資料,包括私人的資料3 內部類所實現的功能使用外部類同樣可以實現,只是使用內部類更方便 內部類的種類:(1)在內部類中最常見的就是成員內部類,也稱普通內部類*內部類定義在外部類的內部,相當於外部類的一個成員變數的位置,內部類可以使用任意存取控制符,如public protected private等
1 package com.lx; 2 public class lx1 { 3 int a =1; 4 public void a1(){ 5 System.out.println("我是外部類的方法!"); 6 } 7 public class lx2{ 8 int a = this.a; 9 }10 }
1 package com.lx;2 import com.lx.lx1.lx2;3 public class lx3 {4 lx1 l1 = new lx1();5 lx2 l2 = new lx2();6 } *內部類中定義的方法可以直接存取外部類中的資料不受存取控制符的影響,可以直接存取外部類中的私人屬性*定義了成員內部類後,必須使用外部類對象來建立內部類對象,而不能直接去new一個內部類對象 即:內部類 對象名= 外部類 對象.new 內部類();*編譯上面的程式後,就會發現產生了兩個.class檔案,內部類檔案.class檔案和外部類的.class檔案成員內部類的.class檔案總是這樣:外部類名$內部類名.class 注意:外部類是不能直接使用內部類的成員變數和方法,可以先建立內部類的對象,然後通過內部類的對象來訪問其成員變數和方法。如果外部類和內部類具有相同的成員變數或方法,內部類預設訪問自己的成員變數或方法,如果要訪問外部類的成員變數或方法,可以使用this關鍵字。 (2)靜態內部類靜態內部類是Static修飾的內部類,這種內部類的特點:*靜態內部類不能直接存取外部類的非靜態成員,但可以通過"new 外部類()"成員的方式訪問。*如果外部類的靜態成員與內部類的成員名稱相同,可以通過"類名.靜態成員"訪問外部類的靜態成員如果外部類的靜態成員與內部類的成員名不同,則可以通過"成員名"直接調用外部類的靜態成員。*建立靜態內部類的對象時,不需要外部類的對象可以直接建立。內部類 name = new 內部類(); (3)方法內部類方法內部類就是內部類定義在外部類中的方法中,方法內部類只在該方法的內部可見,即只在該方法內可以使用。注意:由於方法內部類不能再外部類的方法以外的地方使用,因此方法內部類不能使用存取控制符和Static修飾符。 (4)匿名內部類匿名內部類也就是沒有名字的內部類正因為沒有名字,所以匿名內部類只能使用一次,它通常用來簡化代碼編寫但使用匿名內部類還有個前提條件:必須繼承一個父類或實現一個介面執行個體1:不使用匿名內部類來實現抽象方法
1 abstract class Person { 2 public abstract void eat(); 3 } 4 5 class Child extends Person { 6 public void eat() { 7 System.out.println("eat something"); 8 } 9 }10 11 public class Demo {12 public static void main(String[] args) {13 Person p = new Child();14 p.eat();15 }16 }運行結果:eat something可以看到,我們用Child繼承了Person類,然後實現了Child的一個執行個體,將其向上轉型為Person類的引用但是,如果此處的Child類只使用一次,那麼將其編寫為獨立的一個類豈不是很麻煩?這個時候就引入了匿名內部類 執行個體2:匿名內部類的基本實現
1 abstract class Person { 2 public abstract void eat(); 3 } 4 5 public class Demo { 6 public static void main(String[] args) { 7 Person p = new Person() { 8 public void eat() { 9 System.out.println("eat something");10 }11 };12 p.eat();13 }14 }運行結果:eat something可以看到,我們直接將抽象類別Person中的方法在大括弧中實現了這樣便可以省略一個類的書寫 並且,匿名內部類還能用於介面上執行個體3:在介面上使用匿名內部類
1 interface Person { 2 public void eat(); 3 } 4 5 public class Demo { 6 public static void main(String[] args) { 7 Person p = new Person() { 8 public void eat() { 9 System.out.println("eat something");10 }11 };12 p.eat();13 }14 }運行結果:eat something由上面的例子可以看出,只要一個類是抽象的或是一個介面,那麼其子類中的方法都可以使用匿名內部類來實現最常用的情況就是在多線程的實現上,因為要實現多線程必須繼承Thread類或是繼承Runnable介面 執行個體4:Thread類的匿名內部類實現
1 public class Demo { 2 public static void main(String[] args) { 3 Thread t = new Thread() { 4 public void run() { 5 for (int i = 1; i <= 5; i++) { 6 System.out.print(i + " "); 7 } 8 } 9 };10 t.start();11 }12 }運行結果:1 2 3 4 5 執行個體5:Runnable介面的匿名內部類實現
1 public class Demo { 2 public static void main(String[] args) { 3 Runnable r = new Runnable() { 4 public void run() { 5 for (int i = 1; i <= 5; i++) { 6 System.out.print(i + " "); 7 } 8 } 9 };10 Thread t = new Thread(r);11 t.start();12 }13 }運行結果:1 2 3 4 5