Java程序设计学习笔记(一)
?
時間:2015-6-2 23:04
?
?
程序員,程序猿,程序媛,碼農?———————————————————————————————————————————————————————
——Java的應用領域
? ? J2SE????主要用來開發桌面應用軟件。
? ? J2ME? ?嵌入式開發,例如手機里的軟件,掌上電腦軟件等等。?
? ? J2EE? ? 屬于網絡編程,例如JSP等等,做網站用。
——參考資料
? ? 張孝祥????《Java就業培訓》?
? ? 林信良? ? 《Java學習筆記》
? ? 機械工業? ? 《Java核心編程》
? ? 機械工業?? ?《Java編程思想》
——配置環境變量
? ? set ?classpath=.;自定義目錄 ?//則先查找當前目錄,然后再查找自定義目錄,如果沒有點,則只查找自定義目錄
——標識符
? ? 在程序中自定義一些名稱。
? ? 由26個英文字母大小寫、數字0-9符號 _ $ 組成。
? ? 定義合法標識符規則:
????? ? 1、數字不可以開頭。
????? ? 2、不可以使用關鍵字。
? ? Java中嚴格區分大小寫。
? ? Java中名稱的規范:?
????? ? 包名:
????????????? ? 多單詞組成時所有字母都小寫。
????? ? 類名接口名:
????????????? ? 多單詞組成時,所有單詞的首字母大寫。
????? ? 變量名和函數名:
????????????? ? 多單詞組成時,第一個單詞首字母小寫,第二個單詞開始每個單詞首字母大寫。
????? ? 常量名:
????????????? ? 所有字母都大寫,多單次時每個單詞用下劃線連接。
? ?
——常量
? ? 常量表示不能改變的數值。
? ? Java中常量的分類:
????? ? 1、整數常量:所有整數。
????? ? 2、小數常量:所有小數。
????? ? 3、布爾型常量:true ?false
????? ? 4、字符型常量:將一個數字、字母或者符號用單引號(' ')標識。
????? ? 5、字符串常量:將一個或多個字符用雙引號標識。
????? ? 6、null常量:只有一個數值,就是null。
? ? 對于整數:
????? ? 二進制:0 ?1
????? ? 十進制:0-9,逢十進一。
? ??? ? 八進制:0-7,逢八進一,用0開頭表示。
????? ? 十六進制:0-9,A-F,逢16進一,用0x開頭表示。
——變量
? ? 變量的概念
????? ? 內存中的一個存儲區域。
????? ? 該區域有自己的名稱(變量名)和類型(數據類型)。
????? ? 該區域的數據可以在同一類型范圍內不停變化。
? ? 為什么要定義變量
????? ? 用來存放同一類型的常量,并且可以重復使用。
? ? 變量使用注意:
????? ? 變量的作用范圍。(一對{ }內有效)
????? ? 變量初始化。
? ? 定義變量的格式
????? ? 數據類型? ? 變量名 ?= ?初始化值;
? ? 數據類型
????? ? 基本數據類型:
????????????? ? 數值型:
????????????????????? ? 整數類型:
????????????????????????????? ? byte 1個字節 ?-128~127 ?-2^7~2^7-1
????????????????????????????????short 2個字節 ?-32768~32767 ?-2^15~2^15-1
????????????????????????????????int ?4個字節 ?(默認)
????????????????????????????????long ?8個字節 ?賦值時后面一般加小寫L
????????????????????? ? 浮點型:
????????????????????????????? ? float ?4個字節 ?賦值時后面一般加f
????????????????????????????????double ?8個字節(默認)
????????????? ? 字符型:char ?2個字節? ? //Java中字符型變量占兩個字節。
????????????? ? 布爾型:boolean
????? ? 引用數據類型
????????????? ? 類:class
????????????? ? 接口:interface
????????????? ? 數組:[ ]
????? ? 整數默認 int? ? 小數默認 double
——強制類型轉換
? ? 由于Java是強類型語言,所以賦值時需要注意類型轉換問題。
????當一個java算術表達式中包含多個基本類型的值時,整個算術表達式的數據類型將發生自動提升。Java定義如下的自動提升規則:
? ? float 和 int 進行運算時,以 float 為準。?
——運算符
? ??取模運算時,假如其中一數為負數,則只看運算符左邊的數字:
????? ? -2%5? ? 余數為-2。
????? ? 6%-8? ? 余數為6。
????? ? -10%-5? ? 余數為0。
? ? + 號
????? ? 字符串連接符:
????????? ? “haha”+“heihei”? ? 輸出結果為 ?hahaheihei
????????? ? 字符串數據和任何數據使用+相連接,最后都會變成字符串。
????????????? ??System.out.println("haha"+ (++a));? ? 輸出結果為:haha2????? ? //?ln表示括號內所有語句輸出完畢后在結尾處換行一次
?????????? ? ? ?System.out.println("a = "+5);? ? 輸出結果為:a = 5
——轉義字符
? ? \n:換行????????????????????? ? Linux中只有一個換行符:\n
? ? \b:退格Backspace????? ?Windows中有兩個換行符:\n ? \r
? ? \r:回車????????????????????? ? DOS中可以直接識別 \n
? ? \t:下一個制表位
/*
????System.out.print("hello \r world");
????為什么輸出結果是:
????——————
?????world"
????——————
????在早期打字機中,每打完一行,會先跳回行首,再執行換行。
*/
? ? 如何輸出上引號
????????System.out.println("\"hello world\"");
????? ? 輸出結果:”hello world“
? ??char ch = '\n';也可以,因為\n轉義完之后是一個換行符。
? ??char ch = '啊';也可以,因為Java中char占2個字節,一個漢字也占兩個字節。
——賦值運算符
? ? shotr x = 4;
? ? x = x + 5;????? ? //編譯失敗
而
? ? short s = 3;
? ? s += 5;????? ? //編譯成功,因為x = x + 5;是兩次運算,在運算過程中會進行自動類型提升,運算后的結果是int類型,無法賦給short類型
????????????????????? ? ?的變量;而 s += 5;只進行一次運算,在運算過程中會自動進行強制類型轉換。
——比較運算符
? ? 比較運算符的運行結果都是boolean型,要么是true要么是false。
——邏輯運算符
? ? & ?| ?^? !
? ? ^:異或(相同為假,不同為真)
????? ? true ^ true = false;
????? ? true ^ false = true;
????? ? false ^ true = true;
????? ? false ^ false = false;
????????? ? ^:兩邊相同結果是 false
????????????? ? 兩邊不同結果是 true
? ? & 和 &&的區別:(一假全假)
????? ? &:無論左邊是 true 還是 false ,都不會影響右邊的運算。
????? ? &&:當左邊為 false 時,右邊不運算。
? ? | 和?||的區別:(一真全真)
????? ? |:兩邊都參與運算。
????? ? ||:當左邊為 true 時,右邊不運算。(短路)
——按位操作符
? ? 與運算:&? ? 或運算:|? ? 異或運算:^? ? 取反:~
? ? 一假全假——
????? ? 如果兩個輸入位都是1,則按位與(&)運算,生成一個輸出位1;否則生成一個輸出位0。
? ? 一真全真——
????? ? 兩個輸入位只要有一個是1,則按位或( |?)運算,生成一個輸出位1;只有在兩個輸入位都是0的情況下,才會輸出一個輸出位0。
? ? 相同為假,不同為真——
????? ? 如果輸入位的某一個是1,但不全都是1,那么按位異或(^)運算,生成一個輸出位1;兩個都為0或1,生成一個輸出位0。
? ? &:(一假全假)
????? ? 6 & 3 = 2;
????? ? 6? ? ----? ? 110????????????? ? 0 就是假,1 就是真,一假全假。
????? ? 3? ? ----?& 011
????? ? 2? ? ----? ? 010 = 2
? ? | :(一真全真)
????? ? 或同理。
? ? ^ :(相同為假,不同為真)
????? ? 異或同理,一個數異或同一個數兩次,結果還是初始值,一般用于加密。
——位移算符(運算速度最快)
? ? 左移:<<? ? 右移:>>? ? 無符號右移:>>>
? ? 先把數字轉換成二進制形式,然后將其左移或右移,缺少位用 0 補足。
????? ? |????3 << 2 = 12;????|? ? 3 << 1 = 6;????|? ? 3 << 3 = 24;? ? |
????? ? |????3 ?* ?4 ?= 12;????|? ? 3 ?* ? 2 = 6;????| ? ?3 ?* ?8 ?= 24;? ? |
????? ? |????3 * 2^2 = 12;????|? ? 3 * 2^1 = 6;????| ??3 * 2^3 = 24;? ? |
? ? 往左移,移幾位,就是十進制數字乘以二的幾次冪。
? ? 往右移,移幾位,就是十進制數字除以二的幾次冪。(舍棄小數位)
? ??右移(>>)時,正數高位補 0 ;負數高位補 1 。
? ??無符號右移(>>>)時,高位補 0?。
? ? 練習:
????? ? 1、最有效率的方式算出2乘以8等于幾?? ? 2 << 3
????? ? 2、對兩個整數變量的值進行互換(不需要第三方變量)。
????????? ? (1)int ?n , m;
????????????????? ? ?n = n + m;????// 如果n和m 的值非常大,容易超出int范圍。
?????????????????????m = n - m;
????????????????? ? ?n = n - m;
????????? ? (2)n = n ^ m;
????????????????? ? ?m = n ^ m; ?// (n ^ m) ^ m? ?n?異或 m?兩次,結果還是 n。
?????????????????????n = n ^ m; ? // n ^ ( n ^ m) ? m?異或 n 兩次,結果還是 m。
——流程控制
? ? switch語句:
????????? ? 只接收四種類型的值:byte ?short? int ?char??/* ?JDK?7.0版本可以判斷字符串 ?*/
????????? ? 運行過程中如果沒有 break ,則按順序向下執行,直到 switch 結束。
? ? break和continue:
????????? ??在循環過程中可以通過break *; 或者是continue *;?來中斷 / 跳出某個循環,例如:
????????? ? ????????/* ?這是一個9*9乘法表,如果在標號為 w的for循環中有一個break w;
????????????????????? ? ?則運行到該語句時會中斷 w 循環,break w; 也可以寫在內循環當中。
?????????????????????????標號只能用于循環。
????????????????????*/
????????????? ? ? ??class chengfabiao { public static void main(String[] agrs) { w:for (int x = 1;x <= 9; x++) { q:for(int y = 1; y <= x; y++) { System.out.print(y+"*"+x+"="+y*x+"\t"); } System.out.print("\n"); break w; } } }
? ——函數重載
? ? 重載的定義:
????????? ??在同一個類中,允許存在一個以上的同名函數,只要它們的參數個數或者參數類型不同即可。
? ? 重載的特點:
????????? ??與返回值無關,只看參數列表。
? ? 重載的優點:
????????? ? 方便閱讀,優化了程序設計。
? ? 重載示例:
? ? ? ? ? ? 1、public static int add(int x,int y) { return x+y; }
????????? ? 2、public static int add(int x,int y,int z) { return x+y+z; }?
????????? ? 3、public static int add(int x,int y,int z) { return add(x,y)+z; }???
——數組
? ? 定義:
????????? ? 同一數據類型的集合。其實數組就是一個容器。(能存數據的地方就稱之為容器)
????????? ? 在堆內存中定義數組時,都有默認值。
????????? ? Java中棧內存,當函數調用結束時由系統自動釋放,堆內存由Java垃圾回收機制不定時回收。
? ? 格式1:
????????? ? 元素類型 ?[ ]? 數組名 ?= ?new ?元素類型 [ 元素個數或數組長度?]
????????? ? 示例:
????????????????? ??int ?[?] ?arr ?= ?new ?int [ 5 ];
????????????????? ??int ?arr ?[ ]? = ?new ?int [ 5 ];
? ? 格式2:
????????? ? 元素類型 ?[ ] ?數組名 ?= ?new ?元素類型 ?[ ] {元素1,?元素2,?......};
????????? ? 示例:
????????????????? ??int ?[ ]? arr ?= ?new int [ ] {3,5,7};
????????????????? ? int ?[ ] ?arr ?= ?{3,5,7};
? ? 注意:當兩個引用同時指向一個數組時,其中一個引用null,該數組不會變成垃圾值。(Java中的引用就是C語言的指針)
? ??數組中有一個屬性可以直接獲取到數組元素的個數:length
? ? 字符串中獲取長度的方法是:length();?
????? ? 使用方式:數組名稱.length
? ? 數組的二分查找:
????? ? 二分查找可以提高效率,但是必須保證數組中的元素是有序的。
????? ? 右移一位相當于本數除以2。
/**
?*
?*
?*2016年3月20日00:33:49
?*?使用二分查找??獲取數組元素
?*
?*@author WYC
?*
?*/
public class BinarySearchDemo {
???????? publicstatic void main(String[] args)
???????? {
?????????????????? intarr[] = {2,4,7,9,15,17,26,37,58,66};
??????????????????
?????????????????? System.out.println(binarySearch_2(arr,15));
???????? }
????????
????????
???????? //方法一
???????? publicstatic int binarySearch_1(int arr[] , int key)
???????? {
?????????????????? intmax = arr.length-1,min = 0 , mid = (max + min)>>1;
??????????????????
?????????????????? while(min<= max)
?????????????????? {
??????????????????????????? if(arr[mid]> key)
??????????????????????????? {
???????????????????????????????????? max= mid - 1;
??????????????????????????? }
??????????????????????????? elseif(arr[mid] < key)
??????????????????????????? {
???????????????????????????????????? min= mid + 1;
??????????????????????????? }
??????????????????????????? else
??????????????????????????? {
?????????????????? ?????????????????? return mid;
??????????????????????????? }
??????????????????????????? mid= (max + min)>>1;
?????????????????? }
?????????????????? return-1;
???????? }
???????? //方法二
???????? publicstatic int binarySearch_2(int arr[], int key)
???????? {
?????????????????? intmin = 0, max = arr.length - 1, mid = (max + min) >> 1;
??????????????????
?????????????????? while(arr[mid]!= key)
?????????????????? {
??????????????????????????? if(arr[mid]> key)
??????????????????????????? {
???????????????????????????????????? max= mid - 1;
??????????????????????????? }
??????????????????????????? elseif(arr[mid] < key)
??????????????????????????? {
???????????????????????????????????? min= min + 1;
??????????????????????????? }
??????????????????????????? if(max< min)
??????????????????????????? {
???????????????????????????????????? return-1;
??????????????????????????? }
??????????????????????????? mid= (max + min) >> 1;??
?????????????????? }
?????????????????? returnmid;
???????? }
}
?
?????????練習:
???????????????????又一個有序的數組,想要將一個元素插入到該數組中,還要保證該數組是有序的。
???????????????????如何獲取該元素在數組中的位置。
????????????????????????????將返回值改為?-min。
????????????????????????????基于折半查找的返回要插入的腳標元素。
——面向對象(面向過程強調的是“動作”,面向對象強調的是“對象”)? ? 對象就是多個功能的封裝。
? ??對象是通過new來產生的一個實體,存在于堆內存。
? ? 1、面向對象概念
????????? ? ?理解面向對象:
????????????????? ? 面向對象是相對面向過程而言。
????????????????? ? 面向對象和面向過程都是一種思想。
????????????????? ? 面向過程:強調的是功能行為。
????????????????? ? 面向對象:將功能封裝進對象,強調具備了功能的對象。
????????????????? ? 面向對象是基于面向過程的。
????????? ? ?面向對象的特點:
????????????????? ? 面向對象是一種思想,它能讓復雜的問題簡單化,它能讓我們的角色發生轉變,從執行者轉變為指揮者(怎么做的我不
????????????????????知道,我只要結果)。
????????????????????萬物皆對象。
????????????????? ? 面向對象的三個特征:封裝,繼承,多態。
????????????????? ? 開發,其實就是找對象,使用對象,建對象,并維護對象之間的關系。
? ? 2、類與對象的關系
????????? ? 類就是對現實生活中事物的描述。
????????? ? 對象就是這類事物,實實在在存在的個體。
????????? ? 類的屬性對應的是類中的變量,類的行為對應的是類中的函數(方法),其實定義類,就是在描述事物,屬性和行為共同稱為類
? ? ????????中的成員(成員變量和成員方法)。
????????? ? 通過類來創建一個對象:
????????????? ??類? ? abc = new 類();
????????????????? ??abc是一個類類型變量(引用類型變量),類類型變量指向對象。
????????? ? 成員變量和局部變量作用范圍:
????????????? ? 成員變量作用于整個類中。
????????????? ? 局部變量作用于函數中,或語句中。
????????????? ??成員變量有默認值,可以參與運算,局部變量無默認值。
* 其中數值類變量默認值為0 * 浮點型默認值為0.0 * 字符變量默認值為空格 * 布爾型變量默認值為false ????????? ? 成員變量和局部變量在內存中的存儲:
????????????? ??成員變量:
????????????????????? ? 成員變量隨著類的加載而加載并且生成默認值。
????????????????????? ? 在堆內存中,因為對象的存在,才在內存中存在。
????????????? ? 局部變量:
????????????????????? ? 存在于棧內存中。
????????? ??匿名對象:
????????????? ? 匿名對象是對象的簡化形式。
????????????????? ? new Person().age = 20;
????????????? ? 匿名對象的兩種使用情況:
????????????????? ? 當對對象方法僅進行一次調用的時候
????????????????? ? 匿名對象可以作為實際參數進行傳遞
????????????? ??匿名對象使用方式一:
????????????????? ? 當對對象的方法只調用一次時,可以用匿名對象來完成,這樣寫比較簡單。
????????????????? ? 但是對一個對象進行多個成員調用,必須給這個對象起名字。
????????????????? ??因為第二次匿名調用會使第一次匿名調用的對象成為垃圾值。
????????????? ??匿名對象使用方式二:
????????????????? ? 可以將匿名對象作為實際參數進行傳遞。
????????? ? 當類存在于不同文件之間,JVM會在當前目錄下尋找class文件和java文件,沒有則會報錯。
? ? 3、封裝(Encapsulation)
????????? ? 封裝:是指隱藏對象的屬性和細節實現,僅對外提供公共訪問方式。
????????? ? 好處:將變化隔離
????????????????????? ?便于使用
????????????????????? ?提高重用性
????????????????????? ?提高安全性
????????? ? 封裝原則:
????????????????????? ?將不需要對外提供的內容都隱藏起來。
????????????????????? ?把屬性都隱藏,提供公共方法對其進行訪問。
????????? ? private:
???????????????????????私有,權限修飾符:用于修飾類中的成員(成員變量,成員函數)。
????????????????????? ?私有只在本類中有效。
????????????????????? ?將成員變量私有化以后,類以外即使建立了對象也不能直接訪問,就需要在類中提供對應訪問成員變量的方式。
????????? ? 一個屬性通常對應兩個方法:set 和 get。
????????? ? 注意:私有僅僅是封裝的一種表現形式。
????????? ? 之所以對外提供訪問方式,是因為可以在訪問方式中加入邏輯判斷等語句,對訪問的數據進行操作,提高代碼的健壯性。
? ? 4、構造函數
????????????? ??當創建對象時,因為調用了名字相同的類,所以通過函數重載對對象進行初始化。
????????? ? 特點:
????????????? ? 1、函數名與類名相同
????????????? ? 2、不用定義返回值類型
????????????? ? 3、不可以寫return語句
????????? ? 作用:
????????????? ? 類對象一建立就會調用與之對應的構造函數。
????????????? ??構造函數的作用是給對象進行初始化。
????????? ? 注意:
????????????? ? 1、默認構造方法的特點
????????????????????? ? 給成員變量賦予初始值。
????????????? ? 2、多個構造方法是以重載的形式存在的。
????????? ? 構造方法的小細節:
????????????? ? 當一個類中沒有定義構造方法時,那么系統會默認給該類加入一個空參數的構造函數(默認構造方法)。
????????????? ? 當在類中自定義了構造函數以后,默認的構造函數就沒有了。
????????? ? 構造函數和一般函數在寫法上有不同,在運行方面也有不同:
????????????? ??構造函數是在對象一建立就運行,作用是給對象初始化;
????????????? ? 而一般函數是對象調用才執行,是給對象添加對象具備的功能。
????????????? ??一個對象建立,構造函數只運行一次;
????????????? ? 而一般方法可以被該對象調用多次。
????????? ? 什么時候定義構造函數?
????????????? ? 當分析事物時,該事物存在即具備一些特性或者行為(例如人出生具備姓名年齡),那么將這些內容定義在構造函數中。
? ? ? ? ? ? 構造代碼塊:構造代碼塊中定義的是不同對象共性的初始化內容。
????????????? ? 作用:
????????????????????????給對象進行初始化。
????????????????????? ??對象一建立就運行,而且優先于構造函數執行。
????????????? ? 構造代碼塊和構造函數的區別:
????????????????????? ??構造代碼塊是給所有對象進行統一初始化,而構造函數是給對應的對象進行初始化。
????????????? ? 格式:
? ? ? ? ? ??????????? ? {......}
????????????????????? ? 區別于靜態代碼塊( static{......} ),靜態代碼塊在一個程序中只在類的第一次加載時執行一次。
????????????????????? ? 構造代碼塊在每創建一個對象時調用一次。
? ? 5、this 關鍵字
????????? ??this關鍵字是用于區分局部變量和成員變量同名的情況。
????????? ? 可以在構造函數中使用this關鍵字,在構造函數中,this代表所創建對象。
????????? ? 格式:
????????????????? ? this.name
????????? ? this代表它所在函數的所屬對象的引用,簡單來說,就是哪個對象在調用this所在的函數,this就代表哪個對象。
? ? ????? ? this的應用:
????????????????? ? 當定義類中功能時,該函數內部要用到調用該函數的對象,這時用this來表示該對象。
????????????????????但凡本類功能內部使用到了本類對象,都用this表示。
????????? ??構造函數間的函數調用:
????????????????? ? this關鍵字可以用于構造函數中,并且構造函數間不能用 ?函數名(實參) ?來調用,需要用this關鍵字來調用。
????????????格式:
????????????????????this(實參)。
????????? ? 注意:
????????????????????this構造方法只能定義在構造函數的第一個語句,初始化動作要先執行。
????????????????????要防止構造函數間無限調用,陷入死循環。
????6、static 關鍵字
????????????????? ? 用于修飾成員(成員變量和成員函數)
????????? ? 被修飾后的成員具備以下特點:
????????????????? ??隨著類的加載而加載,并且隨著類的消失而消失,說明它的生命周期最長,簡稱為類變量,未創建對象時可以用類名調用。
????????????????? ??優先于對象存在(非靜態成員變量只有創建對象時才會創建成員變量)
????????????????? ??被所有對象所共享
????????????????? ? 可以直接被類名調用
????????????????? ??類中靜態成員互相調用時省略的是(類名 . ),而非靜態成員變量互相調用時省略的是(this .)。
? ? ? ? ? ? ? ? ? ??
????????? ? 方法區,共享區,數據區,static靜態變量存儲在該區域內,所有對象可以共享該區域。
????????? ? 實例變量和類變量的區別:
????????????????? ? 1、存放位置
????????????????????? ? 類變量隨著類的加載而存在于方法區中
????????????? ??????? ? 實例變量則隨著對象的建立而存在于堆內存中
????????????????? ? 2、生命周期
????????????????????? ? 類變量生命周期最長,隨著類的消失而消失。
????????????????????? ? 實例變量生命周期隨著對象的消失而消失。
????????? ? 靜態變量使用注意事項:
????????????????? ? 1、靜態方法只能訪問靜態成員,成員包括方法和變量。
????????????????????????? ? 可以將對象作為參數傳入靜態方法,從而在靜態方法中調用非靜態方法。
????????????????????? ? ?非靜態方法可以訪問靜態成員。
????????????????? ??2、靜態方法中不可以寫 this、super關鍵字,無對象不能訪問this。
????????????????? ? 3、主函數是靜態的。
? ? ? ? ? ? ? ? ? ? 4、static靜態變量的值可以修改,整個類享有同一個靜態變量,一改全改。
????????? ? 靜態有利有弊:
????????????????? ? 利:
????????????????????? ? 對對象的共享數據進行單獨空間的存儲,節省空間,沒有必要每一個對象中都存儲一份。
????????????????????? ? 可以直接被類名調用。
????????????????? ? 弊:
????????????????????? ? 生命周期過長,浪費內存空間。
????????????????????? ? 訪問出現局限性。(靜態只能訪問靜態)
? ? 6、main函數
????????? ? public static void main(String[ ] agrs)
????????? ? 主函數:
????????????????????是一個特殊的函數,作為程序的入口,可以被JVM調用
????????? ? 主函數的定義:
????????????????? ? public:代表著該函數訪問權限是最大的
????????????????? ? static: 代表主函數隨著類的加載就已經存在了
????????????????? ? void: ? 主函數沒有具體的返回值
????????????????? ? main: ?不是關鍵字,但是是一個特殊的單詞,可以被JVM識別
????????????????? ? (String[ ] args):函數的參數,參數類型是一個數組,該數組中的元素是字符串,是字符串類型的數組,args是變量名。
????????????????? ? 主函數是固定格式的:JVM識別。
????????? ? 注意:
????????????????? ? 當存在兩個主函數時,參數列表不同,編譯時不會報錯,因為參數列表不同,相當于函數重載,不過入口還是(String[ ] arr)
????????????????? ??JVM在調用主函數時,傳入的是new String [0];????推理如下:
????????????? ? ? ??class MainDemo { public static void main(String[] args) { System.out.println(agrs); System.out.println(args.length); } }
????????????????? ? 在DOS命令行中運行 java MainDemo時,在MainDemo之后輸入字符串,會將字符串作為函數參數傳給主函數的String[ ]。? ????????? ? 什么時候使用靜態?
????????????????? ? 要從兩方面下手:
????????????????????????? ? 因為靜態修飾的內容有成員變量和函數。
????????????????? ? 什么時候定義靜態變量(類變量)呢?
????????????????????????? ? 當對象中出現共享數據時,該數據被靜態所修飾(一改全改)。
????????????????????????? ? 而對象中的特有數據要定義成非靜態存在于堆內存中。
????????? ??????? ? 什么時候定義靜態函數呢?
????????????????????????? ? 當功能內部沒有訪問到非靜態數據(對象的特有數據),那么該功能可以定義成靜態。
????????????????????????? ? 因為靜態變量隨著類的加載而加載,可以通過類名來調用靜態變量,節省內存,提高效率。
????????? ? 靜態的應用:
????????????????? ? 每一個應用程序中都有共性的功能,可以將這些功能進行抽取,獨立封裝成類,以便復用。 靜態工具示例:? public class ArrayTool { public static void main(String[] args) { int [] arr = {1,4,2,6,7,3}; Tool tool = new Tool(); tool.show(arr); tool.sort(arr); tool.show(arr); int max = tool.getMax(arr); System.out.println("max = " + max); int min = tool.getMin(arr); System.out.println("min = " + min); } } class Tool { public static int getMax(int [] arr) { int max = 0; for(int i = 0; i < arr.length; i++) { if(arr[max] < arr[i]) { arr[max] = arr[i]; } } return arr[max]; } public static int getMin(int [] arr) { int min = 0; for(int i = 0; i < arr.length; i++) { if(arr[min] > arr[i]) { arr[min] = arr[i]; } } return arr[min]; } public static void sort(int [] arr)???? { for(int i = 0;i < arr.length-1; i++) { for(int j = i+1; j< arr.length; j++) { if(arr[i] < arr[j]) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } } public void show(int [] arr) { System.out.println("輸出數組:"); for(int i = 0; i < arr.length; i++) { System.out.print(arr[i]); } System.out.println(); System.out.println("輸出結束!"); } }
????????? ? 雖然可以通過建立ArrayTool的對象使用這些工具方法,對數組進行操作,但是發現了問題:
????????????????? ? 1、對象是用于封裝數據的,但是ArrayTool對象中并未封裝特有數據。
????????????????? ? 2、操作數組的每一個方法都沒有用到ArrayTool對象中的特有數據。
????????? ? ????????這時就考慮,讓程序更嚴謹,是不需要對象的。
????????? ? ????????可以將ArrayTool中的方法都定義成static的,直接通過類名調用即可。
????????? ? 注意:
????????????????? ? 將方法都靜態后,可以方便使用,但是該類還是可以被其他程序建立對象,為了使程序更加嚴謹:
? ??????????????? ? 強制讓該類不能建立對象,可以通過將構造函數私有化來完成。
????????????????? ? private ArrayTool (?) { }
????????? ? 能私有的都私有。 ? ? 7、幫助文檔的制作 (也稱為API文檔,Application Program Interface 應用程序接口)
????????? ? 在DOS命令行下輸入:javadoc -d myhelp -author -version ArrayTool.java
????????? ? javadoc是Java自帶工具,用于生成幫助文檔。
????????? ? -d? ? ? ??????????表示directory目錄的意思
????????? ? myhelp????? ? 表示創建文件夾的名字(如果需要,可以在-d之后加上自定義目錄,如:c:\program\)
????????? ? -author ? ? ? ?表示生成文檔的同時生成作者
????????? ? -version?????? 表示生成文檔的同時生成文檔版本
????????? ? ArrayTool.java????? ? 表示源文件
????????????注意:需要在源文件的class類前加上public,保證權限足夠,才能夠創建幫助文檔。private權限下的無法生成幫助文檔。
????????????????????? ?一個類中默認會有一個空參數的構造函數,該構造函數權限和所屬類一致,如果類被public修飾,那么默認的構造函數也
???????????????????????帶public修飾符,如果類沒有被public修飾,那么默認的構造函數也沒有public修飾。簡單來說,默認構造函數的權限是
???????????????????????隨著類的變化而變化的。如果將類名private,則無法生成構造函數幫助文檔。
? ? ? ? ? ? 示例如下:
????????????????? ? /**
????????????????? ? 這是一個可以對數組進行操作的工具類,該類中提供了獲取最值、排序等功能。
????????????????? ? @author ?張三????? ? //author表示作者,可以從源文件中提取,寫入幫助文檔
????????????????? ? @version ?V1.0????? ? version表示版本,可以從源文件中提取,寫入幫助文檔
????????????????? ? */
????????????????? ? 函數前寫
????????????????? ? /**
????????????????? ? @param 函數參數 參數描述
????????????????? ? @return 返回值描述
????????????????????*/
? ? 8、靜態代碼塊
????????? ? 隨著類的加載而加載,只在類加載的同時執行一次,并且優先于主函數執行。
????????????static
????????? ? {
????????????????? ? 執行語句。
????????????}
????????? ??注意:
????????????????? ? 只有用到類中的內容時,靜態代碼塊才會執行,而StaticCode s = null,靜態代碼塊不會執行,只建立引用,類不會加載。
????????????????? ? 靜態代碼塊中不能使用this,構造代碼塊中可以使用this。
? ? 9、靜態代碼塊、構造代碼塊和構造函數的區別 靜態代碼塊:用于給類初始化,類加載時就會被加載執行,只加載一次,優先于構造代碼塊。
????????構造代碼塊:用于給對象初始化,只要建立對象該部分就會被執行,且優先于構造函數。 構造函數: ?給對應對象初始化的,建立對象時,選擇相應的構造函數初始化對象。 ? 創建對象時,三者被加載執行順序:靜態代碼塊--->構造代碼塊--->構造函數 ? ? 10、對象的初始化過程
????????? ? Person p = new Person();
????????????????? ? 1、在棧內存中,開辟main函數的空間,建立main函數的變量p。
????????????????? ??2、加載類文件:因為new要用到Person.class文件,所以要先從硬盤中找到Person.class類文件,并加載到內存當中。
????????????????? ??????? ? 加載類文件時,除了非靜態成員變量(對象的特有屬性)不會被加載,其他的都會被加載。
????????????????? ? 3、執行類中的靜態代碼塊:如果有靜態代碼塊的話,對Person.class類進行初始化。
????????????????? ? 4、開辟空間:在堆內存中開辟空間,分配內存地址。
????????????????? ? 5、默認初始化:在堆內存中建立對象的特有屬性,并進行默認初始化。
????????????????? ? 6、顯示初始化:對屬性進行顯式初始化(編寫人員通過語句進行的初始化叫做顯式初始化,比如自定義構造函數;而系統
????????????????????? ? ??默認的構造函數就是隱式初始化)
????????????????? ? 7、構造代碼塊:執行類中的構造代碼塊,對對象進行構造代碼塊初始化。
????????????????? ? 8、構造函數初始化:對對象進行對應的構造函數初始化。
????????????????? ? 9、將內存地址賦給棧內存中的變量p。
????????? ? p.setName("lisi");
????????????????? ? 1、在棧內存中開辟setName方法的空間,里面有:對象的引用 this,臨時變量name。
????????????????? ? 2、將p的地址賦給this,this就指向了堆中調用該方法的對象。
????????????????? ? 3、在傳參時將"lisi"賦值給臨時變量name。
????????????????? ? 4、將臨時變量的值賦給this.name。
????????? ? 注意:要想使用類中的成員,必須通過類名或者this或者super調用。
? ? 11、單例設計模式
????????? ? 設計模式:解決某一類問題最行之有效的方法,Java中有23種設計模式:
????????????????? ? 單例設計模式:解決一個類在內存中只存在一個對象。
????????????????? ? 想要保證對象唯一:
????????????????????????? ? 1、為了避免其他程序過多建立該類對象,先禁止其他程序建立該類對象。
????????????????????????? ? 2、為了讓其他程序可以訪問到該類對象,可以在本類中自定義一個對象。
????????????????????????? ? 3、為了方便其他程序對自定義對象的訪問,可以對外提供一些訪問方式。
????????????????? ? 以上三步代碼體現方式:
????????????????????????? ??1、將構造函數私有化(對應1)
????????????????????????? ? 2、在類中創建一個本類對象(對應2)
????????????????????????? ? 3、提供一個方法可以獲取到該對象(對應3)
????????????????? ? //餓漢式,這個是先初始化對象
????????????? ? ? ??class Single1 { private Single(){}; private static Single s = new Single(); public static Single getInstance();????????????? ? //如果想要調用成員變量或者成員函數,只能通過類名或者對象來實現 {?????????????????????????????????????????????????????????????????????因為沒有對象,所以只能通過類名來調用,并且只能是static return s; } }
????????????????? ? //懶漢式,對象是方法被調用時才初始化,也叫做對象的延時加載。
class Single2 { private Single(){ }; private static Single s = null; public static getInstance() { if (null == s) s = new Single(); return s; } }
class SingleDemo { public static void main(String[] args) { Single s1 = Single.getInstance();???//因為類變量是靜態的,所以只能創建一個,無法重復創建,但是可以修改值 Single s2 = Single.getInstance(); } ????????????????????}
????????? ? 懶漢式和餓漢式的區別:
????????????????? ? 餓漢式
????????????????????????? ? Single類一進內存,就已經創建好了對象。定義單例,建議使用餓漢式。
????????????????? ? 懶漢式
????????????????????????? ? Single類進內存,對象還沒有存在,只有調用了getInstance方法時,才建立對象。
????????????????????????? ? 懶漢式在運行中容易出現差錯,因為CPU來回切換運行程序時容易創建多個對象,為了避免此情況,可以加
????? ? ????????????????????入synchronized關鍵字,保證對象唯一。
/* 餓漢式-多線程 */ class Single3 { private Single(){}; private static Single s = null; public static getInstance() { if(null == s) { synchronized(Single.class)????? ? //可以避免每次都判斷是否上鎖,提高程序運行效率 { if(null == s) { s = new Single(); } } } } } ????????? ? 對于事物該怎么描述,還怎么描述,當需要將該事物的對象保證在內存中唯一時,就將以上的三步加上即可。
? ? 12、類的生命周期
????????? ? 在類使用完之后,如果滿足下面的情況,類就會被卸載:
????????????????? ? 1、該類所有的實例(對象)都已經被回收,也就是Java堆中不存在該類的任何實例。
????????????????? ? 2、加載該類的ClassLoader(類加載器)已經被回收。
????????????????? ? 3、該類對應的java.langClass對象沒有任何地方被引用,無法再任何地方通過反射訪問該類的方法。
????????? ? 如果以上三個條件全部滿足,JVM就會在方法區垃圾回收的時候對類進行卸載,類的卸載過程其實就是在方法區中清空類信息
????????????,Java類的整個生命周期就結束了。? ——繼承
? ? 一個新類從已有的類那里獲得其已有的屬性和方法,這種現象叫類的繼承。
? ??這個新類被稱為子類,也叫派生類,已有的那個類叫做父類,也叫做基類。
? ? 繼承的好處:
????? ? 代碼得到極大的重用。
????? ? 形成一種類的層次體系結構?。
????? ? 為多態創造條件。
? ? 繼承的實現方式:
????? ? class SubClass extends SuperClass ????// SuperClass是父類的意思
????? ? {
????????? ? ????··········
????????}
????? ? 利用繼承可以較好地模擬出現實世界事物之間的聯系
? ? 注意:Java只支持單繼承,不支持多繼承,多繼承容易帶來安全隱患(當父類中定義了相同功能時,創建子類對象時,無法確定執行
???????????????哪個代碼),C++中支持多繼承,但是Java中保留了這種機制,并用另一種體現形式來完成表示,叫做多實現。
????????????? ?Java支持多層繼承:C繼承B,B再繼承A。
????????????? ?Java中也可以繼承構造代碼塊和靜態代碼塊,但是不能繼承構造方法。
????????????? ?子類可以繼承父類所有的成員變量和成員方法,但子類永遠無法繼承父類的構造方法。在子類的構造方法中可以使用語
???????????????句super(參數列表)來調用父類的構造方法。
? ? 當子類父類類成員名相同時,可以使用super來調用父類成員,否則默認使用this調用子類成員。private情況下無法訪問父類成員。
? ? 1、子父類中變量的特點
????? ? 如果子父類中出現非私有的同名成員變量時,子類要訪問本類中的變量需要this關鍵字,訪問父類中的同名變量需要super關鍵字。
? ? 2、子父類中的函數(重寫,覆蓋)
????? ??當子類出現和父類一模一樣的函數時,子類對象調用該函數,會運行子類函數的內容,如同父類函數被覆蓋一樣,這種情況是函數
? ? ????的另一個特性:重寫(覆蓋)。
????? ? ????????當子類繼承父類,并將父類的功能集成到子類中,但是子類雖具備該功能,而功能的內容卻和父類不一致,這時,沒有必要
????????????????定義新功能,而是使用覆蓋特性,保留父類的功能定義,并重寫該功能。
????? ? 覆蓋:
????????????1、子類覆蓋父類,必須保證子類權限大于等于父類權限,才可以覆蓋。
????????? ??2、靜態只能覆蓋(復寫)靜態,不能覆蓋非靜態(靜態先加載)。
? ? ? ??重寫和重載的區別:
????????????重載:只看同名函數的參數列表
????????? ? 重寫:子父類方法要一模一樣,包括返回值類型。
? ? 3、子父類中的構造函數
????? ??在對子類對象進行初始化時,父類的構造函數也會運行,那是因為子類的構造函數默認第一行有一條隱式的語句:super();
????? ? super();語句會訪問父類中空參數的構造函數,而且子類中所有的構造函數默認的第一行都是super();
????????? ? 為什么子類一定要訪問父類中的構造函數?
????????????? ? 因為父類中的數據子類可以直接獲取,所以子類對象在建立時需要先查看父類是如何對這些數據進行初始化的,所以子類在
????????????????對象初始化時,要先訪問父類中的構造函數。如果要訪問父類中指定的構造函數,可以通過手動定義super來指定。
????????? ? 如果父類中有private的成員,雖然子類不能訪問,但是子類一定會繼承過來并開辟物理內存來存儲父類的private成員,所以會
????????????默認調用一下父類的無參構造方法super();來訪問父類中的私有成員,以便開辟內存。
????? ??注意:super語句一定定義在子類構造函數的第一行。
??????????????????子類當中至少有一個構造方法去訪問父類構造方法。
????? ??結論:子類的所有的構造函數,默認都會訪問父類中空參數的構造函數,因為子類每一個構造函數內的第一行都有一句super();
????????????????? ?當父類中沒有空參數的構造函數時,子類必須手動通過super語句的形式來指定要訪問的構造函數。
? ? ? ? ? ?當然,子類的構造函數第一行也可以手動指定this語句來訪問本類中的構造函數,子類中至少有一個構造函數會訪問父類
? ? ? ? ? ? ? ? ? ? 中的構造函數。
?????????私有不能被繼承
——繼承權限問題(重點)
? ??子類的所有方法內部都可以訪問父類除私有成員以外的所有成員,所謂子類的所有方法也包括子類的私有方法。
? ? 通過子類對象名可以訪問:
????? ? 1、父類除私有成員外的所有成員。
????? ? 2、子類本身的除私有成員外的所有成員。
????????? ??? ? 例如:SupClass.Sub();
? ? 子類可以繼承父類除私有成員外的所有成員。
? ??父類的私有成員不可以被子類繼承,其他的成員都可以被子類繼承。
?——類的繼承舉例:
?/*
——不同訪問修飾符
——final 關鍵字
? ? 1、final可以修飾類,方法,變量。
? ??2、final修飾的類不可以被繼承。用final可以避免被繼承,避免被子類復寫函數。
? ??3、final修飾的方法不可以被覆蓋(復寫)。
? ??4、final修飾的變量只能被賦值一次。既可以修飾成員變量,也可以修飾局部變量。
? ? ? ? 當描述事物時,一些數據只是固定的,比如π,那么這時為了增強閱讀性,都給這些值起個名字,方便閱讀,而這個值不需要改變
????????,所以加上final修飾,作為常量:常量的書寫規范所有字母都大寫,如果有多個單詞組成,單詞間通過下劃線連接。
????5、內部類只能訪問被final修飾的局部變量。
——抽象類:(只能修飾類方法)
????? ??當多個類中出現相同功能,但是功能主體不同,這時可以進行向上抽取,但是只抽取功能定義,而不抽取功能主體。
????? ??抽象方法必須存放在抽象類中。
? ??抽象類的特點:
????? ? 1、抽象方法一定定義在抽象類中。
?????? ?2、抽象方法和抽象類都必須被abstract關鍵字修飾。
????? ? 3、抽象類不可以用new創建對象,因為調用抽象方法沒意義。
????? ? 4、抽象類中的方法要被調用,必須由子類復寫其所有的抽象方法后,再建立子類對象調用
????????? ??如果子類對象只覆蓋了部分抽象方法,那么該子類還是一個抽象類。?
????? ??5、抽象類中可以有抽象方法,也可以有非抽象方法。
????? ? 6、構造方法和靜態方法不能抽象。?
? ? 抽象類和一般類沒有太大的不同,該如何描述事物就如何描述事物,只不過該事物內部有一些看不懂的東西,這些不確定的部分,也
? ? 是該事物的功能,要明確定義函數,但是無法定義函數主體,則需要子類對象去按需定義。
????抽象類比一般函數多了個抽象函數,就是在類中可以定義抽象方法。?
? ??抽象類不可以實例化,必須通過子類來實例化。
????????private:私有的方法是不可見的,無法被復寫
????????final:被final修飾的方法是最終方法,無法被復寫
????????static:被static修飾的方法,要隨類加載到方法區,由于抽象方法沒有方法體所以不能加載
? ? 特殊:
????? ? 抽象類中可以不定義抽象方法,這樣做僅僅是不讓該類創建對象。
????????? ??abstract class Employee
????????????????} }
——接口
? ??接口和抽象類的父類引用可以接收子類對象。
????接口的目的:
? ? ????避免單繼承的局限性:
? ??????? ? 可以解決類的單一繼承問題。
????????? ? 接口之間可以實現多繼承。
????????? ? 接口之間可以多實現。
????? ? 解耦合
????????? ? 電腦上設置USB接口。
????????? ? 可以做到隨時更換。
????? ? 接口回調
????????? ? 在團隊開發時,先寫好接口。
????????? ? 其他類可以調用接口的方法,哪怕還沒有完全實現。
????? ? 指定標準和規范
????????? ? 具有指定的屬性值
????????? ? 必須實現指定的方法。
? ? 格式:
????? ? interface aa{ }
? ??接口中成員修飾符是固定的(接口中的成員都是public)
????? ? 成員常量:
????????? ? public static final int x = 3;
????? ? 成員函數:
????????? ? public abstract void show();
? ??接口的出現將“多繼承”通過另一種形式體現出來,即多實現。
? ??注意:子類要將接口中的所有成員全都實例化才能實現。
????????????????接口方法不能有主體。?
? ? 接口是不可以創建對象的,因為接口中包含抽象方法,需要被子類實現,子類對接口中的抽象方法全都覆蓋后,才可以實例化,否則
????子類還是一個抽象類。
? ? 接口可以被類多實現:
????? ? 一個類可以同時實現多個接口,一個接口可以被類多實現,也是對多繼承不支持的轉換形式,Java支持多實現。
? ? 一個類在繼承一個類的同時還能實現多個接口。
? ??Java支持多繼承,只有接口和接口之間支持多繼承。
——接口的特點
? ? 接口中的所有方法都是抽象的、public的,但是可以不加修飾符,因為只要是interface,就默認強制abstract、public。
? ??接口中的所有屬性都是public static final,可以省略不寫。
? ? 1、接口是對外暴露的規則。
????? ? 可以通過接口訪問類。
? ? 2、接口是程序的功能擴展。
????? ? 將功能單獨封裝,在類中implements接口。
? ??3、接口可以用來多實現。
????? ? 降低類之間的耦合性。
? ??4、類與接口之間是實現關系,而且類可以繼承一個類的同時實現多個接口。
? ??5、接口與接口之間可以有繼承關系。
? ??6、接口中可以定義靜態屬性,但是不能定義靜態方法。
——多態
? ? 多態自始至終都是子類對象在做變化。
? ? 定義:
????? ? 可以理解為事物存在的多種體現形態。
????????某一類事物的多種存在形式,例如貓是貓科動物,同時貓也可以成為動物。
? ??1、多態的體現
????? ? 父類的引用指向了自己的子類對象。(父類的引用也可以接收自己的子類對象)
? ??2、多態的前提
????? ? 必須是類與類之間有關系,要么是繼承要么是實現。
????? ? 通常還有一個前提,就是覆蓋
? ??3、多態的好處
????? ? 多態的出現大大的提高了程序的擴展性。
????? ? 后期再出現對象,方法不需要修改,可以直接執行。
? ? 4、多態的弊端
????? ? 提高了擴展性,但是只能使用父類的引用訪問父類中的成員。
? ? 5、多態的應用
? ? 6、多態的出現代碼中的特點(多態使用的注意事項)
????? ? 在多態中(當父類指向子類對象時)成員函數(非靜態,可重寫)的特點:
????????? ??在編譯時期:參閱引用所屬的類中是否有調用的方法,如果有則編譯通過,如果沒有編譯失敗。
????????? ? 在運行時期:參閱對象所屬類中是否有調用的方法。
????????????? ??Fu f = new Zi();
? ? ? ? ? ? ? ??編譯時查看Fu中有無調用的方法,運行時則查看new Zi()中有無調用的方法。
????????????? ? 如果子類對象有該方法,就運行子類對象的,如果沒有就運行父類的。?(其實就是子類的,因為子類已經繼承了父類)。
????? ? 簡單總結就是:
????????? ??成員函數在多態調用時,編譯看左邊,運行看右邊。
????????? ??在多態中成員變量的特點:
????????????? ? 無論編譯和運行,都參考左邊(引用型變量所屬的類)。
????????? ? 在多態中,靜態成員函數的特點:
????????????? ? 無論編譯和運行,都參考左邊。
????? ??多態調用情況:
? ? ? ? ? ? ?當調用成員變量時,默認調用父類變量。
????????? ? ?當調用成員方法時,默認調用子類方法。
????????????????
? ??7、類型轉換
????? ? Animal a = new Cat();? ? //類型提升,向上轉型。
????? ? 此時a引用中只有Animal中的成員方法,并無Cat中的成員方法,如果想要使用父類的引用調用Cat中的成員方法,需要類型轉換,向下轉型:
????????? ? Cat c = (Cat)a;? ? //類型轉換。
????? ? 此時將Animal的引用a轉換為Cat類型的引用c,c中既包含Animal的方法也包含子類Cat中的特有方法。
????? ??千萬不要將父類對象轉換成子類類型。Cat c = (Cat)a;轉換的其實是父類的引用。
????? ? 我們能轉換的是父類的引用,當父類引用指向了自己的子類對象時,該引用可以被提升,也可以被強制轉換。?
????? ? 多態自始至終都是子類對象在變化。
? ? 多態示例程序:
(1)
(2)
(3)多態的主板示例
interface PCI { public void open(); public void close(); } class mainBoard { public void run() { System.out.println("mainboard running!"); } public void usePCI(PCI p) { p.open(); p.close(); } } class netCard implements PCI { public void open() { System.out.println("netcard running!"); } public void close() { System.out.println("netcard closed!"); } } class soundCard implements PCI { public void open() { System.out.println("soundcard running!"); } public void close() { System.out.println("soundcard closed!"); } } public class DuotaiDemo4 { public static void main(String[] args) { mainBoard m = new mainBoard(); m.run(); m.usePCI(new netCard()); m.usePCI(new soundCard()); } } ——Object類__equals()
? ??1、Object類是所有對象的直接或者間接父類,該類中定義的肯定是所有對象都具備的功能。
? ??2、equals()比較的是堆中兩個對象的內容,而“==”比較的是棧中兩個對象的引用(內存空間)。
?????
????3、toString方法返回的是任意對象的所屬類和哈希值。
????? ? 輸出
? ? ? ??st.toString() = it.wang.Student@659e0bfd 4、類自帶的equals()和toString()方法大多無意義,一般會通過復寫方法自定義方法內容。
——內部類
????1、將一個類定義在另一個類的里面,一個類里面那個類就稱為內部類(內置類,嵌套類)。
??????? (1)內部類可以直接訪問外部類中的成員,包括私有成員。
??????? (2)而外部類要訪問內部類中的成員必須要建立內部類的對象。
????????(3)想要在主函數中創建某內部類對象,格式為Outer.Inner?? in =? new Outer().new Inner();
????????(4)之所以可以直接訪問外部類中的成員,是因為內部類中有默認的一個外部類引用(外部類名.this),格式為外部類名.this.內
????????????????部類成員。
????????? ? 當外部類、內部類和內部類成員方法的局部變量同名時,默認調用局部變量,如果想要調用內部類變量可以使用this,調用外部
????????????類變量使用? ? 外部類名.this.變量(使用外部類的引用來調用外部類的變量)
????package it.wang;
????class Outer
????{
??????? int x = 3;
??????? public void method()
??????? {
??????? ??? System.out.println("Outer x = " + x);
??????? }
??????? class Inner
??????? {
??? ??????? int x = 5;
??? ??????? void method2()
??? ??????? {
??? ??????? ??? System.out.println("Inner x = " + Outer.this.x);
??????? ??? ??? System.out.println("Inner x = " + x);
??? ??????? }
??????? }
????}
????public class Neibulei {
??????? public static void main(String[] args)
??????? {
??????? ??? Outer out = new Outer();
??????? ??? out.method();
??????? ??? Outer.Inner in2 = new Outer().new Inner();
??????? ??? in2.method2();
??????? }
????}
??? 訪問格式:
??????? 1、當內部類定義在外部類的成員位置上,而且非私有,可以在外部其他類中直接建立內部對象。非靜態,沒對象,不運行。
???????????? 格式
??????????????? 外部類名.內部類名?? 變量名 =? 外部類對象.內部類對象;
??????????????? Outer.Inner in = new Outer().new Inner();
??????? 2、當內部類被定義在外部類成員位置上,就可以被成員修飾符所修飾。
????????????比如private:將內部類在外部類中進行封裝。
??????????? static:內部類就具備靜態的特性。
????????????當內部類被static修飾后,只能直接訪問外部類中的static成員,出現了訪問局限性。
????????3、在外部其他類中,如何直接訪問static內部類的非靜態成員呢?
??????????? new? Outer.Inner().function();
????????4、在外部其他類中,如何直接訪問static內部類的靜態成員呢?
???????????? Outer.Inner.function();
?????注意:
??????? 當內部類中定義了靜態成員,該內部類必須是static的。
??????? 當外部類中的靜態方法訪問內部類時,內部類也必須是static的。
? ? 內部類定義在局部時:
? ? ? ??(1)不可以被成員修飾符修飾。
? ? ? ? (2)可以直接訪問外部類中的成員,因為內部類中還持有外部類中的引用。
? ? ? ? ? ? ? ? ?但是不可以訪問它所在的局部方法中的變量,只能訪問被final修飾的局部變量。?
? ? 3、匿名內部類
????? ? (1)匿名內部類其實就是內部類的簡寫格式。
????? ??(2)定義匿名內部類的前提:內部類必須繼承一個類或者實現接口。(因為需要用父類來創建內部類子類對象)
????? ??(3)匿名內部類的格式:new 父類或者接口( ) { 定義子類的內容 }
????????????? ? 內部類創建對象:
????????????????? ??new Inner().show();
????????????? ? 轉換為匿名內部類就是:
????????????????? ??new AbsDemo()????//因為沒有了內部類,所以直接使用父類來創建對象
????????????????????{
????????????????????????? ? void show(){}? ? //復寫父類方法,
????????????????????}.show();? ? //調用子類復寫過的方法
????????????? ? 紅色:使用父類創建了一個匿名內部類對象并復寫了父類方法。
????????????? ? 藍色:調用子類復寫父類的方法。?
????? ??(4)其實匿名內部類就是一個匿名子類對象。(把定義類和封裝對象定義為一體的表現形式)
????? ??注意:
????????? ? (1)匿名內部類中可以創建自己的成員。
????????? ? (2)匿名對象對方法只能調用一次(只能同時調用一個方法)。
????? ? ? ? (3)在局部創建匿名內部類的對象時,格式為:父類名 ?對象名 ?= ?new ?父類或者接口名( ) { 定義子類的內容 };
????????????????????當父類中沒有定義方法,則父類引用不能調用該方法。
????????????????? ? ?需求:給內部類建立一個引用,可以多次調用內部類方法(父類方法和特有方法)。
????????????????????????? ??AbsDemo d?=?new AbsDemo()
????????????????????????????{
????????????????????????????? ? void show()????? ? //繼承自父類的方法并復寫
????????????????????????????????{
????????????????????????????????? ? System.out.println("hello");
????????????????????????????? ? }
????????????????????????????? ? void run()????? ? //子類特有方法
????????????????????????????? ? {
????????????????????????????????? ? System.out.println("world");
????????????????????????????? ? }
????????????????????????? ? }
? ? ? ? ? ? ? ? ? ? 這樣使用父類引用創建內部類的子類對象,就是多態。
????????????????? ? 這樣定義的方式不能再最后加.show()來調用show方法。
????????????????? ? 當出現多態情況時,使用父類引用只能調用父類方法,不能使用父類引用調用子類方法。
????????? ? (4)匿名內部類中的方法不要超過三個,否則影響閱讀性。
——異常機制
? ? 1、異常:就是程序在運行時出現不正常情況。
? ??2、異常的體系
????? ? Throwable
????????? ? Error
????????????? ? 通常出現重大問題,如:運行的類不存在或者內存溢出等。
????????????? ? Error類對象由Java虛擬機生成并拋出,程序無法捕獲。
????????? ? Exception
????????????? ? 在運行時出現的一些情況,可以通過try catch finally
????????????? ? Exception類對象由應用程序處理或拋出。
????? ? Exception和Error的子類名都是以父類名作為后綴。
? ? 3、異常由來
????? ? 問題也是現實生活中一個具體的事物,也可以通過Java的類的形式進行描述,其實就是Java對不正常情況進行描述后的對象的
????????體現。
? ? 4、對于問題的劃分:
????? ? 嚴重:
????????? ? Java通過Error類進行描述。
????????? ? 對于Error一般不編寫針對性的代碼對其進行處理。
????? ? 一般:
????????? ? Java通過Exception類進行描述。
????????? ? 對于Exception可以使用針對性的處理方式進行處理。
? ??5、異常的處理
????? ? Java提供了特有的語句進行處理。
????? ? try
????? ? {? ? 需要被檢測的代碼;????}
????? ? catch(異常類 ?對象)
????? ? {? ? 處理異常的代碼:(處理方式)? ? }
????? ? finally
????? ? {????一定會執行的語句;????}
? ? 6、對捕獲到的異常對象進行常見方法操作。
????? ? String getMessage();? ? // 返回異常信息
????? ? void printStackTrace();? ? // 打印異常在堆棧中的跟蹤信息,JVM默認調用該方法。
????? ? String toString();? ? 輸出異常名稱:異常信息。
????異常拋出:try_catch
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 類中的方法 { System.out.println("不能除零");
System.out.println(ex.getMessage());? ? // 輸出異常信息 System.out.println(ex.toString());????????? ?// 打印異常對象的字符串表現形式,在輸出語句中打印對象,toSting可寫可
????????????????????????????????????????????????????????????????????????????????????????不寫。?? ? 輸出 ?異常名稱:異常信息 ????????????????ex.printStackTrace();? ? // 無返回值,不能放在輸出語句中 ?輸出 ?異常名稱,異常信息,異常出現的位置。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 其實JVM默認的異常處理機制,就是在調用printStackTrace方法,打印異常在堆棧中個跟蹤信息。? } System.out.println("exit"); } }
????程序執行時,運行到int a = j.div(8.0);,跳轉到Jisuan類中的div方法中,執行a/b時發現b為0,此時調用ArithmeticException()方法,通
????過new ArithmeticException()將div方法封裝成對象,傳送到catch(Exception ex)中,
????相當于Exception ex = new ArichmeticException(),然后執行catch內部命令,則異常處理完畢,程序繼續向下知行。?
? ??7、異常聲明
????? ? 在方法上聲明異常,便于提高安全性(因為方法可能有問題),讓調用處進行try、catch或者拋出異常等處理,不處理則編譯失敗(不處理不讓用)
? ??8、對多異常的處理
????? ??1、聲明異常時,建議聲明更為具體的異常,這樣處理的可以更具體。
????? ??2、函數處聲明幾個異常,調用處就要對應有幾個catch代碼塊,并且catch不會同時發生,一旦出現一個異常,就會返回處理相對
????????????應異常的catch。
????????? ? ????????可以使用Exception來處理所有異常,但是Exception處理異常沒有針對性,最好不要寫Exception,因為如果出現了預料之
????????????外的異常,被Exception處理之后,程序員并不知道發生了什么異常。如果多個catch代碼塊中的異常出現繼承關系,父類異
????????????常catch代碼塊放在最后。
????? ??3、在進行catch處理時,catch中一定要定義具體處理方式,不要簡單定義一句ex.printStackTrace();,也不要簡單的就寫一條輸出
????????? ? ?語句。用一個異常日志文件保存。
? ? 9、自定義異常
????? ??自定義異常需要繼承Exception父類異常,否則該類和異常體系無關。
????? ??在方法中使用throw new一個對象拋出異常時需要在方法上使用throws聲明異常。
????? ? 定義自定義異常類時,可以在類中定義一個message字符串,throw異常時使用構造方法來初始化message,再在catch中使
????????用getMessage方法來獲取信息,因為父類Throwable中已經定義了String message,所以不必在子類中定義Message了。
????? ? (1)因為項目中會出現某些特有的問題,而這些問題并未被Java所描述并封裝對象,所以對于這些特有的問題可以按照Java對于
????????????? ? ?異常問題封裝的思想,將特有的問題進行自定義的異常封裝。
????? ??(2)當在函數內部出現了throw拋出異常對象,要么就必須要給出對應的處理動作,要么在函數內部try_catch處理,要么在函數上
????????????? ? ?聲明讓調用者處理。
????? ? ? ???????一般情況下,函數內出現異常,函數上需要聲明。?
????? ? (3)如何定義異常信息
????????????? ? class Throwable{
????????????? ? ? ? private String message;
????????????????? ? Throwable(String message){
????????????????? ? ? ? this.message = message;
????????????????????}
????????????????? ? public String getMessage(){
????????????????????? ? return message;
????????????????? ? }
????????????????}
????????????? ? class Exception extends Throwable{
????????????? ? ? ? Exception(String message){
????????????????? ? ? ? super(message);
????????????????????}
????????????????}
????????????? ? 因為父類(Throwable)中已經把異常信息的操作都完成了,所以子類(Exception)只要在調用構造方法時,將異常信息
????????????????用super傳遞給父類,就可以直接通過getMessage方法獲取自定義的異常信息了。?
????? ? (4)自定義異常必須是自定義類繼承Exception,如果不繼承Exception,那么該自定義類就和異常無關。
????? ? (5)為什么繼承Exception而不繼承Throwable原因
????????????? ? 異常體系有一個特點:異常類和異常對象都必須被拋出,因為它們都具備可拋性,這個可拋性是Throwable體系中的獨有特點
????????????????,只有這個體系中的類和對象才可以被throws和throw操作。
????? ??(6)throws和throw的區別
????????????? ? throws使用在函數上,throw使用在函數內。
????????????? ? throws后面跟的是異常類,可以跟多個,用逗號隔開,throw后面跟的是異常對象。
????????ZidingyiException(String msg) { super(msg); }
????????*/ private String msg; private int value; ZidingyiException(String msg,int value) { this.msg = msg; this.value = value; } public String getMessage() { return msg; } public int getValue() { return value; } } class Jisuan { public int div(int a,int b)????throws ZidingyiException { if(b < 0) throw new ZidingyiException("被除數不能為負數",b);//手動通過throw關鍵字拋出一個自定義異常。 return a/b; } } public class ThrowsDemo { public static void main(String[] args)????throws ZidingyiException { Jisuan j = new Jisuan(); try { int x = j.div(4,-1); System.out.println(x); } catch (ZidingyiException ex) { System.out.println(ex.toString()); System.out.println(ex.getMessage()); System.out.println("錯誤的數字是:"+ ex.getValue()); } } }
? ? 10、RuntimeException
????? ? (1)Exception中有一個特殊的子類異常RuntimeException,運行時異常。
????? ??(2)如果在函數內拋出該異常,函數上可以不用聲明,編譯一樣通過。
????????????? ? ?如果在函數上聲明了該異常,調用者可以不用進行處理,編譯一樣通過。
????? ? (3)之所以不用再函數內聲明,是因為不需要讓調用者處理,當該異常發生,程序無法繼續執行,希望程序停止后對代碼進行修正
????????????? ? ?自定義異常時,如果該異常的發生導致程序無法繼續執行,就讓自定義異常繼承RuntimeException。
????? ?????? ? ??RuntimeException以及RuntimeException的子類如果在函數內拋出,函數上不用聲明。
????? ? (4)對于異常分兩種:
????????????? ? ?1、編譯時被檢測的異常。
????????????? ? ?2、編譯時不被檢測的異常(運行時異常,RuntimeException及其子類)。
????? ??(5)編譯時編譯器默認判斷(a instanceof?RuntimeException)
? ? 11、finally關鍵字
? ? try
? ? {
????? ? 連接數據庫;
????? ? 數據操作;
? ? }
? ? catch(SQLException ex)
? ? {
????? ? 對數據庫進行異常處理;
? ? }
? ? finally
? ? {
????? ? 關閉數據庫連接;
? ? }
? ??注意:catch用于處理異常,如果沒有catch就代表異常沒有被處理過,如果該異常是檢測時異常,那么必須聲明。
????
? ? 12、子父類覆蓋時的異常特點
????? ??(1)子類在覆蓋父類時,如果父類的方法拋出異常,那么子類覆蓋的方法,只能拋出父類的異常或者該異常的子類。
????? ??(3)如果父類或者接口的方法中沒有拋出異常,那么子類在覆蓋方法時,也不能拋出異常;如果子類方法發生了異常,則必須要
????????????? ? ?進行try處理,絕對不能拋出異常。
????? ? 簡單來說:
????????? ? 子類只能拋父類所拋過的異常,父類如果沒有拋異常,子類也不能拋。?
????package Yichang; class AException { } class BException extends AException { } class CException { } class Fu { public void show()throws AException { } } class Zi extends Fu { public void show()throws BException } public class Zifuleiyichang { public static void main(String[] args) { System.out.println("hello world"); } } 13、異常總結
????? ? (1)異常是什么
????????? ? 異常是對問題的描述,將問題進行對象的封裝。
????? ? (2)異常體系
????????? ??Throwable
????????????? ? |----Error
????????????? ? |----Exception
????????????????? ? |----RuntimeException
????????? ? 異常體系的特點:
????????????? ? 異常體系中的所有類以及建立的對象都具備可拋性,也就是說可以被throw和throws關鍵字所操作,只有異常體系具備這個特點
????? ? (3)throw和throws的用法:
????????? ? throw定義在函數內,用于拋出異常。
????????? ? throws定義在函數上,用于拋出異常類,可以拋出多個異常類,用逗號隔開。
????????? ? 當函數內有throw拋出異常對象,并未進行try處理,必須要在函數上聲明,否則編譯失敗。
????? ? 注意:RuntimeException除外,也就是說,函數內如果拋出的RuntimeException異常,函數上可以不聲明。
????? ? (4)異常有兩種
????????? ? 編譯時被檢測異常
????????????? ? 該異常在編譯時,如果沒有處理(沒有throw也沒有try),編譯失敗。
????????????? ? 該異常被標識,代表這可以被處理。
????????? ? 運行時異常(編譯時不檢測)
????????????? ? 在編譯時,不需要處理,編譯器不檢查。
????????????? ? 該異常的發生,建議不處理,讓程序停止,需要對代碼進行修正。
????? ? (5)異常處理語句
????????? ? try
????????? ? {
????????????? ? 需要被檢測的代碼;
????????? ? }
????????? ? catch()
????????? ? {
????????????? ? 處理異常的代碼;
????? ??? ? }
????????? ? finally
????????? ? {
????????????? ? 一定會執行的代碼;
????????? ? }
????????? ??注意:
????????????? ? 1、finally中定義的通常是關閉資源代碼,因為資源必須釋放。
????????????? ? 2、finally只有一種情況不會執行,當執行到System.exit(0);程序退出,finally不會執行。
????? ? (6)自定義異常
????????? ? 定義類繼承Exception或者RuntimeException
????????? ? ????1、為了讓該自定義類具備可拋性。
????????? ? ????2、讓該類具備操作異常的共性方法
????????? ? 當要定義自定義異常的信息時,可以使用父類已經定義好的功能,異常信息傳遞給父類的構造函數。
????????????? ? class MyException extends Exception
????????????? ? {
????????????????????? ? MyException(String message)
????????????????????? ? {
????????????????????????????? ? super(message);
????????????????????? ? }
????????????? ? }
????????? ? 自定義異常:按照Java的面向對象思想,將程序中出現的特有問題進行封裝。
????? ? (7)異常的好處
????????? ? 1、將問題進行封裝。
????????? ? 2、將正常流程代碼和問題處理代碼相分離,方便于閱讀。
????? ? (8)異常的處理原則
????????? ? 1、處理方式有兩種:try或者throw
????????? ??2、調用到拋出異常的功能時,拋出幾個就處理幾個,一個try對應多個catch。
????????? ? 3、有多個catch時,父類的catch放到最下面。
????????? ? 4、catch內,需要定義針對性的處理方式,不要簡單地定義printStackTrace輸出語句。也不要不寫。
????????? ??5、當捕獲到的異常本功能處理不了時,可以繼續在catch中拋出。
????????? ? 6、Java允許throws處理異常,最終拋給虛擬機處理,虛擬機發現異常后會終止程序運行。
????????? ? 7、特殊情況下會做throws處理,將底層異常拋到上一層集中處理。?
????????????? ? try
????????????? ? {
????????????????????? ? throw new AException();
????????????? ? }
????????????? ? catch (AException ex)?
????????????? ? {
????????????????????? ? throw ex;
????????????? ? }
????????? ??如果該異常處理不了,并且不屬于該功能出現的異常,可以將異常轉換后,再拋出和該功能相關的異常。
????? ??????? ? try
????????????? ? {
????????????????????? ? throw new AException();
????????????? ? }
????????????? ? catch (AException ex)
????????????? ? {
????????????????????? ??//或者先對AException進行處理,然后再拋出BException();
????????????????????? ? throw new BException();
????????????? ? }
????????? ??異常的注意事項:
????????????? ? 在子父類覆蓋時
????????????? ? 1、子類拋出的異常必須是父類異常的子類或者子集。
????????????? ? 2、如果父類或者接口沒有異常拋出時,子類覆蓋出現異常,只能try不能拋。
——包package
? ? 1、對文件進行分類管理。
? ? 2、給類提供多層命名空間。
? ? 3、寫在程序文件的第一行。
? ? 4、類名的全稱是? ? 包名.類名
? ? 5、包也是一種封裝形式。
? ? 6、包名所有字母小寫
? ? 7、包與包之間進行訪問,被訪問的包中的類以及類中的成員,需要public修飾。
? ? 8、不同包中的子類還可以直接訪問父類中被protected權限修飾的成員。包與包之間的權限只有兩種,public和protected
????? ? javac? ? -d . PackageDemo.java? ? 指定包所存放的目錄;. 表示當前目錄。
????? ? javac ? ?-d g:\Java program PackageDemo.java
????? ? 將包路徑指定為g:\Java program之后需要設置環境變量:set classpath=g:\Java program
????? ? java pack.PackageDemo? ? 運行pack包中的PackageDemo類文件。
轉載于:https://www.cnblogs.com/wwwwyc/p/6375010.html
總結
以上是生活随笔為你收集整理的Java程序设计学习笔记(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 网络连接状态的监控
- 下一篇: salt-ssh 安装salt-mini