java从入门到放弃(一)
java從開始到放棄?
jdk:
軟件開發(fā)工具包(包含jre和軟件開發(fā)工具)(開發(fā)不同,jdk的大小不同,jdk的包也不同:javaee:企業(yè)版,javase:個(gè)人版,javame:袖珍版)
jre:
jvm和核心類庫(編寫簡(jiǎn)單java程序)(jar容器)
jvm:
JAVA跨平臺(tái)的根本,(java虛擬機(jī))
所以總結(jié):只要安裝jdk即可。
java基本語法
常量:
固定不變的量 整數(shù),小數(shù),布爾,字符,字符串
變量:
在內(nèi)存中開辟一塊空間,可以存儲(chǔ)數(shù)據(jù),但是一個(gè)變量只能存儲(chǔ)一個(gè)值,這個(gè)值是可以改變的。
注釋:
單行注釋://
多行注釋:/**/
文檔注釋:/** */在方法中顯示
關(guān)鍵字:
被java賦予了特殊含義的單詞,只能用,不能改,也不能重名
標(biāo)識(shí)符:
程序中需要我們自己命名的
由26個(gè)英語字母,數(shù)字,_,$組成
不能和關(guān)鍵字同名
不能以數(shù)字開頭
區(qū)分大小寫
數(shù)據(jù)類型:
規(guī)范變量的內(nèi)存大小,空間(取值)
基本數(shù)據(jù)類型(數(shù)值型,整數(shù)型,浮點(diǎn)型,字符型,布爾型)和引用數(shù)據(jù)類型(數(shù)組,類,接口)
有符號(hào)數(shù)最高為符號(hào)位。
float 4個(gè)字節(jié)(科學(xué)計(jì)算法,犧牲精度,最大值比long大的多)
double 8個(gè)字節(jié)(科學(xué)計(jì)算法,犧牲精度,最大值比long大的多)
long 8個(gè)字節(jié) int 4個(gè)字節(jié) short 2個(gè)字節(jié) byte 1 個(gè)字節(jié)
ASCII值(國(guó)標(biāo)碼)(中文字符碼GBK一個(gè)漢字對(duì)應(yīng)倆個(gè)字節(jié) GB-2312)一個(gè)漢字對(duì)應(yīng)三個(gè)字節(jié)(UTF-8)uncode (內(nèi)部編碼,倆個(gè)字節(jié))lso8859-1(歐洲)(不支持中文)
大寫A 65(32)
小寫a 97
0 48
大整數(shù)類
確定數(shù)據(jù)類型的優(yōu)先級(jí),從低到高
char,byte-short-int-long-float-double
進(jìn)制轉(zhuǎn)換:
1B = 8b 1kB=1024B 1MB=1024kB 1GB=1024MB 1TB=1024GB 1PB=1024TB System.out.println(14 + 'A' + 12);//字符轉(zhuǎn)換成整數(shù)運(yùn)算運(yùn)算符
第一:根據(jù)類型分類
算數(shù)運(yùn)算符:+ - * / % ++ --,賦值運(yùn)算符 = += -= *= /= %= ^=,邏輯運(yùn)算符 & && (短路與:當(dāng)多個(gè)&&出現(xiàn)時(shí),一旦發(fā)現(xiàn)一個(gè)flase,停止運(yùn)算 返回false。) | || (短路或:當(dāng)多個(gè)||出現(xiàn)時(shí),一旦發(fā)現(xiàn)一個(gè)true,停止運(yùn)算 返回 true。) !,關(guān)系運(yùn)算符 == < <= > >= != ,位運(yùn)算符& | ^ ~(不存在短路與,短路或),移位運(yùn)算符:>> << >>>
第二:根據(jù)操作元素個(gè)數(shù)分類
(異或:相同為0,不同為1)
一元運(yùn)算符
二元運(yùn)算符
三元運(yùn)算符 ? (true):(flase)
多個(gè)式子運(yùn)算時(shí):
1.排除法:先找優(yōu)先級(jí)最低的,考慮結(jié)合性
2.結(jié)合計(jì)算:
流程控制語句
實(shí)現(xiàn)現(xiàn)實(shí)中的邏輯(順序,循環(huán),分支(并列)三種結(jié)構(gòu))
分支
switch case final(多的話,用switch,少的用 if )
if else
循環(huán):
for (起始 結(jié)束 自增)起始條件不成立,不影響結(jié)束條件的判斷(循環(huán)起別名(標(biāo)識(shí)))
for循環(huán)的執(zhí)行順序(注int i=1;可以寫函數(shù)調(diào)用)
while 起始 結(jié)束 自增量
do while
foreach
函數(shù)(方法)
擁有一段特殊功能的代碼。函數(shù)的作用:提高程序的安全性,復(fù)用性,健壯性,可讀性,節(jié)省內(nèi)存。
函數(shù)的參數(shù),返回值,類型
public static int mytest() {
return (float)0;
}(錯(cuò)誤)
全局變量:相對(duì)的概念。比局部變量更大的范圍
成員變量:在堆區(qū),創(chuàng)建有默認(rèn)值。
局部變量:在棧區(qū),沒有默認(rèn)值。
函數(shù):在棧區(qū)。
對(duì)象:在堆區(qū)。
在java中內(nèi)存分為
堆:實(shí)體,整型默認(rèn)為0,布爾型默認(rèn)是false。(內(nèi)存中的一塊區(qū)域,使用的底層隊(duì)列結(jié)構(gòu))
棧:函數(shù),局部變量,先進(jìn)后出,使用完立刻釋放(內(nèi)存中的一塊區(qū)域,使用的底層棧結(jié)構(gòu))
方法區(qū),本地方法區(qū),寄存器
釋放機(jī)制:棧使用完立刻釋放,堆里面的東西(通過垃圾回收機(jī)制釋放)
遞歸:時(shí)間和空間的負(fù)責(zé)度(盡量避免遞歸)
重載:在同一類中,方法名相同,參數(shù)的個(gè)數(shù),位置,類型不同,(與返回值無關(guān))。作用:方便函數(shù)的編寫,程序的執(zhí)行。(構(gòu)造方法)
數(shù)組
數(shù)組:存儲(chǔ)多個(gè)數(shù)字;定義:可以同時(shí)存儲(chǔ)多個(gè)相同類型的數(shù)據(jù),他是引用數(shù)據(jù)類型,數(shù)組是被放在堆區(qū)的,有默認(rèn)值,
構(gòu)成:new + 數(shù)據(jù)類型 + [元素的個(gè)數(shù)]
new :在堆內(nèi)開辟空間,將數(shù)組的地址返回
int代表元素的數(shù)據(jù)類型
[3];代表數(shù)據(jù)的個(gè)數(shù)
我們可以通過一個(gè)變量保存數(shù)組的地址,這個(gè)變量的類型是int型的數(shù)組類型.
注意:int+[]是一個(gè)整體,代表一種數(shù)據(jù)類型,不能拆開.[]中也不能寫數(shù).
int[] arr = new int[3];
解釋:先拿arr(引用類型)中保存的地址找到數(shù)組,然后在根據(jù)下標(biāo)找到具體的元素,完成賦值或者取值
如果下標(biāo)超出了數(shù)的范圍,會(huì)報(bào)下標(biāo)越界異常
引用數(shù)據(jù)類型和基本數(shù)據(jù)類型:一個(gè)是值,一個(gè)是地址(16進(jìn)制)new在堆區(qū)里動(dòng)態(tài)開辟空間。存儲(chǔ)地址的類型(引用數(shù)據(jù)類型)
第一個(gè)元素的地址充當(dāng)整個(gè)數(shù)組的地址(數(shù)組的內(nèi)存是連續(xù)的,所以數(shù)組有下標(biāo)。)
初始化賦值創(chuàng)建
int[] arr1=new int[]{4,5,7};int[] arr2= {5,7,8,9};//自動(dòng)(new,分配空間)數(shù)組作為參數(shù)的時(shí)候不能直接使用大括號(hào)的方式。
地址傳遞(參數(shù)數(shù)組)
在進(jìn)行值傳遞的時(shí)候,函數(shù)里面無法影響的函數(shù)外
在進(jìn)行址傳遞的時(shí)候,函數(shù)里面可以影響的函數(shù)外
二維數(shù)組
一維數(shù)組:首地址
二維數(shù)組:多個(gè)一維數(shù)組的地址。
[外鏈圖片轉(zhuǎn)存失敗(img-iwyAvUD9-1568960839567)(C:\Users\zhaoboshi\AppData\Roaming\Typora\typora-user-images\1563937957499.png)]
int[][] arr3 ={{4,5},{3,4,5,6}}; int[][] arr2=new int[2][4]; arr2[0] = new int[3]; arr2[1] = new int[] {3,4,5}; arr2[2] = new int[3];排序
平均時(shí)間復(fù)雜度(犧牲空間,調(diào)高時(shí)間復(fù)雜度,提升用戶體驗(yàn))
?插入排序O(n^2)
冒泡排序
O(n^2)(循環(huán)首選最大值,倆個(gè)數(shù)比較)
選擇排序
快速排序O(n log n)
堆排序O(n log n)
? 歸并排序O(n log n)
? 基數(shù)排序O(n)
? 希爾排序O(n^1.25)
查找
二分查找 (有序)
這些算法的思想的在這不做詳細(xì)的介紹了:(但這些基礎(chǔ)的排序很重要也很基礎(chǔ),可自己查詢)
面向?qū)ο?/h3>
思想:封裝,繼承,多態(tài)
面向過程:強(qiáng)調(diào)的是功能行為:關(guān)注的是解決問題需要哪些步驟
面向?qū)ο?#xff1a;將功能封裝進(jìn)對(duì)象,強(qiáng)調(diào)具備功能的對(duì)象。關(guān)注的是解決問題需要哪些對(duì)象
面向?qū)ο笫腔诿嫦蜻^程的。面向?qū)ο笫欠先藗兯枷氲乃枷?#xff0c;可以使開發(fā)者有執(zhí)行者變?yōu)橹笓]者。
可以將復(fù)雜的事情簡(jiǎn)單化
? 類是對(duì)象的抽象
對(duì)象<------------------------>類(萬物皆對(duì)象)
? 對(duì)象是類的實(shí)現(xiàn)
類
類:類名,大駝峰原則
屬性,成員變量
行為,成員方法 小駝峰原則
名詞提煉法
擁有相同(或者相似)屬性和行為的對(duì)象都可以抽象出一個(gè)類
在創(chuàng)建對(duì)象時(shí)(new),調(diào)用構(gòu)造方法,構(gòu)造方法會(huì)對(duì)成員變量初始化(空參構(gòu)造方法 ,整型0 ,引用為null)。(創(chuàng)建對(duì)象時(shí)的保存對(duì)象地址的變量在棧里)(方法在棧里調(diào)用)。如果沒有引用的對(duì)象(可以被垃圾回收機(jī)制回收,匿名對(duì)象)
匿名對(duì)象的作用:節(jié)省代碼,節(jié)省內(nèi)存。
應(yīng)用場(chǎng)所:作為參數(shù)傳遞
數(shù)組就是特殊的對(duì)象。
一個(gè)類型一旦創(chuàng)建出來,就是一個(gè)獨(dú)立的數(shù)據(jù)類型,在他可見的范圍內(nèi)都是可以使用的,包括內(nèi)部。
屬性:權(quán)限
static修飾成員的功能 :靜態(tài)成員變量,引用可以調(diào)用靜態(tài)(推薦使用類名調(diào)用)類名無法調(diào)用非靜態(tài)的屬性;非靜態(tài)的成員變量只能用引用調(diào)用。
總結(jié)成員變量的特點(diǎn):
1.在創(chuàng)建對(duì)象的時(shí)候會(huì)賦默認(rèn)值
2.可以在類中定義變量的時(shí)候,直接賦值
3.非靜態(tài)的成員變量可以在除了static修飾的方法外任何地方使用.
成員變量和局部變量的區(qū)別:
1.作用域:成員變量是整個(gè)對(duì)象.局部變量是從定義開始到所在的函數(shù)/if/for結(jié)束
2.默認(rèn)值:成員變量會(huì)有默認(rèn)值,局部變量沒有默認(rèn)值,要想使用必須先賦值
3.釋放機(jī)制:成員變量跟對(duì)象保持一致,通過垃圾回收機(jī)制回收,局部變量使用完立即釋放
4.存放的位置:成員變量放在堆區(qū)中的對(duì)象中,局部變量放在棧區(qū)中的方法中.
static:這是一個(gè)關(guān)鍵字,被static修飾的成員就變成了靜態(tài)的.具有保值功能
一個(gè)類對(duì)應(yīng)一個(gè)字節(jié)碼文件,
靜態(tài)方法區(qū):類變成一個(gè).class文件,當(dāng)類中存在靜態(tài)屬性和方法時(shí),靜態(tài)屬性和方法會(huì)被復(fù)制(從.class文件中)一份放在靜態(tài)方法區(qū)(通常認(rèn)為靜態(tài)方法區(qū)在方法區(qū)的獨(dú)立空間)對(duì)象的堆空間里只存在非靜態(tài)的方法和屬性。
類調(diào)用靜態(tài)屬性時(shí),是字節(jié)碼文件(.class)調(diào)用的靜態(tài)對(duì)象(字節(jié)碼文件是一個(gè)對(duì)象(特殊對(duì)象))。
靜態(tài)的成員方法和非靜態(tài)的成員方法優(yōu)先使用靜態(tài)的成員方法。效率高,節(jié)省內(nèi)存。除一種(當(dāng)方法中使用非靜態(tài)的屬性(成員變量),只能是非靜態(tài)的方法)
工具類:類似工具經(jīng)常使用的時(shí)候,可以用static封裝工具類
構(gòu)造方法:
默認(rèn)創(chuàng)建無參的構(gòu)造方法。作用:在對(duì)象被創(chuàng)建的時(shí)候給屬性賦值。
this關(guān)鍵字:
構(gòu)造方法局部變量和成員變量相同時(shí)(就近原則,沒有this時(shí)),this等于引用值(引用數(shù)據(jù)類型,等于當(dāng)前的對(duì)象地址)。this()可以當(dāng)做構(gòu)造方法 ;
this的注意點(diǎn):
1.不能自己調(diào)用自己—死循環(huán)
2.不能相互調(diào)用,死循環(huán)
3.this充當(dāng)構(gòu)造方法時(shí),必須放在第一行
4.this在作為方法的時(shí)候,只能充當(dāng)構(gòu)造方法,不能作為其他方法
5.this的使用范圍就是當(dāng)前類的內(nèi)部
構(gòu)造代碼塊:
隨著對(duì)象的加載而加載,優(yōu)先于構(gòu)造方法之前,對(duì)象每創(chuàng)建一次執(zhí)行一次。{}
靜態(tài)代碼塊:
父子類靜態(tài)代碼塊的加載,父類靜態(tài)代碼塊在前。
隨著類的加載而加載,優(yōu)先于main,整個(gè)程序執(zhí)行過程中只執(zhí)行一次。static{}
封裝性:
通過對(duì)具體屬性的封裝實(shí)現(xiàn)的,把對(duì)成員變量私有話,通過范圍修飾詞:private,增加安全性,復(fù)用性和可讀性。
set get (約定規(guī)則,統(tǒng)一規(guī)范,方便使用)
臟數(shù)據(jù):
臟數(shù)據(jù):我們把程序中出現(xiàn)的不符合邏輯的數(shù)據(jù)稱為臟數(shù)據(jù)
原因:讓用戶直接將數(shù)據(jù)傳給了成員變量
解決:1.不讓他直接傳值----將成員變量私有化,寫一個(gè)公共的方法
2.對(duì)數(shù)據(jù)進(jìn)行過濾,將過濾后的數(shù)據(jù)交給成員變量
繼承:
關(guān)鍵字:extend 繼承的源object
功能:減少代碼,多態(tài)的前提,方便操作,增加復(fù)用性,可讀性,安全類。
繼承當(dāng)中方法的調(diào)用順序:
首先從自己的方法里找,如果沒有,就會(huì)從父類開始往上尋找。
重寫
(返回值為類型時(shí),可以為父子關(guān)系):從父類繼承中的方法中(增加了特殊功能),重寫方法的返回值可以與父類的相同,也可以是父類的子類
重載(Overload)
重載(overloading) 是在一個(gè)類里面,方法名字相同,而參數(shù)不同。返回類型可以相同也可以不同。
每個(gè)重載的方法(或者構(gòu)造函數(shù))都必須有一個(gè)獨(dú)一無二的參數(shù)類型列表。
最常用的地方就是構(gòu)造器的重載。
重載規(guī)則:
被重載的方法必須改變參數(shù)列表(參數(shù)個(gè)數(shù)或類型不一樣);
- 被重載的方法可以改變返回類型;
- 被重載的方法可以改變?cè)L問修飾符;
- 被重載的方法可以聲明新的或更廣的檢查異常;
- 方法能夠在同一個(gè)類中或者在一個(gè)子類中被重載。
- 無法以返回值類型作為重載函數(shù)的區(qū)分標(biāo)準(zhǔn)。
super關(guān)鍵字:
代表的是當(dāng)前對(duì)象的父類,可以調(diào)用父類的方法和屬性。但是它不是引用數(shù)據(jù)結(jié)構(gòu)。在子類構(gòu)造方法中,默認(rèn)是有super();調(diào)用父類的空參構(gòu)造方法。(new 子類的時(shí)候,也創(chuàng)建了父類對(duì)象)
final:關(guān)鍵字
可以修飾的內(nèi)容:
1.類:final修飾的類不能有子類
2.成員變量:final修飾的變量是一個(gè)終值,不能再被改變,所以必須賦值。
3.局部變量:被final修飾的局部變量是一個(gè)終值,不能被再改變
4.方法:final修飾的方法不允許重寫
5.空白final ------(final在定義成員變量的時(shí)候,可以在構(gòu)造方法中賦值(即在定義時(shí)可以不賦值,但是在構(gòu)造方法中必須賦值))
public static void main(String args[]){}object:
clone();克隆
(創(chuàng)建對(duì)象的四種方式:new ,克隆,反序列化,反射)
1.要想使用clone方法完成克隆,當(dāng)前類必須實(shí)現(xiàn)了Cloneable這個(gè)接口
2.要想使用必須要重寫這個(gè)方法
3.不是所有系統(tǒng)類都實(shí)現(xiàn)了他.比如Object,Integer,String等.實(shí)現(xiàn)了他的有ArrayList,LinkedList
4.clone沒有調(diào)用new方法和構(gòu)造方法.克隆不會(huì)調(diào)用構(gòu)造方法,克隆時(shí),根據(jù)源對(duì)象類型先分配和源對(duì)象相同的內(nèi)存,然后將源對(duì)象中的各個(gè)域中數(shù)據(jù)拷貝過來,最后返回對(duì)象地址。new時(shí),第1步也是先分配內(nèi)存,然后調(diào)用構(gòu)造方法初始化數(shù)據(jù),最后將對(duì)象地址返回,
外界就可以通過這個(gè)對(duì)象地址(引用)操作此對(duì)象。
5.調(diào)用clone沒有辦法實(shí)現(xiàn)完全的深拷貝.對(duì)于調(diào)用clone的對(duì)象是深拷貝,但是對(duì)于他的成員默認(rèn)還是淺拷貝,
如果想讓成員也深拷貝,就要在重寫的clone方法中調(diào)用成員的clone方法,依次類推.
equals(object obj);
比較地址。容錯(cuò)處理。(重載,如果倆個(gè)重載方法,類型是父子關(guān)系,倆個(gè)方法都可以執(zhí)行,存在優(yōu)先級(jí)。)
finalize();
垃圾回收,
getclass();
返回此object的運(yùn)行時(shí)類,字節(jié)碼文件對(duì)象 ,字節(jié)碼文件對(duì)應(yīng)的類(Class)。字節(jié)碼文件對(duì)象對(duì)應(yīng)字節(jié)碼文件(.class這個(gè)屬性也可以獲得字節(jié)碼文件對(duì)象)
jvm中類加載器生成字節(jié)碼文件對(duì)象
hashcode();
應(yīng)用:對(duì)象的身份證。
toString():
默認(rèn)調(diào)用(打印報(bào)名+@+hash碼)
abstract:抽象的
抽象類中可以沒有抽象方法;有抽象方法的類一定是抽象類。
繼承的子類要么也是抽象類,要么是實(shí)現(xiàn)父類的抽象方法。
抽象類不能直接創(chuàng)建對(duì)象,必須通過子類實(shí)現(xiàn),所以抽象類一定有子類。
抽象類的作用:
1抽象方法是沒有實(shí)現(xiàn)的方法,抽象方法類似于規(guī)則聲明(制定規(guī)則),可以制定一批規(guī)則。
2.可以節(jié)省代碼
抽象類是介于接口和類之間。
比較:final,abstract,static,private
abstract(不能直接調(diào)方法,必須繼承)和final(不能繼承,不能重寫)和static(類,調(diào)用)和private不能共用。
不能與abstract同時(shí)存在的關(guān)鍵字
1.final:被final修飾的類不能有子類,方法不能重寫,但是abstract必須有子類,必須重寫
2.static:修飾的方法可以通過類名調(diào)用,abstract必須通過子類實(shí)現(xiàn)
3.private:修飾的方法不能重寫,abstract必須重寫
接口:interface
接口也是抽象的
類<—>類(繼承) extends
類<—>接口(實(shí)現(xiàn))implements
成員變量:默認(rèn)public,final,static(類型)符號(hào)常量。
成員方法:默認(rèn)是public,abstract
單繼承,多實(shí)現(xiàn)。
接口與接口之間的繼承是繼承。(接口同名的方法在類中可以實(shí)現(xiàn)(接口倆個(gè)方法實(shí)現(xiàn)沒有區(qū)別))。
一般父類中放的是主要功能,接口中放的是額外的功能,接口作為父類的補(bǔ)充。
從jdk1.7 開始,以后的接口中可以有方法的實(shí)現(xiàn),但是方法必須使用static或default修飾(接口同名的方法(實(shí)現(xiàn)不同方法(也可能是一個(gè)實(shí)現(xiàn),一個(gè)是抽象的))在類中使用時(shí)必須重寫(即倆個(gè)接口的實(shí)現(xiàn)方法都不取,自己實(shí)現(xiàn))
接口的子類重寫方法注意事項(xiàng):
如果一個(gè)類實(shí)現(xiàn)兩個(gè)接口,這兩個(gè)接口同時(shí)有相同的抽象方法,在類中只需要重寫一次這個(gè)方法。
如果接口中有default修飾的方法不需要重寫。
如果兩個(gè)接口里的方法名相同都是default方法,里面的方法體不同,在類中需要重寫該方法。
如果兩個(gè)接口中方法名,參數(shù)都相同的方法,一個(gè)接口是抽象方法,另一個(gè)是default修飾有方法體。這時(shí)該類也必須重寫該方法。
面向接口編程:一個(gè)類聲明一個(gè)接口(接口暴露,類不暴露實(shí)現(xiàn))
設(shè)計(jì)模式
設(shè)計(jì)模式:前人總結(jié)出來的對(duì)一些常見問題的解決方案,后人直接拿來使用.
常用的設(shè)計(jì)模式:單例,工廠,代理,適配器,裝飾,模板,觀察者等,一共有23種
單例模式
分析:
1.我們肯定要建立一個(gè)單例類來描述
2.只允許有一個(gè)對(duì)象
3.全局的訪問點(diǎn):說的就是當(dāng)前的s----通過static實(shí)現(xiàn)的
4.提供出去
5.給大家使用
作用:
1.傳值
2.作為全局的訪問點(diǎn).
使用單例傳值的好處:
好處:可以讓兩個(gè)對(duì)象在完全沒有關(guān)系的前提下,實(shí)現(xiàn)值的傳遞,降低了耦合性,提高了內(nèi)聚性
耦合性,內(nèi)聚性在微觀上說:描述的是類與類之間的關(guān)系
好處:我們應(yīng)該盡量提高內(nèi)聚性,減少耦合性,可以提高程序的健壯性,增加代碼的可移植性,方便實(shí)現(xiàn)模塊兒化編程
如何做到低耦合高內(nèi)聚?
在處理類與類關(guān)系的時(shí)候,讓類之間的關(guān)系越緊密耦合性越高,內(nèi)聚性越低.反之,關(guān)系越松散耦合性越低,內(nèi)聚性越高.
注意:在單例中一般只有向外提供s的方法是靜態(tài)的,其他的都是非靜態(tài)的.
通過static修飾對(duì)象名(當(dāng)對(duì)象有被對(duì)象名指向時(shí),垃圾回收機(jī)制不會(huì)清除)長(zhǎng)期保存對(duì)象(垃圾回收機(jī)制)。
單例類的功能,可以將一個(gè)類的局部方法變成全局方法,可以傳值(減少類和類之間的關(guān)系,高內(nèi)聚(模塊之間完成工作),低耦合(模塊與模塊之間的聯(lián)系)),建立全局訪問點(diǎn)。
餓漢式
final static *** ** = new **(); private 構(gòu)造() public static get***Instance() {return **;}懶漢式
static *** ; private 構(gòu)造() public static get***Instance{ (if(**==null){** = new **()} return **;) }典型單例類runtime()
package com.work.day4;//測(cè)試jvm的內(nèi)存public class RunTimeTest {public static void main(String[] args) {Runtime time=Runtime.getRuntime();System.out.println(time.freeMemory()/1024./1024.);System.out.println(time.totalMemory()/1024./1024.);System.out.println(time.maxMemory()/1024./1024.);} }模板設(shè)計(jì)模式
?
? 適配器設(shè)計(jì)模式<----httpservlet之前,三個(gè)類構(gòu)成適配器模式,httpservlet,和myservlet使用模板模式
servlet->(實(shí)現(xiàn),重寫5個(gè)方法)GenervalServlet->(繼承,重寫需要的方法)HttpServlet->(繼承,重寫需要的方法)myservlet
多態(tài):
多態(tài):一種事物的多種形態(tài).
前提是:繼承。用法:用父類(不一定是直接的)的引用指向子類對(duì)象。
實(shí)現(xiàn)動(dòng)態(tài)的手段:動(dòng)態(tài)類型,動(dòng)態(tài)綁定,動(dòng)態(tài)加載。
程序運(yùn)行分成三個(gè)階段:預(yù)編譯,編譯,運(yùn)行
預(yù)編譯:程序打開的時(shí)候,活兒已經(jīng)干完了.(預(yù)處理命令 #define)
編譯:從打開程序開始到點(diǎn)擊左上角的三角之前—只能識(shí)別前面的引用類型,不會(huì)識(shí)別后面的對(duì)象
運(yùn)行:從點(diǎn)擊三角開始—真正的識(shí)別對(duì)象,對(duì)象開始干活兒
多態(tài):我們?cè)诰幾g階段不能確定具體的對(duì)象類型,只有運(yùn)行階段才知道干活的對(duì)象
object :動(dòng)態(tài)類型 動(dòng)態(tài)綁定:(庫運(yùn)行時(shí),確定庫的內(nèi)容)
總結(jié):優(yōu)點(diǎn):可以提高代碼的擴(kuò)展性,使用之前定義好的功能,后面直接拿來使用,不用再創(chuàng)建新的方法.
缺點(diǎn):只能直接調(diào)用父類有的方法,不能直接調(diào)用子類特有的方法.
環(huán)境::多態(tài)的環(huán)境下,說向上轉(zhuǎn)型,向下轉(zhuǎn)型。
注意:是在多態(tài)的前提下再說向上轉(zhuǎn)型,向下轉(zhuǎn)型.
向上轉(zhuǎn)型:相當(dāng)于是自動(dòng)類型轉(zhuǎn)換.多態(tài)本身就是向上轉(zhuǎn)型.
作用:實(shí)現(xiàn)多態(tài)
向下轉(zhuǎn)型:相當(dāng)于強(qiáng)制類型轉(zhuǎn)換
作用:解決多態(tài)中無法調(diào)用子類特有屬性的缺點(diǎn).
運(yùn)算符:instanceof (使用前提:前后必須有關(guān)系)
原理說明:確定當(dāng)前的對(duì)象是否后面的類和子類的對(duì)象,是返回true,不是返回false
作用:容錯(cuò)處理,增加用戶體驗(yàn)
多態(tài)下成員的使用: !!!!!!方法相同編譯看父類,運(yùn)行看子類
public static void main(String[] args) {/** 繼承*/Zi zi = new Zi();zi.show();zi.eat();System.out.println(zi.age);//10,繼承中子類與父類出現(xiàn)同名的屬性,父類的會(huì)被覆蓋掉//多態(tài)/** 當(dāng)父類與子類有同名屬性或方法時(shí)* 成員變量:編譯的時(shí)候能不能訪問看父類,運(yùn)行的時(shí)候也看父類* 成員方法:編譯的時(shí)候能不能訪問看父類,運(yùn)行的時(shí)候看子類* 靜態(tài)成員方法:編譯運(yùn)行都看父類*/Fu fu = new Zi();System.out.println(fu.age);fu.show();}當(dāng)父類與子類有同名的方法或?qū)傩詴r(shí):(多態(tài))
成員變量:編譯的時(shí)候能不能訪問看父類,運(yùn)行的時(shí)候也看父類
成員方法:編譯的時(shí)候能不能訪問看父類,運(yùn)行的時(shí)候看子類
靜態(tài)成員方法:編譯的時(shí)候能不能訪問看父類,運(yùn)行的時(shí)候也看父類
內(nèi)部類:
內(nèi)部類:定義在一個(gè)類的內(nèi)部的類,內(nèi)部類的地位與外部類的成員變量,成員方法平等。內(nèi)部類也可以看做是外部類的成員。
public class Demo14 {public static void main(String[] args) {Outer outer = new Outer();outer.age = 10;//調(diào)用內(nèi)部類成員的方式//兩種//第一種:借助于外部類的方法實(shí)現(xiàn)outer.show();//第二種:直接在這里調(diào)用//引用:外部類.內(nèi)部類//構(gòu)成:外部類對(duì)象的引用.new 內(nèi)部類的構(gòu)造方法Outer.Inner inner = outer.new Inner();inner.eat();} }class Outer{int age;//內(nèi)部類class Inner{int height;public void eat() {System.out.println("eat");}}public void show() {System.out.println("show");Inner inner = new Inner();inner.eat();} }內(nèi)部類:間接使用多繼承
class A1{}class B1{} //說明功能 //我們可以通過內(nèi)部類讓java間接實(shí)現(xiàn)多繼承 class X extends A1{class Y extends B1{} }局部?jī)?nèi)部類:
定義:定義在一個(gè)類的方法里的類,
作用:功能私有化,增加代碼的可讀性和可操作性。
局部?jī)?nèi)部類:定義在一個(gè)類方法中的類
- 作用范圍:從定義開始到當(dāng)前的方法結(jié)束
- 了解:局部?jī)?nèi)部類所在的方法中局部變量的使用.
- 局部變量的作用域:定義變量開始到函數(shù)結(jié)束
final:被final修飾的變量會(huì)被放在常量區(qū),而常量區(qū)的值存在的時(shí)間要大于局部變量所在的方法,相當(dāng)于從原來的基礎(chǔ)上擴(kuò)大了作用域
- 原理:
- 當(dāng)方法中同時(shí)存在局部?jī)?nèi)部類與成員變量時(shí),成員變量的使用范圍就會(huì)從原來的基礎(chǔ)上進(jìn)行擴(kuò)大.
- 原因:在當(dāng)前的情況下,程序會(huì)默認(rèn)讓final去修飾height.所以當(dāng)局部變量所在的方法結(jié)束的時(shí)候,變量沒有被釋放,保存的值還在.
- 關(guān)于變量前面的final:
- 前提:變量必須與局部?jī)?nèi)部類同時(shí)存在.并且在局部?jī)?nèi)部類中使用了當(dāng)前的局部變量
- 在jdk1.7之前要想保住局部變量的值,要手動(dòng)添加final
- 在jdk1.7之后,java的內(nèi)部機(jī)制已經(jīng)在變量的前面默認(rèn)添加了final
靜態(tài)內(nèi)部類:
靜態(tài)內(nèi)部類不一定有靜態(tài)方法,有靜態(tài)方法的一定是靜態(tài)內(nèi)部類。
public class Demo17 {public static void main(String[] args) { // Out out = new Out(); // Out.Inn inn = out.new Inn();//創(chuàng)建靜態(tài)內(nèi)部類對(duì)象//構(gòu)成: new + 外部類名字.內(nèi)部類的構(gòu)造方法Out.Inn inn = new Out.Inn();//調(diào)用方法inn.play();//調(diào)用靜態(tài)方法// inn.show();Out.Inn.show();} }匿名內(nèi)部類:
定義:定義在一個(gè)類方法中的
匿名內(nèi)部類(對(duì)象):定義在一個(gè)類方法中的匿名子類對(duì)象,屬于局部?jī)?nèi)部類
- 匿名子類對(duì)象:
- 匿名內(nèi)部類對(duì)象:
- 創(chuàng)建匿名內(nèi)部類對(duì)象注意點(diǎn):1.匿名內(nèi)部類對(duì)象必須有父類或者父接口
- 匿名內(nèi)部類對(duì)象的作用:
- 1.當(dāng)只用到當(dāng)前子類的一個(gè)實(shí)例對(duì)象的時(shí)候,定義好馬上使用
- 2.當(dāng)不好起名字的時(shí)候
- 3.可以更好的定義運(yùn)行時(shí)的回調(diào)(知道即可)
- 內(nèi)部類的作用:
- 1.間接實(shí)現(xiàn)了多繼承
- 2.方便定義
- 3.只有外部類可以訪問創(chuàng)建的內(nèi)部類的屬性和方法,包括私有方法
- 4.同一個(gè)包中其他的類不可見,有了很好的封裝性
常用類
Math
package com.ali.test;import java.util.Random;/** Math:裝的是用于數(shù)學(xué)的計(jì)算方法*/ public class Demo13 {public static void main(String[] args) {System.out.println(java.lang.Math.abs(-10));//絕對(duì)值System.out.println(java.lang.Math.cos(3.14159));//三角余弦System.out.println(java.lang.Math.ceil(3.4));//向上取整System.out.println(java.lang.Math.floor(3.4));//向下取整System.out.println(java.lang.Math.random());//隨機(jī)數(shù) [0,1.0)//求[0,10)之間的整數(shù)System.out.println((int)java.lang.Math.floor(java.lang.Math.random()*10));//Random類//求[0,10)之間的整數(shù)Random random = new Random();System.out.println(java.lang.Math.abs(random.nextInt()%10));System.out.println(random.nextInt(10));//直接獲取的是[0,10)之間的數(shù)} }BigInteger(嵌套了math,可以直接使用math的方法)
包裝類
包裝類:專門將簡(jiǎn)單數(shù)據(jù)類型的數(shù)據(jù)類型,形成的對(duì)應(yīng)的類
簡(jiǎn)單數(shù)據(jù)類型 包裝類
byte Byte
short Short
int Integer
long Long
char Character
如果想字符串轉(zhuǎn)換數(shù)字,必須是數(shù)值型字符串。
簡(jiǎn)單數(shù)據(jù)類型->包裝類(裝箱 Integer integer1=new Integer(5));
包裝類->簡(jiǎn)單數(shù)據(jù)類型(拆箱 int value = integer1.tovlaue)
jdk1.5開始可以實(shí)現(xiàn)自動(dòng)裝箱,拆箱。
/** 包裝類:專門將簡(jiǎn)單數(shù)據(jù)類型的數(shù)據(jù)進(jìn)行封裝,形成的對(duì)應(yīng)的類. * 簡(jiǎn)單數(shù)據(jù)類型 包裝類 * byte Byte * short Short * int Integer * long Long * float Float * double Double * boolean Boolean * char Character */ public class Demo10 {public static void main(String[] args) { // 基本類型轉(zhuǎn)成字符串類型 // static String Integer.toString(int i) // static String Double.toString(double d)String value1 = Integer.toString(12);System.out.println(value1+2); // 字符串類型轉(zhuǎn)基本類型 // int Integer.parseInt("23") // double Double.parseDouble("3.45")//注意:這里的字符串必須是數(shù)值型的字符串int a = Integer.parseInt("234");System.out.println(a+2); // // 把十進(jìn)制轉(zhuǎn)成其它進(jìn)制 // Integer.toHexString() 十六進(jìn)制 // Integer.toOctalString() 八進(jìn)制 // Integer.toBinaryString() 二進(jìn)制System.out.println(Integer.toHexString(10));System.out.println(Integer.toOctalString(10));System.out.println(Integer.toBinaryString(10)); // 把其它進(jìn)制轉(zhuǎn)十進(jìn)制 // Integer.parseInt(數(shù)據(jù),進(jìn)制)System.out.println(Integer.parseInt("10",2));} } //注意點(diǎn):在一個(gè)字節(jié)范圍內(nèi)前面定義好的,后面再定義,直接使用前面的. // Integer integer4 = 100; // Integer integer5 = 100; // System.out.println(integer4 == integer5);//true//如果超過了一個(gè)字節(jié)的范圍,就認(rèn)為是兩個(gè)數(shù),要獨(dú)立占用兩塊兒內(nèi)存空間.Integer integer4 = 1000;Integer integer5 = 1000;System.out.println(integer4 == integer5);//false即在包裝類中,如果數(shù)據(jù)比較小(一個(gè)字節(jié)),認(rèn)為是一個(gè)對(duì)象(值相同,即使new了倆個(gè)對(duì)象。)
枚舉
也是一個(gè)特殊的類(創(chuàng)建對(duì)象,調(diào)用方法)
package com.ali.test; /** 枚舉* 默認(rèn)對(duì)應(yīng)的是數(shù)字.數(shù)字從0開始計(jì)數(shù)* 枚舉是一個(gè)被命名的整型常數(shù)的集合,用于聲明一組帶標(biāo)識(shí)符的常數(shù)。* 枚舉在曰常生活中很常見,例如一個(gè)人的性別只能是“男”或者“女”,一周的星期只能是 7 天中的一個(gè)等。* 類似這種當(dāng)一個(gè)變量有幾種固定可能的取值時(shí),就可以將它定義為枚舉類型。 在 JDK 1.5 之前沒有枚舉類型,那時(shí)候一般用接口常量來替代。而使用 Java 枚舉類型 enum 可以更貼近地表示這種常量。*/ enum EnumTest{First,Second,Third,Fourth,Fifth,Sixth } public class Demo12 {public static void main(String[] args) {EnumTest test = EnumTest.Fifth;System.out.println(test.compareTo(EnumTest.First));switch (test.compareTo(EnumTest.First)) {case -1:System.out.println("不相等");break;case 0:System.out.println("相等");break;case 4:System.out.println("不相等");break;default:System.out.println("hah");break;}System.out.println(EnumTest.First);System.out.println(test.getDeclaringClass().getName());//字節(jié)碼文件對(duì)象System.out.println(test.name());System.out.println(test.toString());System.out.println(test.ordinal());} }異常
定義:程序當(dāng)中出現(xiàn)的不正常的情況;
異常的由來:程序在運(yùn)行時(shí)出現(xiàn)了不正常的情況,java提取了對(duì)應(yīng)的屬性,名字,原因等,形成異常對(duì)象,進(jìn)而形成了各種異常類
異常的分類:(throwable)
1.Error(錯(cuò)誤):運(yùn)行中出現(xiàn)的嚴(yán)重錯(cuò)誤,不需要我們進(jìn)行更改
2.Exception:運(yùn)行中出現(xiàn)的不嚴(yán)重的錯(cuò)誤,我們可以嘗試去更改。
Exception:分類
第一種分類:系統(tǒng)異常,系統(tǒng)提前定義好的,我們直接使用
? 自定義異常:需要自己定義
第二種分類:編譯階段拋出的異常:
運(yùn)行階段拋出的異常:大部分使用的異常。(在寫代碼的時(shí)候不需要的處理,手動(dòng)避免)
運(yùn)行階段出現(xiàn)的錯(cuò)誤:會(huì)在此處產(chǎn)生一個(gè)異常對(duì)象,如果此處沒有處理異常的機(jī)制(能力),能繼續(xù)往上拋,一直的到j(luò)vm,jvm會(huì)報(bào)錯(cuò)。
public class Demo1 {public static void main(String[] args) {//4.這里也沒有處理異常的能力,繼續(xù)往上拋,拋給JVM.//JVM會(huì)調(diào)用異常類的打印方法,將異常的信息打印到控制臺(tái)Math math = new Math();int value = math.div(3, 0);//3.這里也沒有處理異常的能力,繼續(xù)往上拋System.out.println(value);} }class Math{public int div(int a,int b) {//2.div方法也沒有處理異常的能力,繼續(xù)往上拋return a/b;//1.會(huì)自動(dòng)生成一個(gè)異常類對(duì)象(new ArithmeticException()) ,這里沒有打印的能力,程序會(huì)將異常拋出,拋給//他所在的方法} }異常的特點(diǎn):程序出現(xiàn)異常的時(shí)候,會(huì)打印異常的信息并中斷程序的進(jìn)行,所以當(dāng)有多個(gè)異常同時(shí)出現(xiàn)的時(shí)候,默認(rèn)只能執(zhí)行第一個(gè).
try catch
catch會(huì)對(duì)try里面的代碼進(jìn)行監(jiān)聽,如果try里面的代碼沒有異常,catch不會(huì)執(zhí)行,會(huì)直接執(zhí)行后面的代碼
如果try里面的代碼發(fā)生了異常,catch會(huì)立刻捕獲(效果:try里面的代碼會(huì)立刻中斷,直接執(zhí)行catch)
try{
? 可能發(fā)生異常的代碼
? }catch(Exception e){ //捕獲異常 e就是要捕獲的異常
? 對(duì)當(dāng)前異常的處理
}
try {int value = math.div(3, 0);//3.這里也沒有處理異常的能力,繼續(xù)往上拋//注意:只要try內(nèi)部的代碼發(fā)生了異常,catch會(huì)立刻捕獲異常,馬上執(zhí)行catch,所以發(fā)生異常后的代碼不會(huì)執(zhí)行.//只有try里面的代碼沒有發(fā)生異常,這里的代碼才能執(zhí)行System.out.println("haha:"+value);}catch (Exception e) {//e = new ArithmeticException() 多態(tài)//對(duì)異常進(jìn)行處理//e.printStackTrace();//打印異常的位置,原因,名字//System.out.println(e.getMessage());//打印原因System.out.println(e.toString());//打印原因,名字}多重處理(多個(gè)異常):try catch catch finally//必須執(zhí)行的操作(例如:關(guān)閉數(shù)據(jù)庫):主要用于資源的釋放等。
catch會(huì)對(duì)try里面的代碼進(jìn)行監(jiān)聽,如果try里面的代碼沒有發(fā)生異常,catch不會(huì)執(zhí)行,會(huì)直接執(zhí)行后面的代碼.
如果try里面的代碼發(fā)生了異常,catch會(huì)立刻捕獲(效果:try里面的代碼會(huì)立刻終端,直接執(zhí)行catch)
try{
可能發(fā)生異常的代碼
}catch(異常一 e){ //捕獲異常 e就是要捕獲的異常
對(duì)當(dāng)前異常的處理
}catch(異常二 e){ //捕獲異常 e就是要捕獲的異常
對(duì)當(dāng)前異常的處理
}catch(Exception e){ //捕獲異常 e就是要捕獲的異常
對(duì)當(dāng)前異常的處理
}
(return 結(jié)束不了,finally還能執(zhí)行)
System.exit(0)?/退出程序,
finally不能執(zhí)行了
這個(gè)結(jié)構(gòu)跟異常沒有關(guān)系
try{
獲取資源
}finally{
釋放資源
}
自定義異常:常見:訂單異常,用戶異常,素?cái)?shù)異常
什么是自定義異常:自己定義的異常類,由于Exception已經(jīng)有了異常的基本功能,所以一般寫的是他的子類
為什么要自定義異常?
系統(tǒng)沒有定義的異常需要我們自己來定義,我們要解決的是系統(tǒng)沒有解決的問題
分類:
編譯異常:發(fā)生在編譯階段.—對(duì)應(yīng)的異常是除了RumtimeException之外的所有異常
特點(diǎn):對(duì)異常進(jìn)行處理的所有工作都要我們手動(dòng)完成
運(yùn)行時(shí)異常:發(fā)生在運(yùn)行階段.—RumtimeException
特點(diǎn):所有的工作我們都可以不管
常見的自定義異常:訂單異常 用戶異常 負(fù)數(shù)異常
以負(fù)數(shù)異常為例:
對(duì)于編譯異常需要我們進(jìn)行處理的有:
異常類的創(chuàng)建----FuShuException
異常對(duì)象的創(chuàng)建—應(yīng)該是在發(fā)生異常的位置
異常對(duì)象的拋出—throw
異常的聲明(我們要給可能發(fā)生異常的方法進(jìn)行異常的聲明)----throws
作用:告訴別人我有可能發(fā)生異常
package com.ali.test; //為了解釋FuShuException構(gòu)造方法中的參數(shù)如何在打印方法中顯示. public class Demo7 {public static void main(String[] args) {Teacher teacher = new Teacher("除數(shù)為負(fù)數(shù)了");teacher.printStackTrace();} }class Person{//相當(dāng)于Exceptionprivate String message;public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Person() {super();// TODO Auto-generated constructor stub}public Person(String message) {super();this.message = message;}public void printStackTrace() {System.out.println(this.getMessage());} }//相當(dāng)于FuShuException class Teacher extends Person{public Teacher() {}public Teacher(String message) {super(message);} }特點(diǎn):所有的工作我們都可以不管
常見的自定義異常:訂單異常 用戶異常 負(fù)數(shù)異常
以負(fù)數(shù)異常為例:
對(duì)于編譯異常需要我們進(jìn)行處理的有:
異常類的創(chuàng)建----FuShuException
異常對(duì)象的創(chuàng)建—應(yīng)該是在發(fā)生異常的位置
異常對(duì)象的拋出—throw
異常的聲明(我們要給可能發(fā)生異常的方法進(jìn)行異常的聲明)----throws
作用:告訴別人我有可能發(fā)生異常
package com.ali.test; //為了解釋FuShuException構(gòu)造方法中的參數(shù)如何在打印方法中顯示. public class Demo7 {public static void main(String[] args) {Teacher teacher = new Teacher("除數(shù)為負(fù)數(shù)了");teacher.printStackTrace();} }class Person{//相當(dāng)于Exceptionprivate String message;public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Person() {super();// TODO Auto-generated constructor stub}public Person(String message) {super();this.message = message;}public void printStackTrace() {System.out.println(this.getMessage());} }//相當(dāng)于FuShuException class Teacher extends Person{public Teacher() {}public Teacher(String message) {super(message);} }總結(jié)
以上是生活随笔為你收集整理的java从入门到放弃(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qtcreator安装及配置
- 下一篇: 计算机内存的存储原理,存储器原理