Java的封裝、繼承、多態 包

目錄:

面向對象的三大特征:封裝、繼承、多態

方法重寫

super

instanceof

面向對象的三大特征:封裝、繼承、多態

封裝

??? —? 合理隱藏(private)

??? —? 合理暴露(protected、public)

隱藏不想被外界操作的field、方法、構造器

暴露一般就是希望給別人調用的方法。

封裝的目的:A。簡化編程

???????????????????? B。能更好的保證對象的完整性

為了實現隱藏,我們有 4 個修飾符

??? private ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? —? 當前類訪問權限

??? 沒有訪問權限修飾符 ? ? ? ? ? ?? —? 包訪問權限

??? protected?????????????????????????????? —? 子類訪問權限

??? public??????????????????????????????????? —? 公共訪問權限


private ? → ? 默認訪問權限 ? → ? protected ? → ? public

private?? ? ? ? ?? —??? 專門用于隱藏field

public? ? ? ? ? ?? —??? 專門用于暴露方法

protected? ? ?? —? ? protected 修飾的方法,通常是希望被它子類訪問

默認?????????????? —??? 希望在同一個包中被訪問的成分


java訪問權限修飾符


局部變量??? —??? 它僅在方法內有效,甚至僅在代碼塊內有效

????????????????????????? 它的作用域本身就小的可憐。連方法都出不了

????????????????????????? 所以它用訪問權限修飾符,都是多余

繼承

繼承表達的是一種 “是(is a)”的關系,組合表達的是一種“有(has a)”的關系。

Java的繼承?? —? 一個類與另一個類的關系

??????????????????????????? extends? -? 擴展

???????????????????????????? “is a”

???????????????????????????? 類與類之間的關系:從 “一般到特殊” 的關系

? ? ? ? ? ? ? ? ? ? ? ? ? ?? 人? →? 老師? → IT老師? →? Java老師

? ? ? ? ? ? ? ? ? ? ? ? ? ?? 父類(基類、超類)? →? 子類

??? 現實的繼承?? —? 一個實例與另一個實例的關系。

???????????????? ? ?? ? ? ??? “撈錢”

?? Java 的繼承是? 單繼承,extends 后只有一個父類。

?? 子類繼承了父類,就可以獲得父類的 Field 和方法。

? 如果你定義的Java類沒有顯式指定父類,系統會默認讓它繼承 Object 類

? “一切類,都是Object類的子類”

方法重載(Overload):兩同(同一個類,方法名相同),一個不同(形參)

方法重寫(Override,也叫覆蓋):兩同、兩小、一大

????????????? 兩同:方法名,形參列表相同

? ? ? ? ? ? ? 兩小:子類重寫的方法的返回值類型必須比父類方法的返回值類型更小,或相等

? ? ? ? ? ? ? ? ? ? ? ? 子類重寫的方法的聲明拋出的異常必須比父類方法聲明拋出的異常更小,或相等

?? ? ???????? 一大:子類重寫的方法的訪問權限必須比父類方法的訪問權限更大,或相等

@Override? // @Override 是讓編譯器執行更嚴格的檢查,要求被修飾的方法,必須是重寫父類的方法

super

??? —? super 限定:強制去父類的方法

??? —? super調用:用于顯式調用父類的構造器

??? 規則:子類的構造器【總會】調用父類的構造器【一次】

??????????????? 默認的情況下,子類構造器會自動調用父類無參數的構造器

??????????????? 如果希望明確指定子類構造器調用父類的哪個構造器,可用super (參數)來調用

????????? super 調用必須出現在構造器第一行

? ? ? ? ? ? ? ? ? ? ? super調用和this 調用都必須出現在構造器的第一行。
? ? ? ? ? ? ? ? ? ? ? ? ? ? super調用和this 調用不能 同時出現

?????? 注意:

???????????????? 1. 如果既沒有super調用,也沒有this 調用

????????????????????? 子類構造器會自動先調用父類無參數的構造器

? ? ? ? ? ? ? ? 2.如果有super調用

? ? ? ? ? ? ? ? ? ??? 子類構造器會根據super 調用傳入的參數去調用父類對應的構造器

??????????????? 3.如果有this 調用

????????????????????? 子類構造器A會先找this 調用所對應類中被重載的構造器B。

多態(Ploymorphism)

由于有如下所示關系:

??? 父類到子類的關系:? 從一般到特殊的關系。

???? Animal a = new Wolf();

A. 第一個結論:【子類的實例,完全可以當作父類對象使用】

??????????????????????????? 父類的引用變量,完全可以指向子類的實例。

多態 同一個類型的變量,在執行同一個方法時,表現出多種行為特征

態? —? 行為

??????????? 多態增加了Java語言的靈活性,也是和設計模式緊密相連的。

??????????? Java 的引用變量有兩個類型:

??????????????????? 編譯時類型:由聲明它的類型來決定

??????????????????? 運行時類型:由該引用變量實際所指向的對象來決定。

????????? 當我們【調用】引用變量時,它總是呈現出它的【運行時類型】的行為特征。

????????? 在編譯階段,編譯器并不知道引用變量實際所引用的對象的類型

?????????????????????????????? 編譯器只知道它的編譯時類型

??? 強制類型轉換的運算符是(類型)

??? 1.基本類型之間(除了boolean 之外),都可以進行轉換

??? 2.引用類型之間,只能在具有繼承關系的兩個類型之間轉換

多態 (包含強制類型轉換)? 程序 及 運行結果:

class Person

{

??? public void work()

??? {

?? ? ?? System.out.println("辛勤工作");

??? }

}

class Farmer extends Person

{

??? @Override

??? public void work()

??? {

??????? System.out.println("鋤禾日當午");

??? }

}

class Gongpu extends Person

{

??? @Override

??? public void work()

??? {

? ? ??? System.out.println("drinking");

??? }

??? public void drink()

??? {

? ? ? ? System.out.println("我要玩游戲");

? ?? ?? System.out.println("想多了,好好學習");

??? }

}

public class 多態

{

??? public static void main(String[] args)

??? {

??? /*

??? 多態:同一個類型多個變量,在執行同一個方法時,

??? 呈現出多種行為特征 — 這就是多態。

??? */

??? Person p1 = new Person();

??? p1.work();

??? // 子類的實例,完全可以當作父類對象使用

??? Person p2 = new Farmer();

??? p2.work();

??? // 子類的實例,完全可以當作父類對象使用

??? Person p3 = new Gongpu();

??? p3.work();

??? // 編譯階段,編譯器只知道它的編譯時類型是Person

??? // 而Person類沒有drink方法,所以下面代碼是錯的

??? // p3.drink(); // 在編譯階段,編譯器認為p3是Person類型,而非Gongpu


??? // 強制類型轉換

??? // gp和p3指向同一個對象,但gp 的編譯時類型變成了Gongpu

??? Gongpu gp = (Gongpu)p3;

??? gp.drink();

??? }

}

多態

Classcast (類型轉換)? 程序 及 運行結果:

public class Classcast

{

??? public static void main(String[] args)

??? {

??? // "向上轉型"

??? Object ob = "Java";

??? /*

??? 1. Object與System之間有繼承關系,所以可以通過編譯

??? 2. 由于ob運行時類型是String,不是System

??????? 所以強轉會引發ClassCastException

??? */

??? System sys = (System)ob;

??? }

}

Classcast


instanceof

??????? 判斷前面的變量所引用的對象,是否為后面類型的實例。是返回true,否返回false

? ? ? ? 注意點:instanceof 前面操作數的類型要么與后面的類相同,要么與后面的類有父子繼承關系,否則會引起編譯錯誤。

InstanceofTest? 程序 及 運行結果:

public class InstanceofTest

{

??? public static void main(String[] args)

??? {

? ?? ?? Object obj = "Hi";

? ?? ?? // obj 的編譯時類型(Object) 與 String有繼承關系

? ?? ?? // 因此代碼可以通過編譯

? ?? ?? // 運行時返回true

? ?? ?? System.out.println(obj instanceof String);


? ? ? ? Object ob = new Integer(20);

? ? ? ? // ob 的編譯時類型(Object) 與 String有繼承關系

? ? ? ? // 因此代碼可以通過編譯

? ?? ?? // 但運行時返回false

? ?? ?? System.out.println(ob instanceof String);


? ?? ?? Integer in = new Integer(30);

? ?? ?? // ob 的編譯時類型(Integer) 與 String沒有繼承關系

? ?? ?? // 因此代碼編譯就報錯。

? ?? ?? System/out.println(in instanceof String);

??? }

}

InstanceofTest

Test (到底輸出哪個count,取決于該引用的變量的聲明時的類型) 程序 及 運行結果:

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);

? ? ? ? // 這是典型的“向上轉型”

? ?? ?? A ab = b;

? ? ? ? // == 用于判斷兩個引用變量是否指定同一個實例

? ?? ?? // ab所引用的對象有2 個 count

? ?? ?? // 到底輸出哪個count,取決于該引用的變量的聲明時的類型

? ?? ?? System.out.println(ab == b);

? ?? ?? System.out.println(ab.count);

??? }

}

內存圖


Test運行結果






包的作用就是“命名空間”的作用。

世界很大,公司很多,不同公司定義的類完全有可能出現同名的情況。

Java 要求,一個類的完整類名,必須是 “包名 + 類名”。

定義包的語法:

package 包1.包2.包.? 包N;

包名的規則:

一般就是你公司的域名的倒寫

??????????????? —— 由于公司域名都是不可重復的,這樣就保證不同公司的類的包名不會重復。

要把一個類放入包中,有兩個要求:

A. 在該類的源代碼中使用package 來聲明包

B. 生成的class 文件必須放在相應文件結構下


一旦你為類定義了包后,該類的完整類名,包名 + 類名

當我們使用一個類時,包名 + 類名

為了減少每次都寫包名的繁瑣,Java 允許使用 import 來導入包下的類

Eg: import? org.java.test.*;? // 此處的*只能代表該包下所有類

普通的 import 是省略包

JDK 1.5提供的靜態導入???

????????????????? import static — 導入指定類下的靜態成員

?????????????????????????????????????????? 從而允許省略類。

******************補充:********************

javac 的 -d 選項:

可以保證把生成 class 文件放到package 所對應的文件結構下

***************補充:*********************

目前遇到的三個異常:

1. NullPointerException??????? ——??? 空指針

2.ArrayIndexOutOfBoundsException????? ——??? 數組越界

3.ClassCastException??????? ——??? 類型轉換異常




以上~未完


寫在最后:

當初自己買耳機是為了聽歌,但是買了之后突然發現就沒怎么聽了,定一個小目標,每天吃完午飯躺在椅子上認真的聽一首歌,什么都不干,聲音開大,閉著眼。暫且就叫做【每天一首歌】吧

【每天一首歌】【結婚-李志】

朋友圈看到一個小學同學發的,就點開來聽,整個曲風有點凄涼。“只不過是一場生活,只不過是一場命運,只不過是一場游戲”。不太適合現在的我聽~覺得歌曲中傳達的是一個比較無奈的婚姻,對于我自己的愛情觀來說,我不太可能會陷入這種場景,雖然見過很多文章說過,結婚了以后就會由愛情轉換為親情,那么隨之而來的就不是愛情里的激情了,就變成了生活,會讓你變得乏味,會消磨了你的激情,是柴米油鹽醬醋茶~但是我不是很認同,我覺得結婚就是為了給偉大的愛情一個美好的結果,不要說我年輕不知愁滋味,這是一種態度,不管愛情也罷,婚姻也罷,都是要用心來呵護的,要兩個人一起來運營。好看的皮囊很多,但是有趣的、合得來的靈魂真的可遇不可求~

愿看到本文的你和我都會有個好的結果~

下午看到初中那群兄弟在聊聚會,周末一起嗨,當然我回不去了,突然腦海里冒出一個詞:初心。又不禁想起來自己的初心,竟然驚悚的發現我其實并沒有一個明確的初心,我不知道初心和人生目標有沒有交集。回到最初,我想做一個有價值的人,可是,衡量價值的標準在哪里,這很大很空,沒有實際意義,慢慢的,我覺得自己挺想成為別人眼中的那種:有思想,積極向上,可以用精神思想來感染別人的人,好吧,我承認這樣能裝逼~算了,我還是想先變得有錢吧。所謂稀缺,缺少什么在意什么吧,太在意反而得不償失,心境還是有待提升。像三傻大鬧寶萊塢里男一,許是我的畢生所求吧,有著自己熱愛的事業,事業可以得到認同,可以幫助別人,有著好兄弟,有著相愛的女人~

好了,雙手脫離鍵盤,健身去了~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,778評論 18 399
  • (一)Java部分 1、列舉出JAVA中6個比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨云閱讀 7,143評論 0 62
  • 小編費力收集:給你想要的面試集合 1.C++或Java中的異常處理機制的簡單原理和應用。 當JAVA程序違反了JA...
    八爺君閱讀 4,673評論 1 114
  • 當夜,許栗沒有回家。 我任由他不斷索取,一次又一次。他就像是一只饕餮,永遠不知滿足。 當我實在是累到不行的時候,他...
    蘇小六Six閱讀 189評論 0 1
  • 天外一雙指向光明的手 在夜的脖子上勒出月亮 夜之巨人,粗粗地喘氣 很快就已無聲無息 路過的村莊都在籌辦葬禮 火車馱...
    左小事界閱讀 144評論 0 0