目錄:
面向?qū)ο蟮娜筇卣鳎悍庋b、繼承、多態(tài)
包
方法重寫
super
instanceof
面向?qū)ο蟮娜筇卣鳎悍庋b、繼承、多態(tài)
封裝
??? —? 合理隱藏(private)
??? —? 合理暴露(protected、public)
隱藏不想被外界操作的field、方法、構(gòu)造器
暴露一般就是希望給別人調(diào)用的方法。
封裝的目的:A。簡化編程
???????????????????? B。能更好的保證對象的完整性
為了實現(xiàn)隱藏,我們有 4 個修飾符
??? private ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? —? 當(dāng)前類訪問權(quán)限
??? 沒有訪問權(quán)限修飾符 ? ? ? ? ? ?? —? 包訪問權(quán)限
??? protected?????????????????????????????? —? 子類訪問權(quán)限
??? public??????????????????????????????????? —? 公共訪問權(quán)限

private ? → ? 默認(rèn)訪問權(quán)限 ? → ? protected ? → ? public
private?? ? ? ? ?? —??? 專門用于隱藏field
public? ? ? ? ? ?? —??? 專門用于暴露方法
protected? ? ?? —? ? protected 修飾的方法,通常是希望被它子類訪問
默認(rèn)?????????????? —??? 希望在同一個包中被訪問的成分

局部變量??? —??? 它僅在方法內(nèi)有效,甚至僅在代碼塊內(nèi)有效
????????????????????????? 它的作用域本身就小的可憐。連方法都出不了
????????????????????????? 所以它用訪問權(quán)限修飾符,都是多余
繼承
繼承表達(dá)的是一種 “是(is a)”的關(guān)系,組合表達(dá)的是一種“有(has a)”的關(guān)系。
Java的繼承?? —? 一個類與另一個類的關(guān)系
??????????????????????????? extends? -? 擴(kuò)展
???????????????????????????? “is a”
???????????????????????????? 類與類之間的關(guān)系:從 “一般到特殊” 的關(guān)系
? ? ? ? ? ? ? ? ? ? ? ? ? ?? 人? →? 老師? → IT老師? →? Java老師
? ? ? ? ? ? ? ? ? ? ? ? ? ?? 父類(基類、超類)? →? 子類
??? 現(xiàn)實的繼承?? —? 一個實例與另一個實例的關(guān)系。
???????????????? ? ?? ? ? ??? “撈錢”
?? Java 的繼承是? 單繼承,extends 后只有一個父類。
?? 子類繼承了父類,就可以獲得父類的 Field 和方法。
? 如果你定義的Java類沒有顯式指定父類,系統(tǒng)會默認(rèn)讓它繼承 Object 類
? “一切類,都是Object類的子類”
方法重載(Overload):兩同(同一個類,方法名相同),一個不同(形參)
方法重寫(Override,也叫覆蓋):兩同、兩小、一大
????????????? 兩同:方法名,形參列表相同
? ? ? ? ? ? ? 兩小:子類重寫的方法的返回值類型必須比父類方法的返回值類型更小,或相等
? ? ? ? ? ? ? ? ? ? ? ? 子類重寫的方法的聲明拋出的異常必須比父類方法聲明拋出的異常更小,或相等
?? ? ???????? 一大:子類重寫的方法的訪問權(quán)限必須比父類方法的訪問權(quán)限更大,或相等
@Override? // @Override 是讓編譯器執(zhí)行更嚴(yán)格的檢查,要求被修飾的方法,必須是重寫父類的方法
super
??? —? super 限定:強(qiáng)制去父類的方法
??? —? super調(diào)用:用于顯式調(diào)用父類的構(gòu)造器
??? 規(guī)則:子類的構(gòu)造器【總會】調(diào)用父類的構(gòu)造器【一次】
??????????????? 默認(rèn)的情況下,子類構(gòu)造器會自動調(diào)用父類無參數(shù)的構(gòu)造器
??????????????? 如果希望明確指定子類構(gòu)造器調(diào)用父類的哪個構(gòu)造器,可用super (參數(shù))來調(diào)用
????????? super 調(diào)用必須出現(xiàn)在構(gòu)造器第一行
? ? ? ? ? ? ? ? ? ? ? super調(diào)用和this 調(diào)用都必須出現(xiàn)在構(gòu)造器的第一行。
? ? ? ? ? ? ? ? ? ? ? ? ? ? super調(diào)用和this 調(diào)用不能 同時出現(xiàn)
?????? 注意:
???????????????? 1. 如果既沒有super調(diào)用,也沒有this 調(diào)用
????????????????????? 子類構(gòu)造器會自動先調(diào)用父類無參數(shù)的構(gòu)造器
? ? ? ? ? ? ? ? 2.如果有super調(diào)用
? ? ? ? ? ? ? ? ? ??? 子類構(gòu)造器會根據(jù)super 調(diào)用傳入的參數(shù)去調(diào)用父類對應(yīng)的構(gòu)造器
??????????????? 3.如果有this 調(diào)用
????????????????????? 子類構(gòu)造器A會先找this 調(diào)用所對應(yīng)類中被重載的構(gòu)造器B。
多態(tài)(Ploymorphism)
由于有如下所示關(guān)系:
??? 父類到子類的關(guān)系:? 從一般到特殊的關(guān)系。
???? Animal a = new Wolf();
A. 第一個結(jié)論:【子類的實例,完全可以當(dāng)作父類對象使用】
??????????????????????????? 父類的引用變量,完全可以指向子類的實例。
多態(tài): 同一個類型的變量,在執(zhí)行同一個方法時,表現(xiàn)出多種行為特征
態(tài)? —? 行為
??????????? 多態(tài)增加了Java語言的靈活性,也是和設(shè)計模式緊密相連的。
??????????? Java 的引用變量有兩個類型:
??????????????????? 編譯時類型:由聲明它的類型來決定
??????????????????? 運行時類型:由該引用變量實際所指向的對象來決定。
????????? 當(dāng)我們【調(diào)用】引用變量時,它總是呈現(xiàn)出它的【運行時類型】的行為特征。
????????? 在編譯階段,編譯器并不知道引用變量實際所引用的對象的類型
?????????????????????????????? 編譯器只知道它的編譯時類型
??? 強(qiáng)制類型轉(zhuǎn)換的運算符是(類型)
??? 1.基本類型之間(除了boolean 之外),都可以進(jìn)行轉(zhuǎn)換
??? 2.引用類型之間,只能在具有繼承關(guān)系的兩個類型之間轉(zhuǎn)換
多態(tài) (包含強(qiáng)制類型轉(zhuǎn)換)? 程序 及 運行結(jié)果:
class Person
{
??? public void work()
??? {
?? ? ?? System.out.println("辛勤工作");
??? }
}
class Farmer extends Person
{
??? @Override
??? public void work()
??? {
??????? System.out.println("鋤禾日當(dāng)午");
??? }
}
class Gongpu extends Person
{
??? @Override
??? public void work()
??? {
? ? ??? System.out.println("drinking");
??? }
??? public void drink()
??? {
? ? ? ? System.out.println("我要玩游戲");
? ?? ?? System.out.println("想多了,好好學(xué)習(xí)");
??? }
}
public class 多態(tài)
{
??? public static void main(String[] args)
??? {
??? /*
??? 多態(tài):同一個類型多個變量,在執(zhí)行同一個方法時,
??? 呈現(xiàn)出多種行為特征 — 這就是多態(tài)。
??? */
??? Person p1 = new Person();
??? p1.work();
??? // 子類的實例,完全可以當(dāng)作父類對象使用
??? Person p2 = new Farmer();
??? p2.work();
??? // 子類的實例,完全可以當(dāng)作父類對象使用
??? Person p3 = new Gongpu();
??? p3.work();
??? // 編譯階段,編譯器只知道它的編譯時類型是Person
??? // 而Person類沒有drink方法,所以下面代碼是錯的
??? // p3.drink(); // 在編譯階段,編譯器認(rèn)為p3是Person類型,而非Gongpu
??? // 強(qiáng)制類型轉(zhuǎn)換
??? // gp和p3指向同一個對象,但gp 的編譯時類型變成了Gongpu
??? Gongpu gp = (Gongpu)p3;
??? gp.drink();
??? }
}

Classcast (類型轉(zhuǎn)換)? 程序 及 運行結(jié)果:
public class Classcast
{
??? public static void main(String[] args)
??? {
??? // "向上轉(zhuǎn)型"
??? Object ob = "Java";
??? /*
??? 1. Object與System之間有繼承關(guān)系,所以可以通過編譯
??? 2. 由于ob運行時類型是String,不是System
??????? 所以強(qiáng)轉(zhuǎn)會引發(fā)ClassCastException
??? */
??? System sys = (System)ob;
??? }
}

instanceof
??????? 判斷前面的變量所引用的對象,是否為后面類型的實例。是返回true,否返回false
? ? ? ? 注意點:instanceof 前面操作數(shù)的類型要么與后面的類相同,要么與后面的類有父子繼承關(guān)系,否則會引起編譯錯誤。
InstanceofTest? 程序 及 運行結(jié)果:
public class InstanceofTest
{
??? public static void main(String[] args)
??? {
? ?? ?? Object obj = "Hi";
? ?? ?? // obj 的編譯時類型(Object) 與 String有繼承關(guān)系
? ?? ?? // 因此代碼可以通過編譯
? ?? ?? // 運行時返回true
? ?? ?? System.out.println(obj instanceof String);
? ? ? ? Object ob = new Integer(20);
? ? ? ? // ob 的編譯時類型(Object) 與 String有繼承關(guān)系
? ? ? ? // 因此代碼可以通過編譯
? ?? ?? // 但運行時返回false
? ?? ?? System.out.println(ob instanceof String);
? ?? ?? Integer in = new Integer(30);
? ?? ?? // ob 的編譯時類型(Integer) 與 String沒有繼承關(guān)系
? ?? ?? // 因此代碼編譯就報錯。
? ?? ?? System/out.println(in instanceof String);
??? }
}

Test (到底輸出哪個count,取決于該引用的變量的聲明時的類型) 程序 及 運行結(jié)果:
class A
{
??? int count = 20;
}
class B extends A
{
??? // 子類的count Field 并不會覆蓋父類的count。
??? int count = 200;
}
public class Test
{
??? public static void main(String[] args)
??? {
?? ? ?? A a = new A();
? ? ? ? System.out.println(a.count);
? ?? ?? B b = new B();
? ?? ?? // b所引用的對象有2 個 count Field
? ?? ?? // 到底輸出哪個count,取決于該引用的變量的聲明時的類型
? ?? ?? System.out.println(b.count);
? ? ? ? // 這是典型的“向上轉(zhuǎn)型”
? ?? ?? A ab = b;
? ? ? ? // == 用于判斷兩個引用變量是否指定同一個實例
? ?? ?? // ab所引用的對象有2 個 count
? ?? ?? // 到底輸出哪個count,取決于該引用的變量的聲明時的類型
? ?? ?? System.out.println(ab == b);
? ?? ?? System.out.println(ab.count);
??? }
}


包
包的作用就是“命名空間”的作用。
世界很大,公司很多,不同公司定義的類完全有可能出現(xiàn)同名的情況。
Java 要求,一個類的完整類名,必須是 “包名 + 類名”。
定義包的語法:
package 包1.包2.包.? 包N;
包名的規(guī)則:
一般就是你公司的域名的倒寫
??????????????? —— 由于公司域名都是不可重復(fù)的,這樣就保證不同公司的類的包名不會重復(fù)。
要把一個類放入包中,有兩個要求:
A. 在該類的源代碼中使用package 來聲明包
B. 生成的class 文件必須放在相應(yīng)文件結(jié)構(gòu)下
一旦你為類定義了包后,該類的完整類名,包名 + 類名
當(dāng)我們使用一個類時,包名 + 類名
為了減少每次都寫包名的繁瑣,Java 允許使用 import 來導(dǎo)入包下的類
Eg: import? org.java.test.*;? // 此處的*只能代表該包下所有類
普通的 import 是省略包
JDK 1.5提供的靜態(tài)導(dǎo)入???
????????????????? import static — 導(dǎo)入指定類下的靜態(tài)成員
?????????????????????????????????????????? 從而允許省略類。
******************補(bǔ)充:********************
javac 的 -d 選項:
可以保證把生成 class 文件放到package 所對應(yīng)的文件結(jié)構(gòu)下
***************補(bǔ)充:*********************
目前遇到的三個異常:
1. NullPointerException??????? ——??? 空指針
2.ArrayIndexOutOfBoundsException????? ——??? 數(shù)組越界
3.ClassCastException??????? ——??? 類型轉(zhuǎn)換異常
以上~未完
寫在最后:
當(dāng)初自己買耳機(jī)是為了聽歌,但是買了之后突然發(fā)現(xiàn)就沒怎么聽了,定一個小目標(biāo),每天吃完午飯?zhí)稍谝巫由险J(rèn)真的聽一首歌,什么都不干,聲音開大,閉著眼。暫且就叫做【每天一首歌】吧
【每天一首歌】【結(jié)婚-李志】
朋友圈看到一個小學(xué)同學(xué)發(fā)的,就點開來聽,整個曲風(fēng)有點凄涼?!爸徊贿^是一場生活,只不過是一場命運,只不過是一場游戲”。不太適合現(xiàn)在的我聽~覺得歌曲中傳達(dá)的是一個比較無奈的婚姻,對于我自己的愛情觀來說,我不太可能會陷入這種場景,雖然見過很多文章說過,結(jié)婚了以后就會由愛情轉(zhuǎn)換為親情,那么隨之而來的就不是愛情里的激情了,就變成了生活,會讓你變得乏味,會消磨了你的激情,是柴米油鹽醬醋茶~但是我不是很認(rèn)同,我覺得結(jié)婚就是為了給偉大的愛情一個美好的結(jié)果,不要說我年輕不知愁滋味,這是一種態(tài)度,不管愛情也罷,婚姻也罷,都是要用心來呵護(hù)的,要兩個人一起來運營。好看的皮囊很多,但是有趣的、合得來的靈魂真的可遇不可求~
愿看到本文的你和我都會有個好的結(jié)果~
下午看到初中那群兄弟在聊聚會,周末一起嗨,當(dāng)然我回不去了,突然腦海里冒出一個詞:初心。又不禁想起來自己的初心,竟然驚悚的發(fā)現(xiàn)我其實并沒有一個明確的初心,我不知道初心和人生目標(biāo)有沒有交集。回到最初,我想做一個有價值的人,可是,衡量價值的標(biāo)準(zhǔn)在哪里,這很大很空,沒有實際意義,慢慢的,我覺得自己挺想成為別人眼中的那種:有思想,積極向上,可以用精神思想來感染別人的人,好吧,我承認(rèn)這樣能裝逼~算了,我還是想先變得有錢吧。所謂稀缺,缺少什么在意什么吧,太在意反而得不償失,心境還是有待提升。像三傻大鬧寶萊塢里男一,許是我的畢生所求吧,有著自己熱愛的事業(yè),事業(yè)可以得到認(rèn)同,可以幫助別人,有著好兄弟,有著相愛的女人~
好了,雙手脫離鍵盤,健身去了~