### 面向對象編程
面向對象編程思想
隨著互聯(lián)網項目需求越來越復雜,面向過程不能滿足,使用面向對象。
將功能(方法/函數)封裝進對象、強調了具備了功能的對象,以類/對象為最小單位,考慮誰來做。
兩個要素:類和對象
面向對象程序設計的重點是類的設計
類的設計就是類的成員的設計
類和對象的使用(面向對象思想落地的實現(xiàn)):
1、創(chuàng)建類,設計類的成員
2、創(chuàng)建類的對象
3、通過“對象,屬性”和“對象,方法”調用對象的結構next
-類
? 類是一組相關屬性和行為的組合
? 類是對一類事物的描述,是抽象的,概念上的定義。
? 實際存在的該類事物的每個個體,因為也稱為實例(instance)
? 面向對象程序設計的重點是類的設計
? 類的設計就是類的成員的設計。
? Java代碼世界是由諸多個不同的功能的類構成的。再大的項目都是由類實現(xiàn)的。
? 例外情況是接口,就不是類構成的。
? Java有豐富的類庫和第三方庫
-類和對象的創(chuàng)建
-類的結構
? 事物描述類
? 創(chuàng)建Person類的屬性和方法:
? public class Person{
? String name;
? int age = 1;
? boolean isMale;
? public void eat(){
? System.out.println("eat")
? }
? public void talk(String language){
? System.out.println("talk"+language)
? }
? }
-成員一:屬性Field
? 屬性:對應類中的成員變量
? field=屬性=成員變量=域、字段
? String name;
? int age = 1;
? boolean isMale;
-=成員變量Member
? 類中,方法外,儲存在堆內存
? 不需要給初始化值
? 1.就是屬性,直接定義在類的一對{}內的屬性
? ....
? 都指非static
? 2.可以使用權限修飾符:(結構被調用可見性的大?。?,跟封裝性有關系
? private
? public
? static
? 缺省=不寫的情況下
? protected
? 3.有默認初始化值,根據其類型
? 整型(byte short int long=0)
? 浮點型(float double=0.0)
? 字符型(char=0或、=\u0000)
? 布爾型(false)
? 引用數據類型(類、數組、接口=null)
? string=null
? 4.屬性在內存中加載到堆空間
? public class Student{
? string name;-聲明一個姓名string變量
? int age;聲明一個年齡int變量
? }
? 5.隨著對象的創(chuàng)建而存在,隨著對象的消失而消失
-private
? 可以修飾成員變量和成員方法
? 被private修飾的成員只能在本類中才能訪問。
? 控制數據安全性。
? 在Demo創(chuàng)建對象的時候就無法調用。
? 針對private修飾的成員變量,我們會相應的提供getXxx()和setXxx()方法,用于獲取和設置成員變量的值和方法。
? private int age
? public void setAge(int a){
if(a<0||a>200){
System.out.println("wrong age");
}else{
age=a;
? }
}
? public int getAge(){
return age;
? }
? 在Demo中就可以調用private的成員變量。
? public static void main..
s.setAge(00);
-成員二:方法/函數
? 描述類應該具有的功能
? 行為=方法=功能:對應類中的成員方法
? method=成員方法=函數
? 函數式一塊代碼塊,接收零個或多個參數,做一個特殊的事情,并返回零個或一個值。
? 任何函數都必須是類的成員,寫在class里。
? public void eat(){
? System.out.println("eat")
? }
? public void talk(String language){
? System.out.println("talk"+language)
? }
? 調用函數invoke a method
? int z= max(x,y)
? 方法是功能的封裝,通過對象來調用功能。
-定義方法/函數的結構
? 類中方法的聲明和使用:
? 格式:
? 權限修飾符 返回值類型 方法名(形參列表)
? 刻畫類應該具有的功能
? math類:sqrt()\random()。。
? scanner類:nextXxx。。
? Array類:sort()\binarySearch()\toString()\equals()
? 方法聲明:
? 1.public void eat(){}沒參沒返回
? 2.public void sleep(int hour){}有參沒返
? 3.public String getName(){} 沒參有返
return name調用屬性
? ? ? public void setAge(int i) { //聲明方法setAge
? ? ? age = i; //將參數i的值賦給類的成員變量age
? 4.public String getNation(String nation){}有參有返
return nation
? 方法的格式:
? 修飾符 返回值類型 方法名(參數類型 參數名1,參數類型 參數名2.。。。){
? 方法體;
? return返回值
? }
? public static void main(){
for(int i=0; i<20; i++){
System.out.println("Hello World!")
? }
? }
? 方法中只能調用方法或屬性,不可以在方法內部定義方法。
-修飾符modifier
? 可以有,可以沒有
? 都是有意義的
? public誰都可以訪問
? static這個函數是靜態(tài)的,整個類的
? 沒有static說明是屬于這個類的某一個對象,而不是屬于整個類的
-訪問權限修飾符Access Modifier(關鍵字)
? 封裝性
-四種權限關鍵字
-private
-屬性/方法
-封裝性
-缺省/default
? 什么也不寫
-protected
-public
? public誰都可以訪問的類
? 在一個java源文件中可以聲明多個class。但是,只能最多有一個類聲明為public,并且和類源文件同名。
-其他關鍵字
-package關鍵字
-import
-static屬于整個類的
? static這個函數是靜態(tài)的,整個類的
? 比如main方法(JDK直接調用的方法)
? 不能用this,不依附于對象。
? 沒有static說明是屬于某個類的某一個對象,而不是屬于整個類的。
? public static void main....
? 靜態(tài)方法不能訪問非靜態(tài)成員方法和非靜態(tài)成員變量(因為不依賴于對象),但在非靜態(tài)成員方法中可以不用對象訪問靜態(tài)方法和變量。
? 帶有static的方法,可以通過類的名稱去直接調用。其他的需要創(chuàng)建對象。
? 所以方便在沒有創(chuàng)建對象的情況下來進行調用(靜態(tài)方法/變量/)。
? 不依賴對象進行訪問,只要類被加載了,就可以通過類名去進行訪問,
-this
? this:代表所在類的對象引用。當前調用對象的引用。用在屬性和參數同名時。
? ? 它在方法內部使用,即這個方法所屬對象的引用;
? ? 它在構造器內部使用,表示該構造器正在初始化的對象。
? ? this 可以調用類的屬性、方法和構造器
? ? 什么時候使用this關鍵字呢?
? ? 當在方法內需要用到調用該方法的對象時,就用this。
? 具體的:我們可以用this來區(qū)分屬性和局部變量。 比如:this.name = name;
? 成員變量=屬性
? 局部變量=參數
-super關鍵字
-final
-變量
-類
-方法
-abstract
-類
-方法
-返回值類型return value type
? 有返回值&沒有返回值
? 1.如果有返回值,必須在方法聲明時指定返回值的類型,同時,方法中需要使用return關鍵字來返回指定類型的變量或常量。
? 2.沒有返回值,則聲明方法是,使用void來表示。使用return表示結束方法。
? 3.定義方法該不該有返回值。根據要求,憑經驗。
-void空類型
? 沒有返回值return的方法
? 調用時直接調用,不用傳遞參數
? void修飾的方法的調用:
? public class MethodTest(){
public static void main(String[] args)
? }
public static void helloWorld(){
for (int i=1;i<10,i++){
System.out.println("HelloWorld")
}
? }
? 練習
-int、float、double、string
? 有return值,調用時需傳遞參數
-方法名method name
? 屬于標識符,遵循標識符的規(guī)則和規(guī)范,符合見名知意。
-main入口函數
? 程序的入口是main方法,格式是固定的
-形參列表parameter list
? 相當于數學里的自變量,可以沒有,也可以有多個,用逗號隔開,用括號括起來。
? 每個參數都要有參數類型和參數名。
? 形參:方法聲明時的參數
? 方法可以聲明0個1個或多個形參。
? 格式:(數據類型1 形參1,數據類型2 形參2,。。。)
-參數結構
-參數類型
? String類型的數組參數列表
? String[]
-基本類型
-引用類型
-數組
-類
-接口
-參數名args
-參數類型
-無形參
-有形式參數formal parameter
-方法參數的使用
-方法的重載
? 即同名方法,參數不同
? 使用重載方法,可以為編程帶來方便。
? 在調用方法的時候,Java虛擬機會通過傳入的參數列表的個數和類型的不同來區(qū)別。
? ? 重載的概念?
? 在同一個類中,允許存在一個以上的同名方法,只要它們的參數個數或者參數 類型不同即可。?
? 重載的特點:?
? ? 與返回值類型無關,只看參數列表,且參數列表必須不同。(參數個數或參數類 型)。調用時,根據方法參數列表的不同來區(qū)別。?
? 重載示例:?
? //返回兩個整數的和
? int add(int x,int y){return x+y;}?
? //返回三個整數的和
? int add(int x,int y,int z){return x+y+z;}?
? //返回兩個小數的和
? double add(double x,double y){return x+y;}?
? public class PrintStream {
? public static void print(int i) {......} public static void print(float f) {......} public static void print(String s) {......}?
? public static void main(String[] args) { print(3);?
? print(1.2f);?
? print("hello!");
-可變個數形參
? 定義可變長度參數的方法
? 說明:?
? 1.聲明格式:方法名(參數的類型名 ...參數名)
? public void test1(String ... books){?
? System.out.println("****形參長度可變的test1方法****");?
? }
? 2.可變參數:方法參數部分指定類型的參數個數是可變多個:0個,1個或多個 3. 可變個數形參的方法與同名的方法之間,彼此構成重載
? 4.可變參數方法的使用與方法參數部分使用數組是一致的
? 5.方法的參數部分有可變形參,需要放在形參聲明的最后
? 6.在一個方法的形參位置,最多只能聲明一個可變個數形參
-值傳遞機制
? Java里方法的參數傳遞方式只有一種:值傳遞。 即將實際參數值的副本 (復制品)傳入方法內,而參數本身不受影響。?
? 形參是基本數據類型:將實參基本數據類型變量的“數據值”傳遞給形參?
? 形參是引用數據類型:將實參引用數據類型變量的“地址值”傳遞給形參
? 引用類型:類(對象)(string類),數組
-方法體statements method header
? 代碼功能語句
? 包含局部變量
? 調用一個功能時,主要是對方法體的體現(xiàn)。
? 之后大部分時間都是在寫方法體。
? 方法的使用:
? 1.在方法內可以調用當前類的屬性和方法。遞歸方法。
? 2.方法里不能定義另一個方法。
-方法的使用
-成員方法
? 和定義方法一樣,但是去掉static
? public void study(){
Sys...
? }
? public void eat(){
Sys...
? }
-遞歸方法/函數
? resursion
? 方法的使用中,可以調用當前類的屬性和方法。
? 特殊的,方法A中又調用了方法A--遞歸方法。
? 遞歸方法:一個方法體內調用它自身。?
? 方法遞歸包含了一種隱式的循環(huán),它會重復執(zhí)行某段代碼,但這種重復執(zhí) 行無須循環(huán)控制。?
? 遞歸一定要向已知方向遞歸,否則這種遞歸就變成了無窮遞歸,類似于死 循環(huán)。
? 死循環(huán)會出現(xiàn)棧溢出:Stack Overflow
? public int getSum(int n){
if(n==1){
return 1;
}else{
return n + getSum(n-1);
? }
? }
-數組快排
-斐波那契數列
? 規(guī)律:一個數等于前兩個數之和
? 1 1 2 3 4? 5 8 13 21 34 55?
? f(n)=f(n-1)+f(n-2)
-漢諾塔問題
-局部變量=本地變量
? 1.聲明在方法內、方法形參、代碼塊內、構造器形參、構造器內部的變量,
? 儲存在棧內存。
? 方法形參:
? public void talk(String language-形參)
? 方法內:
? public void eat(){
? String food = "pizza";
? System.out.println("I like eat "+food)
? }
? 2.不可以使用權限修飾符,只有final
? 3.沒有初始化值,在調用局部變量前一定要賦值初始化,形參在到用時賦值即可。
? 4.局部空間在內存中加載在??臻g
? 5.隨著方法的調用而存在,隨著方法的調用完畢而消失
-方法與數組
-遍歷數組
-獲取最值
-元素的和
-返回值return
? 表明結果是什么,以及結束程序。
? 一個函數里面可以有多個return。
? 找到了,返回相對應數據類型的值,沒找到返回-1(Java默認)
? 使用:
? 1.使用范圍:方法體內
? 2.作用:1)void結束方法
2)有返回值的,返回所數據。
? 3.注意點:return關鍵字后面不可以聲明執(zhí)行類型。
-成員三:構造器constructor
? 不是方法,跟方法不一樣
? 構造器作用:
? 沒有定義,系統(tǒng)會默認提供一個空參構造器
? 創(chuàng)建對象;給對象進行初始化
? 一個類中可以定義多個構造器(重載)
? 一旦顯示的定義了類的構造器之后,系統(tǒng)就不再提供默認的空參構造器
? 一個類中,至少一個構造器
? 定義構造器的格式:
? 權限修飾符 類名(形參列表)
? 給對象的類型進行初始化
? 和類同名的方法
? 沒有寫構造方法的時候,系統(tǒng)會默認創(chuàng)建一個無參無返回值的構造器。
? 定義構造器格式:
? 1.權限修飾符
? 2.方法名和類名相同
? 3.沒有返回值的方法,連void都沒
? 4.(形參列表)p1.name
? Person p1 = new Person("Tom")
? public person(String n){
name=n;
? }
Sys。。。。
? *沒有的時候顯示默認的,寫了就會顯示寫的。
? 調用:
? 通過new這個關鍵字調用
? 創(chuàng)建類對象:new+構造器()
? person p1 = new person();
? 構造器是創(chuàng)建對象
? 注 意:
? ?Java語言中,每個類都至少有一個構造器?
? ?默認構造器的修飾符與所屬類的修飾符一致?
? ?一旦顯式定義了構造器,則系統(tǒng)不再提供默認構造器?
? ?一個類可以創(chuàng)建多個重載的構造器?
? ?父類的構造器不可被子類繼承
-成員四:代碼塊
-static
-非static
-final關鍵字
-成員五:內部類
-抽象類與抽象方法
-接口interface
? ? 一方面,有時必須從幾個類中派生出一個子類,繼承它們所有的屬性和方?
? 法。但是,Java不支持多重繼承。有了接口,就可以得到多重繼承的效果。?
? ?另一方面,有時必須從幾個類中抽取出一些共同的行為特征,而它們之間又 沒有is-a的關系,僅僅是具有相同的行為特征而已。例如:鼠標、鍵盤、打 印機、掃描儀、攝像頭、充電器、MP3機、手機、數碼相機、移動硬盤等都 支持USB連接。?
? ?接口就是規(guī)范,定義的是一組規(guī)則,體現(xiàn)了現(xiàn)實世界中“如果你是/要...則 必須能...”的思想。繼承是一個"是不是"的關系,而接口實現(xiàn)則是 "能不能" 的關系。?
? ? 接口的本質是契約,標準,規(guī)范,就像我們的法律一樣。制定好后大家都 要遵守。
-API
? API:application programming interface,應用程序編程接口。是jave提供的基本編程接口
? 定義好了各種動作的方法,直接調用接口即可。
? java API指的就是JDK中提供的各種功能的java類。
? 在下載的JDK里面含有的
? API文檔:java語言提供了大量的基礎類,因此Oracle也為這些基礎類提供了相應的API文檔,用于告訴開發(fā)者如何使用這些類,以及這些類里包含的方法。
? 如何使用:
-常用類庫(外部類)
? 在JDK里面的java常用開發(fā)工具包內提供
? 不需要關心這些類如何實現(xiàn)
? 是需要學會使用即可
-Scanner()
-random()
-object()
-wrapper()
-常用類
-math類:sqrt()\random()...
-scanner類:nextXXX()...
-array類:sort()\binarySearch()\toString()\equals()...
-常用內部類的使用
-JavaBean
? 所謂javaBean,是指符合如下標準的Java類:?
? ?類是公共的?
? ?有一個無參的公共的構造器?
? ?有屬性,且有對應的get、set方法
-抽象類
-內部類
-匿名內部類
-枚舉類
-object類
-包裝(Wrapper)類
-字符串string類
-Subtopic 1
-Subtopic 2
-Subtopic 3
-面向對象三大特性
-封裝
? 封裝性的體現(xiàn):
? 1.私有屬性
? 2.私有方法
? 3.單例模式。。
? 將類的屬性私有化private,同時提供公共的public方法來獲取getXxx和設置setXxx
? 對屬性的設置(setXxx)
? legs屬性聲明成private以后不可見,不能調用,調用使用接口setLegs方法來調用
? public int setLegs(int a)-有形參
? legs=a
? 對屬性的獲取(getXxx)
? public int getLegs()-沒有形參
-權限修飾符
? 封裝性的體現(xiàn),需要權限修飾符來配合。
? 1.Java規(guī)定的有4種權限:(從小到大排)
? private
? 2.四種權限可以用來修飾類及類的內部結構:屬性,方法,構造器,內部類
? 3.具體的,4種權限都可以用來修飾類的內部結構,修飾類的話,只能使用缺省,public
-getXxx/setXxx
? public class Person{
? private int age;
? public int getAge() { //聲明方法getAge()?
? return age; }?
? public void setAge(int i) { //聲明方法setAge
? age = i; //將參數i的值賦給類的成員變量age?
? }
-包裝(Wrapper)類
-繼承
? 為什么要有繼承??
? 多個類中存在相同屬性和行為時,將這些內容抽取到單獨一個類中, 那么多個類無需再定義這些屬性和行為,只要繼承那個類即可。?
? 此處的多個類稱為子類(派生類),單獨的這個類稱為父類(基類 或超類)??梢岳斫鉃?“子類 is a 父類”?
? 類繼承語法規(guī)則:
? class Subclass extends SuperClass{ }
? public student extends person{
? }
? 作用:
? ? 繼承的出現(xiàn)減少了代碼冗余,提高了代碼的復用性。
? ? 繼承的出現(xiàn),更有利于功能的擴展。
? ? 繼承的出現(xiàn)讓類與類之間產生了關系,提供了多態(tài)的前提。
? ? 子類繼承了父類,就繼承了父類的方法和屬性。
? ? 在子類中,可以使用父類中定義的方法和屬性,也可以創(chuàng)建新的數據和?
? 方法。
? ? 在Java 中,繼承的關鍵字用的是“extends”,即子類不是父類的子集,?
? 而是對父類的“擴展”。?
? 關于繼承的規(guī)則:?
? ?子類不能直接訪問父類中私有的(private)的成員變量和方法。
-父類/子類
? ? Java只支持單繼承和多層繼承,不允許多重繼承?
? ? 一個子類只能有一個父類?
? ? 一個父類可以派生出多個子類
? ? class SubDemo extends Demo{ } //ok
? ? class SubDemo extends Demo1,Demo2...//error
-object類
? 在java中,java.lang.Object 類是所有java類的最高層父類,是唯一一個沒有父類的類:
? 如果在類的聲明中未使用extends 關鍵字指明其父類,則默認父類為Object 類。
-子類對象實例化
? 子類繼承所以父類的屬性和方法
-單繼承/多層繼承
? 在java中,只允許單繼承,也就是說 一個類最多只能顯示地繼承于一個父類。但是一個類卻可以被多個類繼承,也就是說一個類可以擁有多個子類。
-static關鍵字
-方法的重寫override/overwrite
? 定義:在子類中可以根據需要對從父類中繼承來的方法進行改造,也稱?
? 為方法的重置、覆蓋。在程序執(zhí)行時,子類的方法將覆蓋父類的方法。
? 修改的是方法體。
? ?要求:
? 1.子類重寫的方法必須和父類被重寫的方法具有相同的方法名稱、參數列表 2. 子類重寫的方法的返回值類型不能大于父類被重寫的方法的返回值類型?
? 3.子類重寫的方法使用的訪問權限不能小于父類被重寫的方法的訪問權限?
? ?子類不能重寫父類中聲明為private權限的方法
? 4.子類方法拋出的異常不能大于父類被重寫方法的異常?
? ? 注意:?
? 子類與父類中同名同參數的方法必須同時聲明為非static的(即為重寫),或者同時聲明為 static的(不是重寫)。因為static方法是屬于類的,子類無法覆蓋父類的方法。
-this關鍵字
-super關鍵字
? ?在Java類中使用super來調用父類中的指定操作:?
? ?super可用于訪問父類中定義的屬性 ?super可用于調用父類中定義的成員方法 ?super可用于在子類構造器中調用父類的構造器?
? ?注意: ?尤其當子父類出現(xiàn)同名成員時,可以用super表明調用的是父類中的成員?
? ?super的追溯不僅限于直接父類?
? ?super和this的用法相像,this代表本類對象的引用,super代表父類的內存 空間的標識
-調用屬性和方法
? 調用屬性:
? 子類重寫屬性不會覆蓋父類的屬性,用super.可以調用父類屬性,this訪問本類中的屬性(super,this常省略)
? 調用方法:
? 子類重寫方法會覆蓋父類的方法(帶有this.),一定要加super,沒重寫的可以不加
-調用構造器
? ?子類中所有的構造器默認都會訪問父類中空參數的構造器?
? ? 當父類中沒有空參數的構造器時,子類的構造器必須通過this(參 數列表)或者super(參數列表)語句指定調用本類或者父類中相應的 構造器。同時,只能”二選一”,且必須放在構造器的首行?
? ?如果子類構造器中既未顯式調用父類或本類的構造器,且父類中又 沒有無參的構造器,則編譯出錯
-多態(tài)
? 1.理解多態(tài)性:可以理解為一個事物的多態(tài)性。
? 2.何為多態(tài)性
? 子類對象的多態(tài)性:父類的引用p2指向子類的對象Man
? person p2 = new Man()
? person p3 = new Woman
? 3.多態(tài)的使用:當調用子父類同名同參數的方法時,實際執(zhí)行的是子類重寫父類的方法-虛擬方法調用
? 注意:子類自己的方法是不能調用的,方法必須是父類有的,子類重寫的,實際運行的是子類重寫父類的方法
? Java引用變量有兩個類型:編譯時類型和運行時類型。編譯時類型由聲明 該變量時使用的類型決定,運行時類型由實際賦給該變量的對象決定。簡 稱:編譯時,看左邊;運行時,看右邊。
? ?若編譯時類型和運行時類型不一致,就出現(xiàn)了對象的多態(tài)性(Polymorphism) ?多態(tài)情況下,“看左邊”:看的是父類的引用(父類中不具備子類特有的方法)?
? “看右邊”:看的是子類的對象(實際運行的是子類重寫父類的方法)
? 4.多態(tài)性的使用前提:
? 類的繼承關系和方法的重寫
? 多態(tài)性不適用于屬性(看左父類)
-虛擬方法調用
? 虛擬方法調用(Virtual Method Invocation)?
? ? 正常的方法調用
? Person e = new Person();?
? e.getInfo();
? Student e = new Student(); e.getInfo();?
? ? 虛擬方法調用(多態(tài)情況下) 子類中定義了與父類同名同參數的方法,在多態(tài)情況下,將此時父類的方法稱為虛擬方法,父?
? 類根據賦給它的不同子類對象,動態(tài)調用屬于子類的該方法。這樣的方法調用在編譯期是無法 確定的。?
? Person e = new Student();?
? e.getInfo(); //調用Student類的getInfo()方法 ? 編譯時類型和運行時類型?
? 編譯時e為Person類型,而方法的調用是在運行時確定的,所以調用的是Student類 的getInfo()方法?!獎討B(tài)綁定
-向下轉型(向上轉型=多態(tài))
? 有了對象的多態(tài)以后,內存中實際上是加載了子類特有的屬性和方法,但是由于變量聲明為父類類型,導致編譯時,只能調用父類中聲明的屬性和方法,子類特有的屬性和方法不能調用。
? 如何才能調用子類特有的屬性和方法?
? 使用強制類型轉換符(自動類型提升)
? 較高級的基本數據類型-》較低級的基本數據類型
? Man m1 = (Man)p2;
? m1.earnMoney();
? ...
? 向上轉型:多態(tài)
? 向下轉型:使用instanceof進行判斷
-instanceof操作符(關鍵字)
? a instanceof A:
? 判斷對象a是否是類A的實例。如果是返回true,如果不是返回false。
? 即為了在向下強轉之前不出現(xiàn)異常,先做一個判斷。
? if(p2 instanceof Woman)
? if(p2 instanceof Man)
? 如果a instanceof A返回true,則a instanceof B也返回true。其中,類B是類A的父類。
-單例設計模式
-抽象
-抽象類
-抽象方法
-接口
-容器
-設計模式
-Java新特性
-泛型
-元注解
-裝箱/拆箱
-枚舉
-可變參數
-Lambda表達式
-Stream API
-Data/Time API
### 應用程序開發(fā)(類庫)
-異常處理
-斷點調試debug
? 可以通關斷點調試插卡程序的執(zhí)行流程
-JDBC
-Oracle/MySQL
-反射
? 通過對象倒推類
-網絡編程Java Web
-多線程編程
-Java常用類庫
-枚舉類/注解
-Java集合Map
-泛型
-I/O輸入/輸出流編程NIO
-網絡
-集合