IDEA介紹
- 刪除當(dāng)前行, 默認(rèn)是 ctrl + Y 自己配置 ctrl + d
- 復(fù)制當(dāng)前行, 自己配置 ctrl + alt + 向下光標(biāo)
- 補(bǔ)全代碼 alt + /
- 添加注釋和取消注釋 ctrl + / 【第一次是添加注釋?zhuān)诙问侨∠⑨尅?/li>
- 導(dǎo)入該行需要的類(lèi) 先配置 auto import , 然后使用 alt+enter 即可
- 快速格式化代碼 ctrl + alt + L
- 快速運(yùn)行程序 自己定義 alt + R
- 生成構(gòu)造器等 alt + insert [提高開(kāi)發(fā)效率]
- 查看一個(gè)類(lèi)的層級(jí)關(guān)系 ctrl + H [學(xué)習(xí)繼承后,非常有用]
- 將光標(biāo)放在一個(gè)方法上,輸入 ctrl + B , 可以定位到方法 [學(xué)繼承后,非常有用]
- 自動(dòng)的分配變量名 , 通過(guò) 在后面加 .var [老師最喜歡的]
可以自己去自定義:
快捷鍵 Keymap
模板 Live Templates
包
包的基本語(yǔ)法:
package com.fw;
說(shuō)明:1. package 關(guān)鍵字,表示打包; 2. com.fw 表示包名
包的命名:只能包含數(shù)字、字母、下劃線、小圓點(diǎn),但是不能用數(shù)字開(kāi)頭,不能是關(guān)鍵字或保留字。
引用包的語(yǔ)法:
import 包;
我們引入一個(gè)包的主要目的是要使用該包下的類(lèi),所以也可以只引入一個(gè)類(lèi),例如:
import java.util.Scanner; // 只引入一個(gè)類(lèi)
import java.util.*; // 表示將java.util 包所有都引入
注意事項(xiàng)和使用細(xì)節(jié)
- package 的作用是聲明當(dāng)前類(lèi)所在的包,需要放在類(lèi)的最上面,一個(gè)類(lèi)中最多只有一句 package。
- import 指令 位置放在 package 的下面,在類(lèi)定義前面,可以有多句且沒(méi)有順序要求。
包的三大作用
- 區(qū)分相同名字的類(lèi)
- 當(dāng)類(lèi)很多時(shí),可以很好的管理類(lèi)
- 控制訪問(wèn)范圍
包的本質(zhì)分析(原理)
包的本質(zhì) 實(shí)際上就是創(chuàng)建不同的文件夾/目錄來(lái)保存類(lèi)文件。
一個(gè)包下,包含很多的類(lèi),java 中常用的包有:
- java.lang.* //lang 包是基本包, 默認(rèn)引入, 不需要再引入.
- java.util.* //util 包, 系統(tǒng)提供的工具包, 工具類(lèi), 使用 Scanner
- java.net.* //網(wǎng)絡(luò)包, 網(wǎng)絡(luò)開(kāi)發(fā)
- java.awt.* //是做 java 的界面開(kāi)發(fā), GUI
訪問(wèn)修飾符
java 提供四種訪問(wèn)控制修飾符號(hào),用于控制方法和屬性(成員變量)的訪問(wèn)權(quán)限(范圍):
- 公開(kāi)級(jí)別:用 public 修飾,對(duì)外公開(kāi)
- 受保護(hù)級(jí)別:用 protected 修飾,對(duì)子類(lèi)和同一個(gè)包中的類(lèi)公開(kāi)
- 默認(rèn)級(jí)別:沒(méi)有修飾符號(hào),向同一個(gè)包的類(lèi)公開(kāi).
- 私有級(jí)別:用 private 修飾,只有類(lèi)本身可以訪問(wèn),不對(duì)外公開(kāi).
范圍從小到大依次是:同類(lèi)、同包、子類(lèi)、不同包。
這張圖可以背下來(lái)!
- 修飾符可以用來(lái)修飾類(lèi)中的屬性,成員方法以及類(lèi)。
- 只有默認(rèn)的和 public 才能修飾類(lèi)!并且遵循上述訪問(wèn)權(quán)限的特點(diǎn)。
面向?qū)ο缶幊倘筇卣?/h2>
面向?qū)ο缶幊逃腥筇卣鳎悍庋b、繼承和多態(tài)。
封裝
封裝(encapsulation)就是把抽象出的數(shù)據(jù)[屬性]和對(duì)數(shù)據(jù)的操作[方法]封裝在一起,數(shù)據(jù)被保護(hù)在內(nèi)部,程序的其它部分只有通過(guò)被授權(quán)的操作[方法],才能對(duì)數(shù)據(jù)進(jìn)行操作。
封裝的理解和好處
- 隱藏實(shí)現(xiàn)細(xì)節(jié):方法(連接數(shù)據(jù)庫(kù))<–調(diào)用(傳入?yún)?shù)…)
- 可以對(duì)數(shù)據(jù)進(jìn)行驗(yàn)證,保證安全合理
封裝的實(shí)現(xiàn)步驟(三步)
- 將屬性進(jìn)行私有化 private [不能直接修改屬性]。
- 提供一個(gè)公共的(public)set方法,用于對(duì)屬性判斷并賦值。
- 提供一個(gè)公共的(public)get方法,用于獲取屬性的值。
Idea快速創(chuàng)建set和get方法 :Alt+INSERT
可以將 set 方法寫(xiě)在構(gòu)造器中代替 this.x = x 的操作。
繼承
繼承可以解決代碼復(fù)用,讓我們的編程更加靠近人類(lèi)思維.
當(dāng)多個(gè)類(lèi)存在相同的屬性(變量)和方法時(shí),可以從這些類(lèi)中抽象出父類(lèi),在父類(lèi)中定義這些相同的屬性和方法,所有的子類(lèi)不需要重新定義這些屬性和方法,只需要通過(guò) extends 來(lái)聲明繼承父類(lèi)即可。
繼承的基本語(yǔ)法
class 子類(lèi) extends 父類(lèi) {
}
- 子類(lèi)就會(huì)自動(dòng)擁有父類(lèi)定義的屬性和方法。
- 父類(lèi)又叫超類(lèi),基類(lèi)。
- 子類(lèi)又叫派生類(lèi)。
繼承給編程帶來(lái)的便利
- 代碼的復(fù)用性提高了
- 代碼的擴(kuò)展性和維護(hù)性提高了
繼承的深入討論/細(xì)節(jié)問(wèn)題
- 子類(lèi)繼承了所有的屬性和方法,非私有的屬性和方法可以在子類(lèi)直接訪問(wèn), 但是私有屬性和方法不能在子類(lèi)直接訪問(wèn),要通過(guò)父類(lèi)提供公共的方法去訪問(wèn)
- 子類(lèi)必須調(diào)用父類(lèi)的構(gòu)造器, 完成父類(lèi)的初始化
- 當(dāng)創(chuàng)建子類(lèi)對(duì)象時(shí),不管使用子類(lèi)的哪個(gè)構(gòu)造器,默認(rèn)情況下總會(huì)去調(diào)用父類(lèi)的無(wú)參構(gòu)造器,如果父類(lèi)沒(méi)有提供無(wú)參構(gòu)造器,則必須在子類(lèi)的構(gòu)造器中用 super 去指定使用父類(lèi)的哪個(gè)構(gòu)造器完成對(duì)父類(lèi)的初始化工作,否則,編譯不會(huì)通過(guò)(怎么理解。) [舉例說(shuō)明]
- 如果希望指定去調(diào)用父類(lèi)的某個(gè)構(gòu)造器,則顯式的調(diào)用一下 : super(參數(shù)列表)
- super 在使用時(shí),必須放在構(gòu)造器第一行(super 只能在構(gòu)造器中使用)
- super() 和 this() 都只能放在構(gòu)造器第一行,因此這兩個(gè)方法不能共存在一個(gè)構(gòu)造器
- java 所有類(lèi)都是 Object 類(lèi)的子類(lèi), Object 是所有類(lèi)的基類(lèi). 8) 父類(lèi)構(gòu)造器的調(diào)用不限于直接父類(lèi)!將一直往上追溯直到 Object 類(lèi)(頂級(jí)父類(lèi))
-
子類(lèi)最多只能繼承一個(gè)父類(lèi)(指直接繼承),即 java 中是單繼承機(jī)制。
思考:如何讓 A 類(lèi)繼承 B 類(lèi)和 C 類(lèi)? 【A 繼承 B, B 繼承 C】 - 不能濫用繼承,子類(lèi)和父類(lèi)之間必須滿足 is-a 的邏輯關(guān)系
繼承的本質(zhì)分析
子類(lèi)創(chuàng)建的內(nèi)存布局:
super關(guān)鍵字
super 代表父類(lèi)的引用,用于訪問(wèn)父類(lèi)的屬性、方法、構(gòu)造器。
1. 訪問(wèn)父類(lèi)的屬性,但不能訪問(wèn)父類(lèi)的 private 屬性
super.屬性名;
2. 訪問(wèn)父類(lèi)的方法,不能訪問(wèn)父類(lèi)的 private 方法
super.方法名(參數(shù)列表);
3. 訪問(wèn)父類(lèi)的構(gòu)造器
super(參數(shù)列表); // 只能放在構(gòu)造器的第一句,只能出現(xiàn)一句!
super 給編程帶來(lái)的便利/細(xì)節(jié)
- 調(diào)用父類(lèi)的構(gòu)造器的好處(分工明確,父類(lèi)屬性由父類(lèi)初始化,子類(lèi)的屬性由子類(lèi)初始化)。
- 當(dāng)子類(lèi)中有和父類(lèi)中的成員(屬性和方法)重名時(shí),為了訪問(wèn)父類(lèi)的成員,必須通過(guò)super。如果沒(méi)有重名,使用super、this、直接訪問(wèn)是一樣的效果!
- super的訪問(wèn)不限于直接父類(lèi),如果爺爺類(lèi)和本類(lèi)中有同名的成員,也可以使用super去訪問(wèn)爺爺類(lèi)的成員;如果多個(gè)基類(lèi)(上級(jí)類(lèi))中都有同名的成員,使用 super 訪問(wèn)遵循就近原則。A->B->C,當(dāng)然也需要遵守訪問(wèn)權(quán)限的相關(guān)規(guī)則。
super 和 this 的比較
方法重寫(xiě)/覆蓋(override)
方法覆蓋(重寫(xiě))就是子類(lèi)有一個(gè)方法,和父類(lèi)的某個(gè)方法的名稱(chēng)、返回類(lèi)型、參數(shù)一樣,那么我們就說(shuō)子類(lèi)的這個(gè)方法覆蓋了父類(lèi)的方法。
注意事項(xiàng)和使用細(xì)節(jié)
- 子類(lèi)的方法的形參列表,方法名稱(chēng),要和父類(lèi)方法的形參列表,方法名稱(chēng)完全一樣。
- 子類(lèi)方法的返回類(lèi)型和父類(lèi)方法返回類(lèi)型一樣,或者是父類(lèi)返回類(lèi)型的子類(lèi)。
比如父類(lèi)返回類(lèi)型是Object,子類(lèi)方法返回類(lèi)型是String - 子類(lèi)方法不能縮小父類(lèi)方法的訪問(wèn)權(quán)限 : public > protected > 默認(rèn) > private
方法的 重寫(xiě)和重載 之間的比較:
多態(tài)
從一個(gè)問(wèn)題引入:
多【多種】態(tài)【狀態(tài)】基本介紹:
方法或?qū)ο缶哂卸喾N形態(tài)。是面向?qū)ο蟮牡谌筇卣?,多態(tài)是建立在封裝和繼承基礎(chǔ)之上的。
方法的多態(tài)
重寫(xiě)和重載就體現(xiàn)多態(tài)。
A a = new A();
// 傳入不同的參數(shù),就會(huì)調(diào)用不同sum方法,就體現(xiàn)多態(tài)
System.out.println(a.sum(10, 20));
System.out.println(a.sum(10, 20, 30));
// 方法重寫(xiě)體現(xiàn)多態(tài)
B b = new B();
a.say();
b.say();
對(duì)象的多態(tài)
- 一個(gè)對(duì)象的編譯類(lèi)型和運(yùn)行類(lèi)型可以不一致。
- 編譯類(lèi)型在定義對(duì)象時(shí),就確定了,不能改變。
- 運(yùn)行類(lèi)型是可以變化的。
- 編譯類(lèi)型看定義時(shí) = 號(hào)的左邊,運(yùn)行類(lèi)型看 = 號(hào)的右邊。
Animal animal = new Dog(); // animal編譯類(lèi)型是Animal,運(yùn)行類(lèi)型是Dog
animal = new Cat(); // animal的運(yùn)行類(lèi)型變成了Cat,編譯類(lèi)型仍然是Animal
多態(tài)的前提是:兩個(gè)對(duì)象(類(lèi))存在繼承關(guān)系。
多態(tài)的向上轉(zhuǎn)型
- 本質(zhì):父類(lèi)的引用指向了子類(lèi)的對(duì)象
- 語(yǔ)法:
父類(lèi)類(lèi)型 引用名= new 子類(lèi)類(lèi)型();
- 特點(diǎn):編譯類(lèi)型看左邊,運(yùn)行類(lèi)型看右邊。
可以調(diào)用父類(lèi)中的所有成員(需遵守訪問(wèn)權(quán)限),
不能調(diào)用子類(lèi)中特有成員;
最終運(yùn)行效果看子類(lèi)的具體實(shí)現(xiàn)!
父類(lèi)的引用指向了子類(lèi)的對(duì)象有什么好處?
A:
- 可以實(shí)現(xiàn)動(dòng)態(tài)綁定,即在運(yùn)行時(shí)根據(jù)對(duì)象的實(shí)際類(lèi)型調(diào)用相應(yīng)的方法,而不是根據(jù)引用的類(lèi)型。這樣可以讓程序更靈活,也可以避免類(lèi)型轉(zhuǎn)換的麻煩。
- 可以實(shí)現(xiàn)抽象化,即只關(guān)注對(duì)象能做什么,而不關(guān)心對(duì)象具體是什么。這樣可以讓程序更簡(jiǎn)潔,也可以降低程序的耦合度,提高程序的可復(fù)用性和可擴(kuò)展性。
- 可以實(shí)現(xiàn)統(tǒng)一接口,即使用父類(lèi)類(lèi)型的引用作為方法的參數(shù)或返回值,可以接受任何子類(lèi)類(lèi)型的對(duì)象。這樣可以讓程序更通用,也可以利用多態(tài)實(shí)現(xiàn)一些設(shè)計(jì)模式,如工廠模式、策略模式等。
多態(tài)的向下轉(zhuǎn)型
- 語(yǔ)法:
子類(lèi)類(lèi)型 引用名 = (子類(lèi)類(lèi)型)父類(lèi)引用;
- 只能強(qiáng)轉(zhuǎn)父類(lèi)的引用,不能強(qiáng)轉(zhuǎn)父類(lèi)的對(duì)象。
- 要求父類(lèi)的引用必須指向的是當(dāng)前目標(biāo)類(lèi)型的對(duì)象。
Animal animal = new Dog(); // 必須已經(jīng)指向Dog類(lèi)型
Dog dog = (Dog)animal;
當(dāng)向下轉(zhuǎn)型后,可以調(diào)用子類(lèi)類(lèi)型中所有的成員。
屬性沒(méi)有重寫(xiě)之說(shuō)!屬性的值看編譯類(lèi)型。
instanceOf
比較操作符,用于判斷對(duì)象的運(yùn)行類(lèi)型是否為 XX 類(lèi)型或 XX 類(lèi)型的子類(lèi)型。
Java的動(dòng)態(tài)綁定機(jī)制
- 當(dāng)調(diào)用對(duì)象方法的時(shí)候,該方法會(huì)和該對(duì)象的內(nèi)存地址/運(yùn)行類(lèi)型綁定。
- 當(dāng)調(diào)用對(duì)象屬性時(shí),沒(méi)有動(dòng)態(tài)綁定機(jī)制,哪里聲明,哪里使用。
多態(tài)的應(yīng)用
多態(tài)數(shù)組
數(shù)組的定義類(lèi)型為父類(lèi)類(lèi)型, 里面保存的實(shí)際元素類(lèi)型為子類(lèi)類(lèi)型。
多態(tài)參數(shù)
方法定義的形參類(lèi)型為父類(lèi)類(lèi)型,實(shí)參類(lèi)型允許為子類(lèi)類(lèi)型。
總結(jié):什么是多態(tài),多態(tài)的具體體現(xiàn)有哪些?
- 方法多態(tài)
- 重載體現(xiàn)多態(tài)
- 重寫(xiě)體現(xiàn)多態(tài)
- 對(duì)象多態(tài)
- 對(duì)象的編譯類(lèi)型和運(yùn)行類(lèi)型可以不一致,編譯類(lèi)型在定義時(shí),就確定,不能變化。
- 對(duì)象的運(yùn)行類(lèi)型是可以變化的,可以通過(guò)getClass()來(lái)查看運(yùn)行類(lèi)型。
- 編譯類(lèi)型看定義時(shí) = 號(hào)的左邊,運(yùn)行類(lèi)型看 = 號(hào)的右邊。
Object類(lèi)詳解
equals方法
【Java】深入理解==和equals的對(duì)比
- ==:既可以判斷基本類(lèi)型,又可以判斷引用類(lèi)型。
- ==:如果判斷基本類(lèi)型,判斷的是值是否相等。實(shí)例:
- ==:如果判斷引用類(lèi)型,判斷的是地址是否相等,即判定是不是同一對(duì)象。
- equals:是Object類(lèi)中的方法,只能判斷引用類(lèi)型。(即int i不能使用.equals方法,但I(xiàn)nteger i可以)
- equals:默認(rèn)判斷的是地址是否相等,子類(lèi)中往往重寫(xiě)該方法,用于判斷內(nèi)容是否相等,比如Integer、String等等。
int i = 10;
double d = 10.0;
System.out.println(i == d); // true
可以自己重寫(xiě) Object 的 equals 方法。
public boolean equals(Object obj) {
}
hashCode 方法
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-479544.html
- 提高具有哈希結(jié)構(gòu)的容器的效率!
- 兩個(gè)引用, 如果指向的是同一個(gè)對(duì)象, 則哈希值肯定是一樣的!
- 兩個(gè)引用, 如果指向的是不同對(duì)象, 則哈希值是不一樣的
- 哈希值主要根據(jù)地址號(hào)來(lái)的 , 不能完全將哈希值等價(jià)于地址。
public class TestComment {
public static void main(String[] args) {
AA aa = new AA();
System.out.println(aa.hashCode()); // 輸出189568618
}
}
class AA {
}
toString 方法
- 默認(rèn)返回: 全類(lèi)名(包名+類(lèi)名)+@+哈希值的十六進(jìn)制, 【查看 Object 的 toString 方法】
子類(lèi)往往重寫(xiě) toString 方法, 用于返回對(duì)象的屬性信息。 - 重寫(xiě) toString 方法, 打印對(duì)象或拼接對(duì)象時(shí), 都會(huì)自動(dòng)調(diào)用該對(duì)象的 toString 形式.
-
當(dāng)直接輸出一個(gè)對(duì)象時(shí), toString 方法會(huì)被默認(rèn)的調(diào)用,
比如 System.out.println(monster); 就會(huì)默認(rèn)調(diào)用
monster.toString()
public class TestComment {
public static void main(String[] args) {
AA aa = new AA();
System.out.println(aa.toString()); // AA@b4c966a
}
}
class AA {
}
finaliza 方法
從Java9開(kāi)始,finalize方法已被標(biāo)注為@Deprecated,也就是過(guò)期了,再往后這個(gè)方法就廢了,以后面試再也不會(huì)被問(wèn)到finalize方法是干嘛的了!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-479544.html
- 當(dāng)對(duì)象被回收時(shí), 系統(tǒng)自動(dòng)調(diào)用該對(duì)象的 finalize 方法。 子類(lèi)可以重寫(xiě)該方法, 做一些釋放資源的操作。
- 什么時(shí)候被回收: 當(dāng)某個(gè)對(duì)象沒(méi)有任何引用時(shí), 則 jvm 就認(rèn)為這個(gè)對(duì)象是一個(gè)垃圾對(duì)象, 就會(huì)使用垃圾回收機(jī)制來(lái)銷(xiāo)毀該對(duì)象, 在銷(xiāo)毀該對(duì)象前, 會(huì)先調(diào)用 finalize 方法。
- 垃圾回收機(jī)制的調(diào)用, 是由系統(tǒng)來(lái)決定(即有自己的 GC 算法), 也可以通過(guò) System.gc() 主動(dòng)觸發(fā)垃圾回收機(jī)制。
到了這里,關(guān)于8.面向?qū)ο缶幊蹋ㄖ屑?jí)部分)|Java學(xué)習(xí)筆記的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!