目錄:
toString()
boolean equals(Object obj)
static
單例類(單個實例)
final
abstract
Object 類的簡單特征
??? 因為一切類都是Object類的子類
第一個重要方法:toString(),它負責把返回該對象的“描述性字符串”。
??? 當你“打印輸出”一個對象時,實際上就是打印輸出該對象的 toString 方法的返回值。
??? Object 類提供的 toString() 方法,返回值就是 類名@hashCode值
???????????? ——所以很多時候,都要重寫 toString() 方法
第二個重要方法:boolean equals(Object obj)
???????????????????????????? 這個方法用于按【程序自己的規(guī)則】判斷兩個對象是否相等。
?????????? ==? 用于判斷兩個【基本類型】的變量(表達式/直接量),它們的值是否相等。
????????????????? A。當比較【基本類型】的值時,程序并不管它的數(shù)據(jù)類型,只比較實際的值的大小。
????????????????? B。如果是【引用類型】的變量(不包括包裝類,因為包裝類可以自動拆箱)
??????????????????????? == 要求被比較兩個【引用變量】,引用同一個實例才會返回 true
重寫equals 方法的標準:
??? 1. 如果當前對象與被比較對象,本省就想同,直接返回 true。
??? 2. 要求當前對象與被比較對象的類型相同,
????????????????????????????????????????????????????? 關鍵屬性值也相同——此時才返回 true
static
????? A。static 只是一個標志。
? ?? ???? 有 static 修飾,表明被修飾的成員屬于類。
? ?? ???? 沒有 static 修飾,表明它是屬于實例的。
????? B。static 成員(Field、方法、初始化塊),與類共存亡
??????????? static 成員,建議總是通過類名來訪問。
??????????????????????????????? 如果見到通過實例的情況,你可以先將實例替換成類名。
????? C。必須先有類,再有對象。
???????????? 有可能出現(xiàn)的情況,JVM 已經(jīng)有類了,依然沒有實例。
???????????? 絕對不可能:JVM 已經(jīng)有了該類的實例,但該類信息依然不存在!
??? 【規(guī)則】:【static 成員】不允許訪問【非 static 成員】!(有static的不能訪問沒有static的,因為類成員(有static的)比實例早出現(xiàn))
????????????????????? 【【靜態(tài)成員】不能訪問【非靜態(tài)成員】】
????????????????????? this引用,super 都不允許出現(xiàn) static 方法中。
????????????????????? 當程序直接訪問一個Field ,實際上前面省略了:
??????????????????????????????? 【如果Field 是實例Field,相當于省略了this】
??????????????????????????????? 【如果Field 是類Field ,相當于省略了類名】
StaticTest? 程序 及 運行結果:
public class StaticTest
{
??? // 定義了一個類Field,它與StaticTest 類本身共存亡
??? static int count = 20;
??? public static void main(String[] args)
??? {
? ?? ?? // 只是定義一個st引用變量
? ?? ?? // 但st并未指向任何有效的對象
? ?? ?? StaticTest st = null;
? ?? ?? // 對于靜態(tài)Field、static方法,我們建議將實例可以直接替換成類名
? ?? ?? System.out.println(st.count); // st 寫成 StaticTest
??? }
}
輸出結果為? 20
StaticEx? 程序 及 運行結果:
public class StaticEx
{
??? int age;
??? // 實例初始化塊,負責對實例Field 進行初始化
??? {
??????? age = 20;
? ?? ?? abc();// 相當于 StaticEx.abc();非靜態(tài)可以訪問靜態(tài)的,
? ? ? ?? ? ? ? ?? //因為abc是static修飾的,屬于類,所以前面省略類名
??? }
??? static
??? {
? ?? ?? abc();// static靜態(tài)初始化塊調用靜態(tài)方法
??????????????????? // age = 12;// 錯誤,age 是非靜態(tài)的,【靜態(tài)成員】不能訪問
????????????????????????????????? //【非靜態(tài)成員】,此時位于靜態(tài)初始化塊中
??? }
??? public void test()
??? {
? ?? ?? System.out.println("age的值是:" + age);// age 相當于 this.age
??? }
??? // 通俗:豬八戒.吃(西瓜),烤(雞翅)? // 烤雞翅前省略了主語,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? // 即豬八戒,可以成this
??? public static void abc()
??? {
? ?? ?? System.out.println("~~static修飾的abc方法~~" );
??? }
}
單例類(單個實例)
????? 在某些時候,我們只允許為某個類創(chuàng)建一個實例。
????? 要實現(xiàn)單例:
??????????????? A。構造器不能暴露。
????????????????????? 否則就可以自由的創(chuàng)建很多個實例。
??????????????? B。暴露一個方法,由該方法來返回實例。
??????????????????? ? 由于程序必須通過該方法來獲取實例,
????????????????????? 所以在調用該方法之前,肯定沒有實例。
????????????????????? 因此只能通過類來調用,所以該方法必須使用 static 修飾
?????????????? C。使用靜態(tài) Field 來“緩存”已有的實例。
???????????????????? 每次在獲取實例之前,先判斷是否已經(jīng)“緩存”過實例。
? ? ? ? ? ? ? ? ? ? 如果沒有緩存過,就創(chuàng)建,否則直接返回“緩存”的實例。
final
???
?????? - 變量:成員變量(類變量和實例變量)和局部變量(方法里局部變量、代碼塊的局部變量)
?????? - 方法
?????? - 類
1.final 修飾變量
??????? — 該變量值只能被賦值一次,不可改變!
A? -? final 修飾成員變量。
??????? Java 成員變量(Field),默認是可以由系統(tǒng)執(zhí)行初始化,程序員可以不指定初始值。
但是,final 修飾的成員變量(Field),【必須由程序員】執(zhí)行初始化
????????????? 原因(反證法):假如讓系統(tǒng)執(zhí)行初始化,變量的值要么是0、0.0、\u0000、false、null。final 又導致這些變量的值不允許被改變,那么這些變量就失去價值了。
????????? A1。如果final修飾實例變量,可以再如下3個地方為final實例變量指定初始值。
?????????????????? 1. 定義時指定初始值。
?????????????????? 2. 初始化塊
?????????????????? 3. 構造器
? ? ? ? 最多只能指定一次初始值
??????? 普通方法不允許為 final 實例變量賦值
????????? A2。如果 final 修飾類變量,可以在如在2個地方為final類變量指定初始值。
? ? ? ? ? ? ? ? ? 1. 定義時指定初始值。
????????????????? 2. 類(靜態(tài))初始化塊。
???????? 最多只能指定一次初始值。
???????? 普通類方法、普通實例方法、普通初始化塊、構造器都不能為 final 類變量賦值。
B? -? final 修飾局部變量。
??????????? Java 的局部變量,默認就【必須由程序員來指定初始值】。
??????????? final 修飾的局部變量之后,只有一個變化:
? ? ? ? ? ? ? ? final 局部變量依然【必須由程序員來指定初始值】
??????????????????????? 但是,一旦指定了初始值之后以后它的值就不能改變了,只能一次賦值!
final 修飾的變量,它會被執(zhí)行”宏替換“
????? ?? final 修飾的變量:1. 聲明時就指定了初始值,而且 2. 初始值在編譯時就可以確定。
??? ~~~~~~~ 那么這個變量就不存在!
? ? ? ? ”宏替換“ —— 就是”查找、替換“
? 補充:? 對于執(zhí)行“宏替換”,變量名應該多個單詞連綴而成
?????????????? 對于字母全部大寫,單詞與單詞之間以下劃線隔開
宏替換 — 例:
public static void main(String[] args)
???????? final String s1 = "今天";
???????? final String s2 = "是";
???????? final String s3 = "周一";
???????? final String s4 = s1 + s2 + s3;
上面程序中定義了幾個變量?? ? 0 個? ? ? 宏替換,直接沒有"今天";"是""周一",直接調用打印
定義了幾個 String 對象?? ? ? ? ? 1 個? ? ? 因為 s1 + s2 + s3為 ”今天是周一“,有字符串的長度,放在緩存中,所以為對象。
Ps:JVM 會把所有用過的對象進行緩存,第二次可以用
例1:
????? String a = "今天是周一";
????? String b = "今天是" + "周一";
????? System.out.println(a == b); //? a、b必須指向同一個對象才相等
上面程序輸出為 true。因為? ? 在編譯時候,編譯器已經(jīng)把”+ 運算“ 計算出來。"今天是周一"已經(jīng)緩存過了,由于” + “ 前后的值都是”直接量“,可以直接計算。
例2:
??????? String a1 = "今天是";
??????? String a2 = "周一";
??????? String a3 = "a1 + a2";
??????? String a4 = "a1 + a2";
上面程序輸出為 false。因為? a1,a2 都是變量,他們的值只有在運行時才能確定下來,a3,a4 的值只能在運行時動態(tài)地確定。因此無法直接用緩存的字符串
2.final方法
??? final 修飾的方法不能被重寫(Override)!
?????????? ? 兩同、兩小、一大
???????????? 兩同:方法名,形參列表相同
???????????? 兩小:子類重寫的方法的返回值類型必須比父類方法的返回值類型更小,或相等
???????????????????????? 子類重寫的方法的聲明拋出的異常必須比父類方法聲明拋出的異常更小,或相等
??????????? 一大:子類重寫的方法的訪問權限必須比父類方法的訪問權限更大,或相等
? ? ? 好處:禁止父類方法被重寫,避免了父類被破壞
????? 注意點:
???????????? A。final 與 private 沒有價值!
?????????????????? private 方法它是不能被重寫的。
?????????????????? 因此再用 final 修飾 private 方法沒有太大的實際意義
3.final 類
??????? final 類不能有子類
??????? final 類比較安全
???????????????? ——? 就是為了更加的安全。由于它沒有子類,它的方法、Field 就可以更好的被保護。
典型的,Java 中包含String、Math、所有包裝類,都是 final 類。
abstract 修飾符
????? 修飾類或方法
????? 抽象類:使用 abstract 修飾的類就是抽象類。
?????????????????? 【有得有失】:??? ? 得:增加了一個功能,可以包含抽象方法。
??????????????????????????????????????? ? ? ? ??? 失:不能創(chuàng)建實例。
????????????????????? 其他的,普通類可以有的,抽象都可以有。??
??? 抽象類的三個注意點:
? ? ? ? ? ? A。【雖然抽象類不能創(chuàng)建實例,但它依然有構造器,
???????????????????? 它的構造器主要是供其子類的構造器調用】
??????????? B。【抽象類完全可以沒有抽象方法】
??????????? C。【抽象類總是不能創(chuàng)建實例的,即使它沒有包含抽象方法】
????? 抽象方法:A。使用 abstract 修飾
??????????????????????? B。沒有方法體(有abstract修飾,后面不能加? {~~此為方法體~~})
?????????????????? 注意點:
??????????????????????? A。【抽象方法不能有方法體,花括號部分{}? 】
??????????????????????? B。【只要在方法后出現(xiàn)花括號,即使花括號中沒有任何代碼,也算有方法體】
??????????????????????? C。【abstract 不能與final 同時出現(xiàn):
???????????????????????????????????? 對于abstract 方法而言,該方法應該由子類重寫,final 不允許被重寫,因此不能同時出現(xiàn)。
???????????????????????????????????? 對于abstract 類而言,該類主要用于派生子類,final 類不允許被繼承,因此不能同時出現(xiàn)】
??????????????????? abstract 與 final 【永遠互斥】!
??????????????????????? D。【abstract 與 static 不能同時修飾方法】
? ? ? ? ? ? ? ? ? ? ? ? E。【abstract 和 private 不能同時修飾方法
???????????????????????????????? 原因:private? 意味著該方法不能被子類訪問
??????????????????????????????????????????? abstract 要求方法必須由子類重寫? 兩者沖突】
抽象類的作用:
????????? 主要是與 ”模板模式” 聯(lián)系在一起的。
????????? 需求場景:? 程序需要實現(xiàn)A方法,但A方法又需要調用B方法,
????????????????????????????? B方法在該類中暫時不知道怎么實現(xiàn)(不同的子類對B方法的實現(xiàn)【不同】)
????????????????????????????? 此時就需要把B方法定義成抽象方法。
?????????? 為抽象類定義子類;
????????????????????? A。子類要么為抽象父類的所有抽象方法提供實現(xiàn)
??????????????????????????? 否則你的子類也只能是抽象類
?
以上
寫在最后:
此刻,我有些明白,她口中的所謂的:我覺得你不是我想要的那種愛情了。不是她變心了,而是我自己一直處于一種病態(tài),總是一味的覺得愛你就要給你最好的,毫無底線,逆來順受,對方說什么就是什么,對方要什么就滿足什么,對方生氣了TA忍,對方需要TA的時候就理TA,不需要TA的時候就像空氣一樣對待。這種情況在于,喜歡多的那一方心態(tài)已經(jīng)失衡,潛意識認為我在乎TA,我不能惹TA生氣,如果TA生氣,那么我們就有分手的危險。殊不知,越是這么卑微,越是這么低下,對方越來不起你,也就越有恃無恐。真正的愛情是建立在雙方平等的基礎上的,兩情相悅才是愛情長久的保障。現(xiàn)實生活中很多人遇到TA說沒感覺了,就以為自己對TA還不夠好,接著就是比以前對TA更好更卑微,結果通常讓對方更厭煩。這個問題的根本原因在于:你的魅力下降到TA難以感興趣的地步。
其實,這個問題她是給我說過的,但是我卻不以為意,或者說,我是誤解了,沒有認識到本質。現(xiàn)在,竟然有些豁然開朗。好在我現(xiàn)在認識到也不遲,雖然她昨晚和我真誠的坦言讓我很難過,她說,她覺得她對我的愛配不上我對她的愛,她覺得她是個壞女孩,哈哈,這個傻瓜,其實并不是她的問題,是我對她的愛陷入了誤區(qū),只是她也不知道這是什么誤區(qū),其實她的內心里還是愛我的,至少她對說出了她的內心想法,她告訴我,如果你不想分手我們就繼續(xù)好著吧,兩個小時之前,我還一直在想,有意義嗎,現(xiàn)在看來,很有意義,她是個傻不列顛的小可耐那,我怎么忍心讓她來承認她是個壞壞的花心姑涼那。但是現(xiàn)在的這些想法,我暫時不打算告訴她,我也早就給她說過,愛情也是需要適當?shù)暮亲o的,現(xiàn)在,我將嘗試用正確的方式來悉心呵護我們的愛情,請你期待吧,當然,不會是很刻意的維護,是建立在彼此都相處的很舒服的基礎上。