-在程序中使用對象來映射現實中的事物,使用對象的關系來描述事物之間的 聯系,這種思想就是面向對象。
*對象:-在現實生活中存在的具體的一個事物。
*類:-實際就是對某種類型事物的公共屬性與行為的抽取。(類是一個抽象的概念,就相當 于圖紙)
*對象與類的關系:-類時對象的模板-汽車圖紙
-對象是類的實例-各種汽車
*面向對象的核心思想:-找適合的對象做適合的事。
*面向對象的三大特征:-1.封裝
-2.繼承
-3.多態
*找對象方式:-方式一:sun給我們定義好了很多的類,我們只需要認識這些類即可創建對象為我 們使用。
-方式二:我們要自定義類,然后通過自定義的類創建對象為我們服務。
二、如何自定義類創建對象*1.自定義一個類格式:
class類名{
事物公共的屬性使用成員變量描述;
事物的公共行為使用函數描述;
}
*2.通過自定義的類創建對象格式:
類名變量名=new類名();
*3.對象成員的調用(調用對象的方法或者訪問對象的屬性)1.成員變量(訪問對象的屬性)
對象.屬性名;
2.成員方法(調用對象的功能)
對象.函數名();
三、局部變量和成員變量*成員變量:定義在方法之外,類之內*注意:成員位置只能用于定義函數或者是定義一個變量,不能寫任何的執行語句
*局部變量:定義在方法之內*成員變量與局部變量的區別:-1.應用范圍-1.成員變量在整個類內都有效
-2.局部變量只在其聲明的方法內有效
-2.生命周期-1.成員變量:它屬于對象,它隨著對象的創建而創建,隨著對象的消失而消失
-2.局部變量:使用完馬上釋放空間
-3.存儲位置-1.成員變量屬于對象,它存儲在堆內,堆內的實體,當沒有引用指向其時,才垃 圾回收清理
-2.局部變量存在棧內存中,當不在使用時,馬上就會被釋放
-4.初始值-1.成員變量它存儲在堆中,如果沒有賦初值,它有默認值
-1.整數byte、short、int、long=0;
-2.char=‘/uoooo’;
-3.boolean=false;
-4.String=null;
-5.類類型=null;
-6.數組=null;
-2.局部變量,如果要想使用必須手動初始化
-1.方法中,參數列表中,語句中
-2.必須給初始化值,沒有初始值,不能使用
-3.在棧內存中
四、匿名對象*匿名對象:沒有引用類型變量指向的對象則稱作匿名對象*匿名對象的用途:-1.如果需要調用一個對象的功能一次的時候,然后該對象就不再使用了,這時候可 以使用匿名對象。(為什么只調用方法,而不調用屬性呢?因為匿名對象調用屬性 沒意義。如果對象要對成員進行多次調用,必須給對象起個名字。不能使用匿名對 象。)
-2.可以作為參數傳遞調用方法。
*匿名對象的簡單演示:-newCar().run();
*匿名對象的好處:-簡化書寫
*匿名對象要注意的細節:-1.一般都不要給匿名對象賦予屬性值,因為永遠都沒法獲取到。
-2.兩個匿名對象永遠都不可能是同一個對象。
-1:newCar().num=5;
-2:newCar().color=“blue”;
*注意:兩個new是兩個不同的對象,在堆內存中有不同的空間,相互不干擾。
五、封裝*封裝的定義:-隱藏對象的屬性與具體的實現細節,對外提供公共的訪問方式。
*封裝的原因:-1.出現了數據安全問題
-2.根本原因:別人可以對對象的屬性進行直接的賦值,賦值之前沒有經過任何的判 斷。
*訪問權限修飾符:-訪問權限修飾符也就是控制類、屬性、方法的可見范圍的。
-PRivate:私有的,如果使用了private修飾的函數或者是屬性(成員變量),那么被修 飾的成員只能在本類中可見。
-public:公共的,任何人都可以進行訪問。
*封裝的步驟:-1.使用private修飾需要被封裝的屬性,把屬性給隱藏起來。(使用private修飾成員 變量)
-2.對外提供公共的訪問方式。(設置、獲取)
-命名規范:
set屬性名
get屬性名
-疑問1:封裝都需要提供get與set方法才稱作為封裝嗎?
不一定,看需求而定。
-疑問2:對外提供的設置以及獲取屬性的方法名一定要叫get、set嗎?
不一定,只不過是一個命名規范。
*在現實開發中的規范:一般實體類的所有成員變量都會封裝起來。
*類:
-工具類:Arrays(數組的工具類),主要是提供一個方法對外進行訪問,方便用戶 操作數據。
-實體類:描述一類事物的公共屬性與公共行為的,比如:人類、汽車類...
*封裝的好處:-1.提高了數據的安全性。
-2.提高代碼的復用性。
-3.隱藏了具體的實現,操作簡單了。
六、構造函數*構造函數的作用:-構造函數的作用是初始化對應的對象。
*構造函數的定義格式:修飾符函數名(形式參數列表){
初始化對象的語句;
}
*構造函數要注意細節:-1.構造函數是沒有返回值類型的。
-2.構造函數的函數名必須與類名一致。
-3.構造函數并不是由我們手動調用的,構造函數是在創建對應的對象的時候,jvm 主動調用的。
-4.每創建一個對象,就會調用一次對應的構造方法。
-5.如果一個類沒有顯式的寫上一個構造函數的時候,那么java編譯器會為該類添加 一個無參的構造方法。
-6.如果一個類已經顯式的寫上了一個構造方法,那么java編譯器則不會再為該類添 加一個無參構造方法。
-7.一個類可以存在多個構造函數,創建對象的時候具體調用哪個是根據你創建對象 的時候所傳入參數而定。
*構造函數與普通函數的區別:-1.作用上的區別:
-普通的函數的作用是用于描述一類事物的功能,構造函數的作用初始化對 象。
-2.函數名的區別:
-普通函數的函數名只要符合標識符的命名規則即可。構造函數的函數名必須要 與類名一致。
-3.返回值類型的區別:
-普通函數是有返回值類型的,而構造函數是沒有返回值類型的。
-4.調用上的區別:
-普通函數可以使用一個對象調用多次,構造函數是每創建一個對象就只會調用一 次。
-注意:代碼混淆
*疑問1:創建對象的時候jvm會調用構造方法,那么我們以前沒有學構造方法,那么jvm 還會調用構造方法嗎?
-會,java編譯器在編譯一個java文件的時候,如果該類沒有顯式的寫上一個構 造方法,那么java編譯器會自動為該類添加一個無參的構造方法。
*疑問2:java編譯器添加的無參構造方法默認的權限修飾符是什么?
-java編譯器添加的無參構造方法的權限修飾符是與類的修飾符一致。
*jdk提供一個反編譯工具給我們:javap
-使用格式:
javap-c-l-privateclass
*構造代碼塊-構造代碼塊:構造代碼塊的作用是給所有的對象進行統一初始化。
-構造函數:構造函數的作用是給對應的對象進行初始化。
-構造代碼塊的實現方式:
{
構造代碼塊
}
-構造代碼塊是在創建任意的對象的時候都會調用一次的。
*代碼塊的類型:構造代碼塊:構造代碼塊就是指{}位于方法之外,類之內的代碼塊。
局部代碼塊:{}位于方法之內的代碼塊。縮短局部變量的生命周期。
靜態代碼塊:static修飾的代碼塊
-靜態代碼塊的代碼是在class文件加載的時候調用的。
-靜態代碼塊的代碼的使用場景:
-用于加載配置文件:比如:數據庫的用戶名密碼加載。
*構造代碼塊要注意細節:-1.構造函數的代碼是位于成員變量的顯式初始化、構造代碼塊之后執行的。(不管 代碼的位置如何擺放)
-2.成員變量的定義語句經過java編譯器編譯之后,聲明變量的語句會被提前。
-3.其實構造代碼塊的代碼是在構造函數里面執行的。(重點)
-4.構造代碼塊的代碼與成員變量的顯式初始化動作的先后順序是根據當前的代碼順 序而決定的。
七、this關鍵字*this關鍵字代表了所屬函數的調用者對象(誰調用了this當前所在的函數,this就代表誰)
*this關鍵字出現的原因-問題1:構造函數的形式參數變量名一旦改成了id與name,那么賦值動作失效??
-問題2:構造函數中出現了重復代碼?
*this關鍵字的作用:-1.存在同名的成員變量與局部變量時,在方法內部默認訪問的是局部變量的數據, 可以通過this關鍵字指定訪問成員變量的數據。
-2.this關鍵可以在一個類的構造函數中調用另外一個構造函數初始化對象。
*this關鍵字要注意的事項:-1.如果在方法內部訪問了一個變量,而該變量僅存在于成員變量上的時候,那么java 編譯器會在該變量的前面添加this關鍵字。
-2.this關鍵字調用其他的構造函數的時候,this關鍵字必須是構造函數第一個語句.
-3.this關鍵字調用構造函數的時候不準出現相互調用的情況,因為會死循環。
-注意:this關鍵字可以用于引用當前類以外其他類型的對象
八、static關鍵字*static靜態的:修飾符*static修飾成員變量:-static修飾的成員變量的數據是屬于所有的對象共享的數據,在內存中只會維護一 份。
*靜態成員變量的訪問方式:-方式一:使用對象進行訪問。
對象.屬性名
-方式二:使用類名進行訪問
類名.屬性名
-推薦使用:類名訪問。
*靜態成員變量要注意的細節:-1.靜態的成員變量可以使用類名與對象進行訪問,而非靜態的成員變量只能使用對 象進行訪問。
-2.如果數據不是屬于共享使用,那么千萬不要為了訪問方便而使用static修飾。只 有數據真正需要被共享的時候才使用static修飾。
*靜態的成員變量與非靜態成員變量的區別:-1.作用的區別:
-靜態的成員變量的作用是共享一個數據給所有對象使用,
-非靜態成員變量的作用是描述一類事物的公共屬性。
-2.訪問方式的區別:
-靜態的成員變量可以使用類名、對象進行訪問。
-非靜態的成員變量只能使用對象進行訪問。
-3.生命周期的區別:
-靜態的成員變量是隨著class文件的加載而存在,隨著class文件卸載消失。
-非靜態的成員變量隨著對象創建而存在,隨著對象被垃圾回收器回收的時候 就消失。
-4.數量上區別:
-靜態的成員變量數據是存在于方法區內存中而且只會存在一份數據。
-非靜態的成員變量數據是存在于堆內存中,數量與對象一樣。
*static修飾成員函數:*靜態函數的訪問方式:-方式一:可以使用對象進行訪問
對象.函數名()
-方式二:可以使用類名進行訪問。
類名.函數名()
*靜態函數要注意的細節:-1.靜態函數可以使用類名、對象進行訪問,非靜態函數只能使用對象進行訪問了。
-2.靜態函數可以直接訪問靜態的成員,但是不能直接訪問非靜態的成員。
-原因:靜態函數可以使用類名進行調用,這時候有可能還沒有存在對象,如果
對象不存在,那么就意味著非靜態的數據還不存在內存中。
-3.非靜態函數可以直接訪問靜態的成員,也可以直接訪問非靜態的成員.
-原因:非靜態函數只能由對象進行調用,調用非靜態函數時對象已經存在了
對象一旦存在,靜態數據與非靜態數據都已經在內存中了。
-4.靜態函數是不準出現this與super關鍵字的。
-原因:靜態函數可以使用類名進行調用,這時候不存在著函數的調用者對象。
-結論:靜態的數據優先于非靜態的數據存在內存
*static修飾成員變量與修飾成員函數的應用場景:-什么時候使用static修飾成員變量呢?
-如果成員變量的數據是屬于共享數據,那么這時候即可使用static修飾該成員變 量。
-什么時候使用static修飾一個函數呢?
-如果一個函數沒有直接訪問非靜態的成員,那么就可以使用static修飾該函數。 例如:Arrrays工具類
九、main方法的設計原理(了解)*main詳解:為什么要這樣子設計這個main方法。*public:公共,為了jvm在任何情況下都可以調用到main方法。
*static:靜態
*void:沒有返回值,原因:因為main方法是由jvm調用的,如果設計成有返回值,那 么返回的數據就交給了jvm,但是jvm也不知道怎么去使用返回值,而且你也沒 法獲取到返回值。
*main:不是一個關鍵字,只不過是jvm識別的一個比較特殊的標識符而已。
*args:數組,主要是用于傳遞參數使用的。
*main方法假如不用static修飾引起麻煩事:
-1. 如果main方法不是static修飾的,那么調用main就需要先創建對象。---->jvm 就必須要創建對象。
-2.假如一個類不存在著無參的構造方法,jvm在創建對象的時候就必須要使用帶 參的構造方法,而jvm這時候根本就不知道傳入什么數據給你才合適。
十、繼承(isa關系)*繼承的引入-java是面向對象語言:萬物皆對象.世界上任何的事物都可以使用java類進行描述。
-在生活中事物與事物是有關系,那么java就必須要把事物之間的關系也要描述清楚。
-目前存在的問題:
1.目前狗與動物類的繼承關系沒有描述清楚。
2.兩個類的代碼重復了
*什么是繼承*繼承的格式:class類名1extends類名2{
}
*繼承要注意的細節:-1.千萬不要為了減少重復代碼而去繼承,只有兩種事物真正的存在繼承關系的時候才 去繼承。
-2.父類私有的成員是不能被繼承的。
-3.父類的構造方法也是不能被繼承。
-4.創建子類對象時默認會先調用父類無參的構造方法。
-注意:一個類只能有一個直接的父類。
*疑問:為什么要調用父類的構造方法-創建子類對象時為什么會調用父類的構造方法?
-意義:在創建子類對象時調用父類的構造方法的意義在于為子類初始化從父類 繼承下來的屬性數據。
*方法重寫-為什要對方法重寫-問題:父類的功能無法滿足了子類的需求。
-解決方案:子類可以對該功能進行重寫。
-方法重寫的前提:-必須要存在著繼承的關系。
-方法的重寫:-子父類存在同名的函數稱作為方法的重寫。
-方法重寫的要求:1.方法重寫時,子父類的函數名與形式參數要完全一致。
2.方法重寫時,子類的訪問權限修飾符必須大于或者等于父類的權限修飾符。
3.方法重寫時,子類的返回值類型必須要小于或者等于父類的返回值類型。
4.方法重寫時,子類拋出的異常類型必須要小于或者等于父類拋出的異常類型。
*方法重載:-方法的重載:-在一個類中存成兩個或者兩個以上的同名函數稱作為方法的重載。
-方法重載的要求-1.函數名一致。
-2.形式參數列表不一致。(形式參數的個數或對應的數據類型不一致。)
-3.與返回值類型無關
*方法重載與方法重寫的區別:-方法重載:在一個類中存成兩個或者兩個以上的同名函數稱作為方法的重載。
-方法重寫:子父類存在同名的函數稱作為方法的重寫。
十一、super關鍵字*super關鍵字:super關鍵字代表的是父類空間的引用。*super關鍵字的作用:-1.子父類存在著同名的成員時,在子類中默認訪問的是子類的成員,可以通過super 關鍵字指定訪問父類的同名成員。
2.super關鍵字可以在子類的構造函數中指定調用父類的構造函數。
*super調用構造函數要注意的細節:-1.super關鍵字調用父類構造函數的時候,super關鍵字必須位于子類構造函數中 第一個語句。
-2.super關鍵字與this關鍵字調用構造函數的時候不能同時存在一個構造函數中,因 為兩個語句都需要是第一個語句。
*this與super區別:-1.使用前提的區別:this關鍵字不需要存在繼承關系就能使用,super關鍵字一定 要存在繼承關系才能使用。
-2.作用上的區別:this關鍵字代表的是所屬函數的調用者對象,super關鍵字代表 的是父類空間的引用。
十二、單例設計模式*模式:解決一類問題的固定步驟。
-模式的概念最先是建筑行業提出來的:
-蓋房子:
-打地基----->澆柱----->蓋樓面----->砌墻------->裝修----完工
-IT行業
-磚家------->24種設計模式
*單例設計模式:
-保證一個類在內存中只有一個對象。
*單例設計模式的步驟:-餓漢單例設計模式:-1.私有化構造函數。
-2.聲明本類的引用類型變量并且讓該變量指向本類的對象。
-3.提供一個公共靜態的方法獲取本類的對象
-懶漢單例設計模式:-1.私有化構造函數。
-2.聲明本類的引用類型變量,但是先不要創建本類的對象。
-3.提供公共靜態的方法獲取本類的對象,獲取之前先判斷是否已經創建了本類 的對象,如果還沒有創建,那么就先創建本類的對象然后返回,如果已經創建 了,那么直接返回即可。
-推薦使用:餓漢單例設計模式.因為懶漢單例設計模式存在線程安全問題。
-懶漢模式線程安全問題的解決辦法:使用同步函數synchronize()
十三、關鍵字instanceof*instanceof關鍵字:判斷一個對象是否屬于指定的類型。*instanceof關鍵字的使用前提:-判斷的對象與類型必須要存在繼承關系。
*instanceof使用格式:-對象instanceof類型
-booleanflag=DoginstanceofAnimal;
*instanceof關鍵字的應用場景:
-類型強制轉換之前先判斷是否是屬于某種類型,這時候可以避免強制類型轉換異常。
十四、final關鍵字*final(最終的)關鍵字:-1.final修飾基本數據類型變量時,該變量的值不能被修改。
-2.final修飾引用類型變量時,該變量不能重新指向新的對象。
-3.final修飾一個方法時,該方法不能被重寫。
-4.final修飾一個類的時候,該類不能被繼承。
*常量的命名規范:全部字母大寫,單詞與單詞之間使用下劃線分隔。
*常量的修飾符:publicstaticfinal
十五、抽象類abstract*抽象類的引入-目前存在的問題:
-1.Animal的run方法寫得不合理。
-2.編譯的時候沒有強制讓我重寫run方法。
-動物跑的行為不具體,例如:狗和魚
*什么是abstract抽象類:*什么時候使用抽象類:-我們在描述一類事物的時候,發現該事物確實存在著某種行為,但是目前這種行為是 不具體的,那么我們可以抽取這種行為的聲明,不去實現該種行為,把這種實現描述 成抽象的行為,這時候即可使用抽象類。
*抽象類的好處:強制讓子類實現抽象的方法。*抽象類要注意的細節:-1.如果一個方法沒有方法體,那么該方法必須要使用abstract修飾。
-例:publicvoidrun();沒有方法體,需要abstract修飾
-2.如果一個類存在著抽象方法,那么該類也必須要使用abstract修飾或者是接口。
-3.非抽象類繼承抽象類的時候,要把抽象類的所有抽象方法全部實現。
-4.抽象類可以存在非抽象與抽象方法。
-5.抽象類可以不存在抽象方法。
-6.抽象類不能創建對象。
-疑問:為什么抽象類不允許被創建對象呢?
-因為抽象類存在著抽象方法,創建了抽象的對象就可以調用抽象方法,調用 抽象方法是沒有任何意義。
-7.抽象類肯定存在構造方法的。
-疑問:既然抽象類都不能創建對象,那么存在構造方法的意義在哪?
-其構造方法是提供給子類去調用初始化從父類繼承下去的屬性的。
*abstract不能與以下關鍵字配合使用:-1.abstract不能與private共同修飾一個方法。
-2.abstract不能與static共同修飾一個方法。
-3.abstract不能與final共同修飾一個方法。
十六、值傳遞*值傳遞:-調用一個方法的時候傳遞的變量,只不過是傳遞了變量所存儲的值,并沒有把變量的 本身傳遞過去。
-注意:每一個方法運行的時候jvm都會為該方法開辟一個獨立的內存空間, 不同內存空間上的變量是相互獨立的。
十七、接口*什么是接口*接口的定義格式:interface接口名{
}
-接口中也可以有成員變量和成員函數,只是一般沒人用而已。
*接口要注意的細節:-1.接口是一個特殊的類。
-2.接口中的成員變量都是常量,默認的修飾符為publicstaticfinal.
-3.接口中的方法全部都是抽象方法,默認的修飾符為publicabstract。
-4.接口不能創建對象。
-5.接口是沒有構造方法的。
-6.接口是給類實現使用的。
-7.非抽象類實現一個接口時,必須要把接口中的所有方法實現。
*接口的作用:-1.程序的解耦。
-2.定義約束規范。
-3.拓展功能的。
*一個類實現接口的格式:class類名implements接口名{
}
*接口與類之間的關系:implements實現關系-注意
-1.非抽象類實現一個接口時,必須要把接口中所有方法實現。
-2.抽象類實現一個接口時,可以實現接口中的方法,也可以不實現接口方法。
-3.一個類可以實現多個接口。java支持多實現的.
*接口與接口之間的關系:extends繼承關系-注意:一個接口是可以繼承多個接口
*疑問:java支持多實現,為什么只支持單繼承呢?-原因:
-1.主要是防止多個類有相同的方法名,然而方法體不一樣,子類就比較難選擇了。 所以java不支持類的多繼承-2.允許實現多個接口的一個好處就是,當實現多個接口時,如果兩個接口有同樣的方法,那么實現一次就可以了。由于接口沒有方法體,所以接口可以實現多繼承。
十八、多態*多態:-父類的引用類型變量指向了子類的對象或者是接口的引用類型變量指向了接口實現類的對象。
*多態前提:繼承或者是實現關系*多態要注意的細節:-1.多態情況下,子父類存在著同名的成員變量時,默認訪問的是父類的成員變量。
-2.多態情況下,子父類存在著同名的非靜態函數時,默認訪問的是子類的成員函數。
-3.多態情況下,子父類存在著同名的靜態函數時,默認訪問的是父類的成員函數。
-總結:多態情況下,子父類存在著同名的成員時,默認都是訪問父類的成員,除了同名的非靜態函數是訪問子類的成員。
-4.多態情況下,不能調用子類特有的方法或者不能訪問子類特有的成員變量。
*編譯看左邊:-java編譯器在編譯的時候會檢測一個引用類型變量所屬的類是否具備指定的成員,如果不具備那么編譯報錯。
*多態應用:-1.多態用于形式參數類型的時候可以接收更多類型的對象。
-2.多態用于返回值類型的時候可以返回更多類型的對象。
*多態的作用:增強程序的拓展性。*多態怎么調用子類的特有成員
-多態最不爽的地方即使不能調用子類特有的成員。
-多態情況下如果需要調用子類特有的成員需要進行類型強制轉換。
-例:Animala=newDog();
Dogd=(Dog)a;
d.bite();
*類型轉換:
-基類數據類型數據
-小類型數據--------->大類型數據自動類型轉換
-大類型數據--------->小類型數據強制類型轉換
引用數據類型:
-小類型數據--------->大類型數據自動類型轉換
-大類型數據-------->小類型數據強制類型轉換
十九、內部類*內部類:-在A類內部中定義另外一個B類,B類則稱作為內部類。
-注意:內部類的class文件的命名是:外部類$內部類.class.這樣子的命名意義主要是為了區分開目前內部類是屬于哪個外部類的。
*內部類的類型-成員內部類
-局部內部類
-匿名內部類
*成員內部類:-成員內部類的訪問方式:
-方式一:在外部類提供一個方法用于創建內部類的對象,然后進行訪問。
-方式二:在其他類直接創建內部類的對象。
格式:
外部類.內部類變量名=new外部類().new內部類();
*內部類的好處:
-內部類可以直接訪問外部類的任何成員。
*內部類的應用場景:
-我們在描述一類A事物的時候,發現該A事物內部還具備另外一個事物B,而且B事物需要用到A事物的一些成員數據,那么這時候B事物我們就可以使用內部類來描述。
-比如:
class人{
氧氣
血液
class心臟{
}
}
*內部類要注意的事項:-1.如果外部類與內部類存在著同名的成員時,在內部類中默認是訪問內部類的成員(就近原則)。如果需要指定訪問外部類的成員,可以使用"外部類.this.成員"格式進行指定訪問。
-2.如果一個內部類使用了private修飾,那么該內部類就只能在外部類提供一個方法創建內部類的對象了,在其他類無法再創建該內部類的對象。
-3.如果內部出現了靜態的成員,那么該內部類也必須使用static修飾.
-疑問:為什么內部類出現了靜態的成員,那么該內部類就必須使用static修飾??
*局部內部類:-在A類的方法內部定義另外一個B類,B類則稱作為局部內部類。
-注意:局部內部類訪問一個局部變量的時候,局部變量必須使用final修飾。
-疑問:為什么局部內部類訪問一個局部變量的時候,局部變量必須使用final修飾?
*匿名內部類:-沒有類名的內部類
*匿名內部類使用前提:
-必須存在繼承或者實現關系。
*匿名內部類的好處:
-簡化書寫。
*注意:匿名內部類只是沒有類名,其他成員是具備的。
二十、圖片解析*01面向對象與面向過程的區別















新聞熱點
疑難解答