標籤:
---恢複內容開始---
1、物件導向
三大特性:封裝、繼承、多態
面向過程-想到啥做啥
物件導向-整體化分析,再分塊製作。
發生變化時,面向過程可能要推倒重做,物件導向則可以適應變化
1.1封裝:Encapsulation
(1)把對象的屬性和行為看成一個密不可分的整體,將這兩者“封裝”在一個不可分割的獨立單位(對象)中。
(2)把不需要讓外界知道的資訊隱藏起來,有些對象的屬性及行為允許外界使用者知道或使用,但不允許更改,而另一些屬性或行為,則不允許外界知道,或只允許使用對象的功能,而儘可能隱蔽對象的功能實現細節。
另一個特點,為封裝在一個整體內的變數及方法規定不同層級的“可見度”或存取權限
1.2繼承:
(1)提高代碼複用性,提高開發效率。
(2)首先擁有反映事物一般特性的類,然後再其基礎上派生出反映特殊事物的類。
(3)若子類只允許繼承一個父類,則稱為單繼承;若允許繼承多個父類,則稱為多繼承。java通過介面(interface)的方式來彌補因java不支援多繼承而帶來的子類不能想用多個父類的成員的缺點。
1.3多態性:
允許程式中出現重名現象。使程式的抽象程度和簡潔程度更高,有助於程式設計人員對程式的分組協同開發。
(1)方法重載
(2)對象多態,子類對象與父類對象進行相互轉換,而且根據其使用的子類的不同,完成的功能也不同。
PS:面試關於對象
面試官需要尋找具有專業編程功能的人來完成公司工作
我就是那個對象,具備這個功能
你就是在指揮我,就是在使用我的專業技能
當然,我不禁具備專業編程技能,還會一些更多的。
一切皆對象,萬物皆對象。
2、多個引用指向同一個對象,一變全變。
3、成員變數和局部變數
成員變數作用於整個類,
局部變數作用於函數中,或語句中。
成員變數在堆記憶體中,因對象存在而存在
局部變數,棧記憶體
4、匿名對象
new Car().num=5;//執行完變垃圾
new Car().color="blue";//執行完變垃圾
new Car().run;
使用方式
(1)當對對象的方法只調用一次時可用,較簡化。
若對一個對象進行多個成員調用,必須給對象起名字
(2)可將匿名對象作為實際參數進行傳遞
且調用過後,會自動變為垃圾,釋放記憶體
5、封裝
5.1、私人private(僅是封裝的一種形式)
許可權修飾符,用於修飾類中的成員(成員變數,成員函數)
私人只在本類中有效
可提供方法來訪問,在方法中加判斷等語句。
提高代碼的健壯性
6、建構函式
作用:對象的初始化(沒寫的話都內建空參數的建構函式)
多個建構函式是以重載的形式存在
6.1、建構函式與一般函數比較
建構函式在對象已建立就運行,給對象初始化。 只運行一次
一般函數是對象調用才執行,給對象添加其具備的功能。 可調用多次
7、構造代碼塊
{}//沒函數名
作用: 給對象初始化
對象一建立就運行,優先於建構函式。
區別: 構造代碼塊是對所有對象進行統一初始化,
而建構函式是給對應的對象初始化。
8、this關鍵字
8.1、哪個對象調用this所在的函數,this代表哪個對象
定義類功能時,該函數內部要用到該函數的對象時,這時用this來表示這個對象
1 package learn; 2 3 class Person{ 4 private String name; 5 private int age; 6 Person(int age) 7 { 8 this.age=age; 9 }10 public void speak(){11 System.out.println("name="+name+"...age="+age);12 }13 public boolean compare(Person p)14 {15 return this.age==p.age;//相當於p1.age==p2.age;16 }17 }18 19 public class PersonDemo3 {20 public static void main(String[] args){21 Person p=new Person(40);22 Person p2=new Person(20);23 System.out.print(p.compare(p2));24 }25 26 }
8.2、建構函式之間調用,可用this
不過this()語句需要放在第一行。即初始化動作需要第一行執行,有更細緻的初始化則使用更細緻的。
9、靜態static
修飾符,用於修飾成員(成員變數,成員函數),共性變數,存放於方法區
調用方式+1: 類名.靜態變數
9.1特點
(1)隨著類的載入而載入,隨著類的消失而消失即生命週期長(弊端1)
(2)優先於對象存在
(3)被所有對象共用(利處2)
(4)可以直接被類名調用(利處3)
9.2、類變數和執行個體變數
類變數隨著類的載入而存在於方法區中(利處1)
執行個體變數隨著對象的建立而存在於堆記憶體中
9.3、靜態方法
靜態方法只能訪問靜態成員,不可用this,super關鍵字。(弊端2)
ps:相當於有了類名.
9.4、main函數
main不是關鍵字,只是可被jvm識別的特殊單詞
public static void main(String[] args)唯一可改args
傳入的是new String[0]
1 package learn; 2 3 public class MainDemo { 4 public static void main(String[] args) 5 { 6 String[] arr={"hah","hehe","heihei","xixi","hiahia"}; 7 MainTest.main(arr); 8 } 9 }10 class MainTest{11 public static void main(String[] args)12 {13 for(int x=0;x<args.length;x++)14 {15 System.out.println(args[x]);16 }17 }18 }
9.5何時使用靜態
共用資料--靜態變數
功能內部沒有訪問到非待用資料--靜態方法
工具類私人化,包括建構函式都私人化,只通過類名調用。
10、調用他人的class時,記得設定classpath=.;c\class;(記得保留當前路徑)
11、文檔
必須為public類
javadoc -d myhelp -author -version ArrayTool.java
產生處的文檔名 作者,版本號碼可不加 文檔依據的源檔案
index檔案開始查看
12、靜態代碼塊
隨著類的載入而執行,只執行一次,用於給類初始化,無法含有非靜態內容,優先於主函數
1 package learn;//執行結果 ac9d 2 3 class StaticCode{ 4 int num=9; 5 StaticCode() 6 { 7 System.out.println("b"); 8 } 9 10 static{11 System.out.println("a");12 }13 14 {15 System.out.println("c"+num);16 }17 18 StaticCode(int x)19 {20 System.out.println("d");21 }22 23 public static void show(){24 System.out.println("show run");25 }26 }27 28 public class StaticCodeDemo{29 public static void main(String[] args){30 new StaticCode(4);31 } 32 }
13、執行順序
1、因new用到了Person.class,所以會先找到Person.class檔案並載入到記憶體中。
2、執行該類中的static代碼塊
3、在堆記憶體中開闢空間,分配記憶體位址。
4、在堆記憶體中建立對象的特有屬性,並進行預設初始化。
5、對屬性進行顯式初始化
6、對對象進行構造代碼塊初始化
7、對對象對應的建構函式初始化
8、將記憶體位址賦給棧記憶體的p變數。
14、單例模式-一個類中只存在一個對象
14.1特點
(1)禁止其他程式建立該類對象--將建構函式私人化
(2)讓其他程式能訪問該類對象--類中建立一個本類對象
(3)方便其他程式對對象的訪問--可以對外提供一些訪問方式(只有這個進出口)
保證對象在記憶體中唯一才用到
餓漢式:
Single類一進記憶體就已經建立好了對象
1 package learn; 2 3 class Single{ 4 private int num; 5 public void setNum(int num) 6 { 7 this.num=num; 8 } 9 public int getNum()10 {11 return num;12 }13 private Single(){}14 private static Single s=new Single();15 public static Single getInstance(){16 return s;17 }18 }19 public class SingleDemo {20 public static void main(String[] args)21 {22 Single s1=Single.getInstance();23 Single s2=Single.getInstance();24 s1.setNum(40);25 System.out.print(s2.getNum());26 }27 }
懶漢式:
Single類進記憶體,對象還不存在,只在調用了getInstance方法時,才建立對象.
1 package learn; 2 class Single2{ 3 private static Single2 s=null; 4 private Single2(){}; 5 public static Single2 getInstance(){ 6 if(s==null)//此處兩條語句執行,容易因cpu多線程導致報錯。具體解決見多線程。故除面試外,多用餓漢式 7 s=new Single2(); 8 return s; 9 }10 }11 public class SingleDemo2 {12 public static void main(String[] args){13 Single2 s2=Single2.getInstance();14 }15 }
java學習(62-83)