補(bǔ)充:JVM虛擬機(jī)為什么不把java字節(jié)碼直接編譯成二進(jìn)制的指令集呢苔悦?如果編譯成二進(jìn)制的指令集轩褐。不需要JVM,那么像垃圾回收機(jī)制等等JVM的高級(jí)特性咋個(gè)辦呢玖详?如果還要在java代碼中手動(dòng)回收等等高級(jí)特性把介,那和C++就沒(méi)有區(qū)別了;同時(shí)也就不跨平臺(tái)了蟋座!
一. 面向?qū)ο蟾攀?/h2>
編程的武林門(mén)派
面向過(guò)程 | 函數(shù)式編程 | 面向?qū)ο?/a> |
---|---|---|
BASIC劳澄、Pascal、C ... | OCaml蜈七、LISP... | Java、C++莫矗、Python飒硅、Go .... |
這里只介紹一些面向過(guò)程與面向?qū)ο笾g的區(qū)別砂缩,有興趣的可以去了解一下非常適合人工智能領(lǐng)域的函數(shù)式編程語(yǔ)言L(fǎng)ISP(當(dāng)然Python也非常適合)
面向過(guò)程: 當(dāng)需要實(shí)現(xiàn)一個(gè)功能的時(shí)候,每一個(gè)具體的步驟都需要親力親為三娩,詳細(xì)處理每一個(gè)細(xì)節(jié)庵芭。
面向?qū)ο螅?/strong> 當(dāng)需要實(shí)現(xiàn)一個(gè)功能,我把我的需求交個(gè)一個(gè)專(zhuān)門(mén)搞這個(gè)的人雀监,他只需要給我結(jié)果就行了双吆,這個(gè)專(zhuān)門(mén)的人咋個(gè)去辦這個(gè)事兒,我不關(guān)心会前!
【這只是我的理解好乐,如果有誤請(qǐng)批評(píng)指出!非常感謝瓦宜!】似乎面向?qū)ο筇貏e牛逼蔚万,那為啥還存在面向過(guò)程呢?面向過(guò)程在某些領(lǐng)域還是非常重要的临庇。比如開(kāi)發(fā)操作系統(tǒng)反璃,不管是windows還是Linux的開(kāi)發(fā),都是使用C語(yǔ)言進(jìn)行面向過(guò)程的開(kāi)發(fā)假夺。因?yàn)椴僮飨到y(tǒng)是非常底層的淮蜈,每一個(gè)操作都是直接操作計(jì)算機(jī)底層的硬件(指令集--->電路邏輯),這些操作只能使用面向過(guò)程的方式編寫(xiě)(具體的原因我還要去探究一下已卷,難道是硬件之間的強(qiáng)耦合性梧田?)。但是悼尾,面向?qū)ο笫腔诿嫦蜻^(guò)程的柿扣,面向過(guò)程把一些繁瑣,小細(xì)節(jié)的事處理好了(比如操作系統(tǒng)操作了硬件)闺魏,面向?qū)ο缶褪菍⑦@些過(guò)程封裝了一下未状。直接調(diào)用就OK了,非常方便析桥!
二司草、類(lèi)與對(duì)象
類(lèi): 一類(lèi)事物抽象出來(lái)的共同屬性以及功能的描述,比如->德瑪西亞陣營(yíng)的英雄類(lèi)
對(duì)象: 某類(lèi)事物的具體的一個(gè)實(shí)例泡仗,是某個(gè)類(lèi)中具體的一個(gè)事物埋虹,比如->德瑪西亞陣營(yíng)的英雄類(lèi) 的 蓋倫
1. 舉一個(gè)栗子:英雄類(lèi)
類(lèi)名:英雄類(lèi)
屬性:
????- 生命值;?- 攻擊力;?- 攻擊速度?- 移動(dòng)速度?- 生命回復(fù)?- 護(hù)甲值?- 魔法抗性
?- 攻擊范圍
...功能:
????- Q技能 ??- W技能 ??- E技能 ??- R技能 ??- Ctrl + E技能
...
2. 舉一個(gè)栗子:對(duì)象
對(duì)象名:蓋倫
屬性:
????- 生命值 -> 616.28(+84.25)?- 攻擊力 -> 66(+4.5)?- 攻擊速度 -> 0.625(2.9%)?- 移動(dòng)速度 -> 340?- 生命回復(fù) -> 7.84(+0.5)?- 護(hù)甲值 -> 36(+3)?- 魔法抗性 -> 32.1(+1.25)?- 攻擊范圍 -> 175 [1]
...功能:
????- Q技能 -> 沉默 ??- W技能 -> 護(hù)盾 ??- E技能 -> 旋轉(zhuǎn) ??- R技能 -> 正義之劍??- Ctrl+E技能 -> 跳舞
...
三、對(duì)象與類(lèi)的使用
1. 導(dǎo)包: 指出需要使用的類(lèi)娩怎,在什么位置
import packageName.className;
如果需要使用的類(lèi)在同一個(gè)包下搔课,可以不寫(xiě)導(dǎo)入語(yǔ)句
2. 創(chuàng)建類(lèi)與對(duì)象
- 類(lèi)的創(chuàng)建就是新建一個(gè)class文件,或者創(chuàng)建一個(gè)內(nèi)部類(lèi)(將這個(gè)內(nèi)部類(lèi)當(dāng)做一個(gè)變量)
- 類(lèi)用大駝峰式命名截亦,對(duì)象用小駝峰式命名
對(duì)象的創(chuàng)建格式:
類(lèi)名稱(chēng) 對(duì)象名 = new 類(lèi)名稱(chēng)(形參列表);
className instanceName = new className(dataType dada,...);
3. 使用類(lèi)中的屬性方法或者對(duì)象中的屬性爬泥,方法以及 修飾符 的含義
- a. 調(diào)用屬性或者方法是通過(guò).操作符進(jìn)行訪(fǎng)問(wèn)柬讨。
- b. static關(guān)鍵字:在類(lèi)中用static關(guān)鍵字定義的屬性或者方法叫做靜態(tài)屬性(是公共的,靜態(tài)屬性保存的值袍啡,所有實(shí)例或者類(lèi)本身都可以訪(fǎng)問(wèn)或者修改)或者靜態(tài)方法踩官,沒(méi)有使用static關(guān)鍵字定義的屬性或者方法叫做實(shí)例屬性或者方法;①對(duì)象可以調(diào)用靜態(tài)和動(dòng)態(tài)的屬性或者方法境输;②類(lèi)只能調(diào)用靜態(tài)的屬性或者靜態(tài)的方法;③靜態(tài)方法中要通過(guò)創(chuàng)建的實(shí)例蔗牡,通過(guò)實(shí)例訪(fǎng)問(wèn)實(shí)例的實(shí)例方法;
---- | 屬性 | 方法 |
---|---|---|
靜態(tài)static | 類(lèi)嗅剖,實(shí)例都可以調(diào) | 類(lèi)辩越,實(shí)例都可以調(diào) |
實(shí)例 | 只有實(shí)例可以調(diào) | 只有實(shí)例可以調(diào) |
類(lèi)名稱(chēng).靜態(tài)屬性(參數(shù)列表)
類(lèi)名稱(chēng).靜態(tài)方法(參數(shù)列表)
實(shí)例對(duì)象名稱(chēng).靜態(tài)屬性(參數(shù)列表)
實(shí)例對(duì)象名稱(chēng).靜態(tài)方法(參數(shù)列表)
實(shí)例對(duì)象名稱(chēng).實(shí)例屬性(參數(shù)列表)
實(shí)例對(duì)象名稱(chēng).實(shí)例方法(參數(shù)列表)
- c. public判导、protected锚扎、defautl(不寫(xiě))、private關(guān)鍵字
這四個(gè)個(gè)修飾符是用在類(lèi)炭分,方法蒋院、變量前面亏钩,表示負(fù)責(zé)權(quán)限,決定了哪里哪里能夠調(diào)用所修飾(類(lèi)欺旧、變量姑丑、方法)
--- | public | protected | default(空的,不寫(xiě)) | private |
---|---|---|---|---|
同一類(lèi)中 | √ | √ | √ | √ |
同一包中(子類(lèi)與無(wú)關(guān)類(lèi)) | √ | √ | √ | |
不同包的子類(lèi) | √ | √ | ||
不同包中的無(wú)關(guān)類(lèi) | √ |
- d. 如果成員變量沒(méi)有進(jìn)行復(fù)制辞友,將會(huì)有一個(gè)默認(rèn)值栅哀,規(guī)則和數(shù)組是一樣的。引用就是null
四称龙、類(lèi)和對(duì)象在JVM中的生命周期
①根據(jù)主函數(shù)main所在的類(lèi)以及包的導(dǎo)入鏈 (import語(yǔ)句留拾,package語(yǔ)句?) 將相互關(guān)聯(lián)所有的.class字節(jié)碼文件加載到方法區(qū)(Method Area);②將主函數(shù)main壓入棧(Stack)中(棧頂元素為main函數(shù)<如果想深入理解棧鲫尊,請(qǐng)參考我的另一片文章 棧的Java實(shí)現(xiàn)>);③再以此執(zhí)行main方法中的語(yǔ)句痴柔,當(dāng)遇到new一個(gè)對(duì)象的時(shí)候,會(huì)根據(jù)對(duì)象對(duì)應(yīng)類(lèi)名找到方法區(qū)對(duì)應(yīng)的類(lèi)的字節(jié)碼疫向,在根據(jù)調(diào)用的對(duì)應(yīng)的構(gòu)造函數(shù) (根據(jù)繼承關(guān)系的構(gòu)造函數(shù)鏈咳蔚、接口這些什么之類(lèi)的從最高層往下一層一層創(chuàng)建) 在堆(Heap)中創(chuàng)建這個(gè)實(shí)例,基本數(shù)據(jù)類(lèi)型的就存放值搔驼,引用數(shù)據(jù)類(lèi)型就存放引用谈火,方法也是存放指向在方法區(qū)內(nèi)對(duì)應(yīng)函數(shù)的引用;④當(dāng)主函數(shù)中剛剛創(chuàng)建的實(shí)例調(diào)用了實(shí)例的一個(gè)方法舌涨,會(huì)找到堆中對(duì)應(yīng)對(duì)象中相應(yīng)的方法名糯耍,找到在方法區(qū)的函數(shù),將這個(gè)函數(shù)的字節(jié)碼轉(zhuǎn)換為指令集進(jìn)行入棧操作,此時(shí)棧頂為實(shí)例方法谍肤,當(dāng)實(shí)例方法執(zhí)行完畢后實(shí)例方法出棧啦租,棧頂元素為main方法,此時(shí)荒揣,接著main方法之前暫停的位置繼續(xù)執(zhí)行。⑤如果給實(shí)例變量賦值一個(gè)null,而且方法棧中沒(méi)有任何變量執(zhí)行堆中這個(gè)創(chuàng)建的實(shí)例焊刹,那么JVM的垃圾回收機(jī)制會(huì)將這個(gè)實(shí)例銷(xiāo)毀系任,回收堆中對(duì)應(yīng)的內(nèi)存空間。
五虐块、一個(gè)類(lèi)也可以當(dāng)做一種數(shù)據(jù)類(lèi)型
一個(gè)類(lèi)也可以當(dāng)做一種數(shù)據(jù)類(lèi)型,是一種引用數(shù)據(jù)類(lèi)型俩滥。用法和數(shù)組等等是一樣的。
- 使用對(duì)象類(lèi)型作為方法的參數(shù)
- 使用對(duì)象類(lèi)型作為方法的返回值
六贺奠、成員變量與局部變量
- | 定義位置 | 作用范圍 | 默認(rèn)值 | 內(nèi)存位置 | 生命周期 |
---|---|---|---|---|---|
局部變量 | 方法內(nèi)部 | 方法塊或者對(duì)應(yīng)的塊({})中 | 無(wú)默認(rèn)值霜旧,需手動(dòng)設(shè)置 | 棧內(nèi)存 | 隨方法進(jìn)棧出生,出棧消失 |
成員變量 | 方法外部儡率,類(lèi)中 | 整個(gè)類(lèi) | 不賦值挂据,有默認(rèn)值,規(guī)則和數(shù)組一樣 | 堆內(nèi)存 | 隨對(duì)象出生儿普,隨對(duì)象被垃圾回收機(jī)制回收消失 |
七崎逃、面向?qū)ο笕筇匦灾庋b
面向?qū)ο笕筇卣?/strong>:封裝、繼承眉孩、多態(tài)
封裝:將一些細(xì)節(jié)隱藏起來(lái)个绍,對(duì)于外加不可見(jiàn);
封裝性在Java中的體現(xiàn):
- 方法就是一種封裝浪汪;
- 關(guān)鍵字private也是一種封裝巴柿。
private封裝性舉例:定義Person的年齡時(shí),無(wú)法阻止不合理的數(shù)值被設(shè)置進(jìn)來(lái)死遭。
解決方案:用private關(guān)鍵字將需要保護(hù)的成員變量進(jìn)行修飾广恢。
public class Person {
String name; // 姓名
private int age; // 年齡
public void show() {
System.out.println("我叫:" + name + ",年齡:" + age);
}
// 這個(gè)成員方法殃姓,專(zhuān)門(mén)用于向age設(shè)置數(shù)據(jù)
public void setAge(int num) {
if (num < 100 && num >= 9) { // 如果是合理情況
age = num;
} else {
System.out.println("數(shù)據(jù)不合理袁波!");
}
}
// 這個(gè)成員方法,專(zhuān)門(mén)私語(yǔ)獲取age的數(shù)據(jù)
public int getAge() {
return age;
}
}
使用Getter蜗侈、Setter方法以及注意事項(xiàng)
- Getter篷牌、Setter方法用于專(zhuān)門(mén)訪(fǎng)問(wèn)類(lèi)的私有成員,這樣做的好處是保證數(shù)據(jù)的安全踏幻,比如調(diào)用者不能直接設(shè)置私有屬性枷颊,必須通過(guò)Setter(可在內(nèi)部設(shè)置檢查規(guī)則)才可以;調(diào)用者不能直接訪(fǎng)問(wèn)私有屬性,必須通過(guò)Getter(驗(yàn)證)夭苗。
- 對(duì)于Getter來(lái)說(shuō)信卡,不能有參數(shù),返回值類(lèi)型和成員變量對(duì)應(yīng)题造;必須叫g(shù)etXxx命名規(guī)則
- 對(duì)于Setter來(lái)說(shuō)傍菇,不能有返回值,參數(shù)類(lèi)型和成員變量對(duì)應(yīng)界赔。必須叫SetXxx命名規(guī)則
- 對(duì)于基本類(lèi)型當(dāng)中的boolean值丢习,Getter方法一定要寫(xiě)成isXxx的形式,而setXxx規(guī)則不變淮悼。
八咐低、this關(guān)鍵字
JVM根據(jù)規(guī)則將變量?jī)?chǔ)存在特殊的一種數(shù)據(jù)結(jié)構(gòu)中,到需要這種變量時(shí)會(huì)根據(jù)作用域規(guī)則逐級(jí)查找袜腥,直到找到變量值(或者引用);所以成員變量和局部變量同名不會(huì)報(bào)錯(cuò)见擦!離變量最近的塊優(yōu)先級(jí)越高。
假如當(dāng)前函數(shù)作用域與類(lèi)成員變量名相同羹令,但是我想使用類(lèi)成員變量鲤屡,怎么辦呢?使用this關(guān)鍵字特恬!當(dāng)方法的局部變量和類(lèi)的成員變量重名的時(shí)候执俩,根據(jù)“就近原則”,優(yōu)先使用局部變量癌刽。如果需要訪(fǎng)問(wèn)本類(lèi)當(dāng)中的成員變量役首。
需要使用格式:this.成員變量名
“通過(guò)誰(shuí)調(diào)用的方法,誰(shuí)就是this显拜『獍拢”
public class Person {
String name; // 我自己的名字
// 參數(shù)name是對(duì)方的名字
// 成員變量name是自己的名字
public void sayHello(String name) {
System.out.println(name + ",你好远荠。我是" + this.name);
System.out.println(this);
}
}
九矮固、構(gòu)造方法
構(gòu)造方法是專(zhuān)門(mén)用來(lái)創(chuàng)建對(duì)象的方法,當(dāng)我們通過(guò)關(guān)鍵字new來(lái)創(chuàng)建對(duì)象時(shí)譬淳,其實(shí)就是在調(diào)用構(gòu)造方法档址。
格式:
public 類(lèi)名稱(chēng)(參數(shù)類(lèi)型 參數(shù)名稱(chēng)) {
方法體
}
注意事項(xiàng):
- 構(gòu)造方法的名稱(chēng)必須和所在的類(lèi)名稱(chēng)完全一樣,就連大小寫(xiě)也要一樣
- 構(gòu)造方法不要寫(xiě)返回值類(lèi)型邻梆,連void都不寫(xiě)
- 構(gòu)造方法不能return一個(gè)具體的返回值
- 如果沒(méi)有編寫(xiě)任何構(gòu)造方法守伸,那么編譯器將會(huì)默認(rèn)贈(zèng)送一個(gè)構(gòu)造方法,沒(méi)有參數(shù)浦妄、方法體什么事情都不做尼摹。
public Student() {}
- 一旦編寫(xiě)了至少一個(gè)構(gòu)造方法见芹,那么編譯器將不再贈(zèng)送。
- 構(gòu)造方法也是可以進(jìn)行重載的蠢涝。重載:方法名稱(chēng)相同玄呛,參數(shù)列表不同。
public class Student {
// 成員變量
private String name;
private int age;
// 無(wú)參數(shù)的構(gòu)造方法
public Student() {
System.out.println("無(wú)參構(gòu)造方法執(zhí)行啦和二!");
}
// 全參數(shù)的構(gòu)造方法
public Student(String name, int age) {
System.out.println("全參構(gòu)造方法執(zhí)行啦徘铝!");
this.name = name;
this.age = age;
}
// Getter Setter
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
十、Java Bean Java類(lèi)中標(biāo)準(zhǔn)的類(lèi)
一個(gè)標(biāo)準(zhǔn)的類(lèi)通常要擁有下面四個(gè)組成部分:
Alt + Ins
快捷創(chuàng)建Getter儿咱、Setter方法
- 所有的成員變量都要使用private關(guān)鍵字修飾
- 為每一個(gè)成員變量編寫(xiě)一對(duì)兒Getter/Setter方法
- 編寫(xiě)一個(gè)無(wú)參數(shù)的構(gòu)造方法
- 編寫(xiě)一個(gè)全參數(shù)的構(gòu)造方法
public class Student {
private String name; // 姓名
private int age; // 年齡
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}