目錄:
面向?qū)ο蟮娜筇卣鳎悍庋b蛀蜜、繼承、多態(tài)
包
方法重寫
super
instanceof
面向?qū)ο蟮娜筇卣鳎悍庋b增蹭、繼承滴某、多態(tài)
封裝
??? —? 合理隱藏(private)
??? —? 合理暴露(protected、public)
隱藏不想被外界操作的field滋迈、方法霎奢、構(gòu)造器
暴露一般就是希望給別人調(diào)用的方法。
封裝的目的:A饼灿。簡化編程
???????????????????? B幕侠。能更好的保證對(duì)象的完整性
為了實(shí)現(xiàn)隱藏,我們有 4 個(gè)修飾符
??? 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)?????????????? —??? 希望在同一個(gè)包中被訪問的成分
局部變量??? —??? 它僅在方法內(nèi)有效晤硕,甚至僅在代碼塊內(nèi)有效
????????????????????????? 它的作用域本身就小的可憐悼潭。連方法都出不了
????????????????????????? 所以它用訪問權(quán)限修飾符,都是多余
繼承
繼承表達(dá)的是一種 “是(is a)”的關(guān)系舞箍,組合表達(dá)的是一種“有(has a)”的關(guān)系舰褪。
Java的繼承?? —? 一個(gè)類與另一個(gè)類的關(guān)系
??????????????????????????? extends? -? 擴(kuò)展
???????????????????????????? “is a”
???????????????????????????? 類與類之間的關(guān)系:從 “一般到特殊” 的關(guān)系
? ? ? ? ? ? ? ? ? ? ? ? ? ?? 人? →? 老師? → IT老師? →? Java老師
? ? ? ? ? ? ? ? ? ? ? ? ? ?? 父類(基類、超類)? →? 子類
??? 現(xiàn)實(shí)的繼承?? —? 一個(gè)實(shí)例與另一個(gè)實(shí)例的關(guān)系疏橄。
???????????????? ? ?? ? ? ??? “撈錢”
?? Java 的繼承是? 單繼承占拍,extends 后只有一個(gè)父類。
?? 子類繼承了父類软族,就可以獲得父類的 Field 和方法刷喜。
? 如果你定義的Java類沒有顯式指定父類,系統(tǒng)會(huì)默認(rèn)讓它繼承 Object 類
? “一切類立砸,都是Object類的子類”
方法重載(Overload):兩同(同一個(gè)類掖疮,方法名相同),一個(gè)不同(形參)
方法重寫(Override颗祝,也叫覆蓋):兩同浊闪、兩小、一大
????????????? 兩同:方法名螺戳,形參列表相同
? ? ? ? ? ? ? 兩懈楸觥:子類重寫的方法的返回值類型必須比父類方法的返回值類型更小,或相等
? ? ? ? ? ? ? ? ? ? ? ? 子類重寫的方法的聲明拋出的異常必須比父類方法聲明拋出的異常更小倔幼,或相等
?? ? ???????? 一大:子類重寫的方法的訪問權(quán)限必須比父類方法的訪問權(quán)限更大盖腿,或相等
@Override? // @Override 是讓編譯器執(zhí)行更嚴(yán)格的檢查,要求被修飾的方法损同,必須是重寫父類的方法
super
??? —? super 限定:強(qiáng)制去父類的方法
??? —? super調(diào)用:用于顯式調(diào)用父類的構(gòu)造器
??? 規(guī)則:子類的構(gòu)造器【總會(huì)】調(diào)用父類的構(gòu)造器【一次】
??????????????? 默認(rèn)的情況下翩腐,子類構(gòu)造器會(huì)自動(dòng)調(diào)用父類無參數(shù)的構(gòu)造器
??????????????? 如果希望明確指定子類構(gòu)造器調(diào)用父類的哪個(gè)構(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)用不能 同時(shí)出現(xiàn)
?????? 注意:
???????????????? 1. 如果既沒有super調(diào)用茂卦,也沒有this 調(diào)用
????????????????????? 子類構(gòu)造器會(huì)自動(dòng)先調(diào)用父類無參數(shù)的構(gòu)造器
? ? ? ? ? ? ? ? 2.如果有super調(diào)用
? ? ? ? ? ? ? ? ? ??? 子類構(gòu)造器會(huì)根據(jù)super 調(diào)用傳入的參數(shù)去調(diào)用父類對(duì)應(yīng)的構(gòu)造器
??????????????? 3.如果有this 調(diào)用
????????????????????? 子類構(gòu)造器A會(huì)先找this 調(diào)用所對(duì)應(yīng)類中被重載的構(gòu)造器B。
多態(tài)(Ploymorphism)
由于有如下所示關(guān)系:
??? 父類到子類的關(guān)系:? 從一般到特殊的關(guān)系组哩。
???? Animal a = new Wolf();
A. 第一個(gè)結(jié)論:【子類的實(shí)例等龙,完全可以當(dāng)作父類對(duì)象使用】
??????????????????????????? 父類的引用變量,完全可以指向子類的實(shí)例伶贰。
多態(tài): 同一個(gè)類型的變量蛛砰,在執(zhí)行同一個(gè)方法時(shí),表現(xiàn)出多種行為特征
態(tài)? —? 行為
??????????? 多態(tài)增加了Java語言的靈活性幕袱,也是和設(shè)計(jì)模式緊密相連的暴备。
??????????? Java 的引用變量有兩個(gè)類型:
??????????????????? 編譯時(shí)類型:由聲明它的類型來決定
??????????????????? 運(yùn)行時(shí)類型:由該引用變量實(shí)際所指向的對(duì)象來決定。
????????? 當(dāng)我們【調(diào)用】引用變量時(shí)们豌,它總是呈現(xiàn)出它的【運(yùn)行時(shí)類型】的行為特征涯捻。
????????? 在編譯階段,編譯器并不知道引用變量實(shí)際所引用的對(duì)象的類型
?????????????????????????????? 編譯器只知道它的編譯時(shí)類型
??? 強(qiáng)制類型轉(zhuǎn)換的運(yùn)算符是(類型)
??? 1.基本類型之間(除了boolean 之外)望迎,都可以進(jìn)行轉(zhuǎn)換
??? 2.引用類型之間障癌,只能在具有繼承關(guān)系的兩個(gè)類型之間轉(zhuǎn)換
多態(tài) (包含強(qiáng)制類型轉(zhuǎn)換)? 程序 及 運(yù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):同一個(gè)類型多個(gè)變量辩尊,在執(zhí)行同一個(gè)方法時(shí)涛浙,
??? 呈現(xiàn)出多種行為特征 — 這就是多態(tài)。
??? */
??? Person p1 = new Person();
??? p1.work();
??? // 子類的實(shí)例摄欲,完全可以當(dāng)作父類對(duì)象使用
??? Person p2 = new Farmer();
??? p2.work();
??? // 子類的實(shí)例轿亮,完全可以當(dāng)作父類對(duì)象使用
??? Person p3 = new Gongpu();
??? p3.work();
??? // 編譯階段,編譯器只知道它的編譯時(shí)類型是Person
??? // 而Person類沒有drink方法胸墙,所以下面代碼是錯(cuò)的
??? // p3.drink(); // 在編譯階段我注,編譯器認(rèn)為p3是Person類型,而非Gongpu
??? // 強(qiáng)制類型轉(zhuǎn)換
??? // gp和p3指向同一個(gè)對(duì)象迟隅,但gp 的編譯時(shí)類型變成了Gongpu
??? Gongpu gp = (Gongpu)p3;
??? gp.drink();
??? }
}
Classcast (類型轉(zhuǎn)換)? 程序 及 運(yùn)行結(jié)果:
public class Classcast
{
??? public static void main(String[] args)
??? {
??? // "向上轉(zhuǎn)型"
??? Object ob = "Java";
??? /*
??? 1. Object與System之間有繼承關(guān)系但骨,所以可以通過編譯
??? 2. 由于ob運(yùn)行時(shí)類型是String,不是System
??????? 所以強(qiáng)轉(zhuǎn)會(huì)引發(fā)ClassCastException
??? */
??? System sys = (System)ob;
??? }
}
instanceof
??????? 判斷前面的變量所引用的對(duì)象智袭,是否為后面類型的實(shí)例奔缠。是返回true,否返回false
? ? ? ? 注意點(diǎn):instanceof 前面操作數(shù)的類型要么與后面的類相同吼野,要么與后面的類有父子繼承關(guān)系校哎,否則會(huì)引起編譯錯(cuò)誤。
InstanceofTest? 程序 及 運(yùn)行結(jié)果:
public class InstanceofTest
{
??? public static void main(String[] args)
??? {
? ?? ?? Object obj = "Hi";
? ?? ?? // obj 的編譯時(shí)類型(Object) 與 String有繼承關(guān)系
? ?? ?? // 因此代碼可以通過編譯
? ?? ?? // 運(yùn)行時(shí)返回true
? ?? ?? System.out.println(obj instanceof String);
? ? ? ? Object ob = new Integer(20);
? ? ? ? // ob 的編譯時(shí)類型(Object) 與 String有繼承關(guān)系
? ? ? ? // 因此代碼可以通過編譯
? ?? ?? // 但運(yùn)行時(shí)返回false
? ?? ?? System.out.println(ob instanceof String);
? ?? ?? Integer in = new Integer(30);
? ?? ?? // ob 的編譯時(shí)類型(Integer) 與 String沒有繼承關(guān)系
? ?? ?? // 因此代碼編譯就報(bào)錯(cuò)瞳步。
? ?? ?? System/out.println(in instanceof String);
??? }
}
Test (到底輸出哪個(gè)count闷哆,取決于該引用的變量的聲明時(shí)的類型) 程序 及 運(yùn)行結(jié)果:
class A
{
??? int count = 20;
}
class B extends A
{
??? // 子類的count Field 并不會(huì)覆蓋父類的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所引用的對(duì)象有2 個(gè) count Field
? ?? ?? // 到底輸出哪個(gè)count谚攒,取決于該引用的變量的聲明時(shí)的類型
? ?? ?? System.out.println(b.count);
? ? ? ? // 這是典型的“向上轉(zhuǎn)型”
? ?? ?? A ab = b;
? ? ? ? // == 用于判斷兩個(gè)引用變量是否指定同一個(gè)實(shí)例
? ?? ?? // ab所引用的對(duì)象有2 個(gè) count
? ?? ?? // 到底輸出哪個(gè)count阳准,取決于該引用的變量的聲明時(shí)的類型
? ?? ?? System.out.println(ab == b);
? ?? ?? System.out.println(ab.count);
??? }
}
包
包的作用就是“命名空間”的作用。
世界很大馏臭,公司很多野蝇,不同公司定義的類完全有可能出現(xiàn)同名的情況。
Java 要求括儒,一個(gè)類的完整類名绕沈,必須是 “包名 + 類名”。
定義包的語法:
package 包1.包2.包.? 包N帮寻;
包名的規(guī)則:
一般就是你公司的域名的倒寫
??????????????? —— 由于公司域名都是不可重復(fù)的乍狐,這樣就保證不同公司的類的包名不會(huì)重復(fù)。
要把一個(gè)類放入包中固逗,有兩個(gè)要求:
A. 在該類的源代碼中使用package 來聲明包
B. 生成的class 文件必須放在相應(yīng)文件結(jié)構(gòu)下
一旦你為類定義了包后浅蚪,該類的完整類名藕帜,包名 + 類名
當(dāng)我們使用一個(gè)類時(shí),包名 + 類名
為了減少每次都寫包名的繁瑣惜傲,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 選項(xiàng):
可以保證把生成 class 文件放到package 所對(duì)應(yīng)的文件結(jié)構(gòu)下
***************補(bǔ)充:*********************
目前遇到的三個(gè)異常:
1. NullPointerException??????? ——??? 空指針
2.ArrayIndexOutOfBoundsException????? ——??? 數(shù)組越界
3.ClassCastException??????? ——??? 類型轉(zhuǎn)換異常
以上~未完
寫在最后:
當(dāng)初自己買耳機(jī)是為了聽歌,但是買了之后突然發(fā)現(xiàn)就沒怎么聽了盗誊,定一個(gè)小目標(biāo)时甚,每天吃完午飯?zhí)稍谝巫由险J(rèn)真的聽一首歌,什么都不干哈踱,聲音開大荒适,閉著眼。暫且就叫做【每天一首歌】吧
【每天一首歌】【結(jié)婚-李志】
朋友圈看到一個(gè)小學(xué)同學(xué)發(fā)的开镣,就點(diǎn)開來聽刀诬,整個(gè)曲風(fēng)有點(diǎn)凄涼⊙谱樱“只不過是一場生活舅列,只不過是一場命運(yùn),只不過是一場游戲”卧蜓。不太適合現(xiàn)在的我聽~覺得歌曲中傳達(dá)的是一個(gè)比較無奈的婚姻帐要,對(duì)于我自己的愛情觀來說,我不太可能會(huì)陷入這種場景弥奸,雖然見過很多文章說過榨惠,結(jié)婚了以后就會(huì)由愛情轉(zhuǎn)換為親情,那么隨之而來的就不是愛情里的激情了盛霎,就變成了生活赠橙,會(huì)讓你變得乏味,會(huì)消磨了你的激情愤炸,是柴米油鹽醬醋茶~但是我不是很認(rèn)同期揪,我覺得結(jié)婚就是為了給偉大的愛情一個(gè)美好的結(jié)果,不要說我年輕不知愁滋味规个,這是一種態(tài)度凤薛,不管愛情也罷,婚姻也罷诞仓,都是要用心來呵護(hù)的缤苫,要兩個(gè)人一起來運(yùn)營。好看的皮囊很多墅拭,但是有趣的活玲、合得來的靈魂真的可遇不可求~
愿看到本文的你和我都會(huì)有個(gè)好的結(jié)果~
下午看到初中那群兄弟在聊聚會(huì),周末一起嗨,當(dāng)然我回不去了舒憾,突然腦海里冒出一個(gè)詞:初心镀钓。又不禁想起來自己的初心,竟然驚悚的發(fā)現(xiàn)我其實(shí)并沒有一個(gè)明確的初心珍剑,我不知道初心和人生目標(biāo)有沒有交集掸宛∷缆剑回到最初招拙,我想做一個(gè)有價(jià)值的人,可是措译,衡量價(jià)值的標(biāo)準(zhǔn)在哪里别凤,這很大很空,沒有實(shí)際意義领虹,慢慢的规哪,我覺得自己挺想成為別人眼中的那種:有思想,積極向上塌衰,可以用精神思想來感染別人的人诉稍,好吧,我承認(rèn)這樣能裝逼~算了最疆,我還是想先變得有錢吧杯巨。所謂稀缺,缺少什么在意什么吧努酸,太在意反而得不償失服爷,心境還是有待提升。像三傻大鬧寶萊塢里男一获诈,許是我的畢生所求吧仍源,有著自己熱愛的事業(yè),事業(yè)可以得到認(rèn)同舔涎,可以幫助別人笼踩,有著好兄弟,有著相愛的女人~
好了亡嫌,雙手脫離鍵盤嚎于,健身去了~