Java封裝繼承多態

一.成員變量與局部變量的區別

成員變量:在類中定義,用來描述對象將要有什么(屬性)。可被本類方法和其他跟當前類有關系的方法使用。
局部變量:在類的方法中定義,在方法中臨時保存數據。(只能在當前的方法中使用)

區別:

  1. 作用域不同:局部變量的作用域僅限于定義它的方法,成員變量的作用域在整個類內部都是可見的。
  2. 初始值不同:java會給成員變量一個初始值,java不會給局部變臉賦予初始值。
  3. 在同一個方法中,不允許有同名局部變量;在不同的方法中,可以有同名局部變量。
  4. 兩類變量同名時,局部變量具有更高的優先級。

二.構造方法

構造方法是定義在Java類中的一個用來初始化對象的方法,構造方法與類同名且沒有返回值。
構造方法的語法格式:
public 構造方法名(){
//初始化代碼
}
public后面沒有返回值類型,構造方法名與類名相同,括號內可以指定參數。
如果我們沒有指定一個無參的構造方法,那系統會幫我們自動生成一個無參的構造方法,如果我們對系統生成的無參構造方法不滿意,可以自定義一個無參的構造方法。
也就是說當我們創建對象的時候,其實我們執行的是構造方法。


三.Java 中的 static 使用之靜態變量

Java 中被 static 修飾的成員稱為靜態成員或類成員。它屬于整個類所有,而不是某個對象所有,即被類的所有對象所共享。靜態成員可以使用類名直接訪問,也可以使用對象名進行訪問。當然,鑒于他作用的特殊性更推薦用類名訪問。

使用 static 可以修飾變量、方法和代碼塊。

靜態方法中可以直接調用同類中的靜態成員,但不能直接調用非靜態成員.如果希望在靜態方法中調用非靜態變量,可以通過創建類的對象,然后通過對象來訪問非靜態變量。

在普通成員方法中,則可以直接訪問同類的非靜態變量和靜態變量。

靜態方法中可以直接調用靜態方法,但不能直接調用非靜態方法,需要通過對象來訪問非靜態方法。

注意main函數是一個靜態函數。


四.封裝

將類的某些信息隱藏在類內部,不允許外部程序直接訪問,而是通過該類提供的方法來實現對隱藏信息的操作和訪問。

java中包的作用:
1.管理java文件。
2.管理同名文件沖突,加上不同的包來區分相同文件名的類。

包的定義:
packege,包名間可以用點來區別文件夾且要放在java程序的第一行。

類名相同的可以用包名來區分:
java.lang.(類) 放置java語言基礎類。
java.util.(類)放置java語言工具類。
java.io.(類)包含輸入輸出相關功能的類。

用import來顯示在某個文件中的其他文件中的類:
在包中不能存放相同名字的類。
默認情況下會把同一個包名導入進來。
包名全部是小寫。

訪問修飾符
private 同類
默認 同類 同包
protected 同類 同包 子類
public 同類 同包 子類 其他

this關鍵字

  1. this關鍵字代表當前對象
    this.屬性 操作當前對象的屬性
    this.方法 調用當前對象的方法
  2. 封裝對象的屬性的時候,經常會使用this關鍵字
    public void setJia(double jia){
    this.jia=jia;//this.屬性=參數;就是將參數的值付給當前對象的屬性(為了區分屬性和參數)
    this.sendMessage();//this.方法;就是調用當前對象的sendMessage()方法。
    }

Java中的內部類:
內部類( Inner Class )就是定義在另外一個類里面的類。與之對應,包含內部類的類被稱為外部類。
內部類的主要作用如下:

  1. 內部類提供了更好的封裝,可以把內部類隱藏在外部類之內,不允許同一個包中的其他類訪問該類。
  2. 內部類的方法可以直接訪問外部類的所有數據,包括私有的數據。
  3. 內部類所實現的功能使用外部類同樣可以實現,只是有時使用內部類更方便。

內部類可分為以下幾種:
成員內部類、靜態內部類、方法內部類、匿名內部類。


五.繼承

繼承是類與類的一種關系;Java中的繼承是單繼承,只有一個父類。子類直接擁有父親的所有屬性和方法。private實現的無效!代碼可復用。
繼承語法:

class 子類 extends 父類{ }

方法的重寫:
如果子類對繼承父類的方法不滿意,是可以重寫父類繼承的方法的,當調用方法時會優先調用子類的方法。
語法:

  1. 返回值類型
  2. 方法名
  3. 參數類型及個數

都要與父類繼承的方法相同,才叫方法的重寫。

繼承的初始化順序:
1.初始化父類再初始化子類。
2.先執行初始化對象中的屬性,再執行構造方法中的初始化。
父類對象-->屬性初始化--->構造方法
子類對象-->屬性初始化--->構造方法

final關鍵字:
表示“最終的”,即不可修改。
final可以修飾類、方法、屬性和變量

  1. 修飾類:不允許被繼承
  2. 修飾方法:不允許被重寫
  3. 修飾屬性:則該屬性不會進行隱式初始化(不會自動初始化),需要手動初始化或者在構造方法中初始化 (但二者只能選一,即只能初始化一次后便不能更改)
  4. 修飾變量,只能在聲明的時候賦一次值,成為常量。 (static final 會使其成為全局常量)

super關鍵字
在對象內部使用,代表父類對象。
子類構造過程中必須調用父類的構造方法:隱示super();
顯示調用父類構造方法,必須放在構造方法的第一行。
當子類構造方法中既沒有顯示調用父類的構造方法,父類又沒有無參的構造方法則編譯出錯。

Object類
是所有類的父類,如果一個類沒有使用extends關鍵字明確標識繼承另外一個類,那么這個類默認繼承Object類,且Object類中的方法適合所有子類。
toString()方法:
我們經常在輸出對象的時候希望得到子類的屬性值,那么我們就要重寫從父類繼承來的toString()方法,eclipse中右鍵菜單欄-源碼source-生成generate toString(),他就會根據我們對象的屬性幫我們生成一個toString()方法來輸出屬性值。
equals()方法:
返回值是布爾類型,比較的是對象的引用是否指向同一塊內存地址,對象實例化時,即給對象分配內存空間。
getClass()方法:
可以得到類對象,判斷類型是否一樣-----if (getClass() != obj.getClass())
new出來的是類的對象,關注的是類的屬性的具體的數據;
類對象是類的代碼信息,關注的是類有什么屬性和方法。


六.多態

對象的多種形態。
主要分為 引用多態 、方法多態。
繼承是多態的實現基礎,別忘了子父類要有繼承關系。

多態特性:

  1. 引用多態
    1.父類引用可以指向本類對象 Animal obj1 = new Animal();
    2.父類引用可以指向子類對象 Animal obj2 = new Dog();
    但是我們不能用子類的引用指向父類對象 Dog obj3 = new Animal();//錯

  2. 方法多態
    1.在父類Animal中定義一個eat()方法,輸出一個語句(動物有吃的能力); 在子類Dog中重寫eat()方法,輸出一個語句(狗是吃肉的); 那么我們在測試類main函數里面,如果obj1.eat() ,那么調用的是父類的方法. 若用obj2調用eat()方法,那么調用的是子類的方法.
    2.還有一種情況,比如創建一個繼承父類Animal的子類Cat ,但是Cat里并不重寫繼承的eat()方法. 然后,我們在測試類main函數里創建一個子類對象, Animal obj3 = new Cat(); 然后調用 obj3.eat(); 那么,結果調用的則是子類繼承父類的方法. (輸出結果:動物有吃的能力)
    3.最后一種特殊情況,多態的特性是不能使用的. 若在子類添加一個獨有的方法 public void watchDoor() ,含有一句輸出語句(狗具有看門的能力); 那么我們在測試類的main函數當中(得先定義好對象Animal obj2 = new Dog() ),就不能用obj2.watchDoor(),即不能通過父類的引用調用子類的方法.

引用類型轉換:

  1. 向上類型轉換(隱式/自動類型轉換),是小類型到大類型的轉換。
    如:
    Dog dog=new Dog();
    Animal animal=dog;//正確,自動類型提升,向上類型轉換
  2. 向下類型轉換(強制類型轉換),是大類型到小類型的轉換(存在風險,溢出)
    如:
    Dog dog1=(Dog)animal;//向下類型轉換
  3. instanceof運算符,來解決引用對象的類型,避免類型轉換的安全性問題。如:
    Dog dog=new Dog();
    Animal animal=dog;
    Cat cat=(Cat)animal;//編譯時不會出錯(按Cat類型進行編譯),但運行時會報錯
    因為它開辟的是Dog類型的空間,而(無法將引用類型進行轉換)無法將dog對象轉換成Cat類型,并且此方法對程序的安全性有影響。此時應該利用instanceof和if語句結合使用,進行驗證,以保證程序的安全性,如:
    if(animal instanceof Cat){//判斷animal類中是否包含Cat類型的元素,若包含則進行轉換,instanceof返回值為布爾類型
    Cat cat=(Cat)animal;
    }else{
    System.out.println("無法進行類型轉換");
    }

抽象類

  1. 語法定義:
    抽象類錢使用abstract關鍵字修飾,則該類為抽象類。
  2. 應用場景:
    a、在某些情況下,某個父類只是知道其子類應該包含怎樣的方法,但無法準確知道這些子類如何實現這些方法
    b、從多個具有相同特征的類中抽象出一個抽象類,以這個抽象類作為子類的模板,從而避免了子類設計的隨意性。
  3. 作用:
    限制規定子類必須實現某些方法,但不關注實現細節。
  4. 使用規則:
    a. abstract定義抽象類
    b. abstract定義抽象方法,只有聲明,不需要實現
    c. 包含抽象方法的類是抽象類
    d. 抽象類中可以包含普通的方法,也可以沒

現有Shape圖形類,用Rectangle矩形和Circle圖形子類,求圖形的周長和面積。
代碼實現:

abstract class Shape{

protected float width;
protected float lenth;

public Shape(float a, float b){
    width = a;
    lenth = b;    
}

public abstract float getArea();        //獲得面積
public abstract float getGirth();    //獲得周長

} 
class Rectangle extends Shape{
public    Rectangle(float a, float b){
    super(a, b);
}
public float getGirth(){
    return 2*(width + lenth);
}
public float getArea(){
    return width*lenth;
}
}
class Circle extends Shape{
public Circle(float a){
    super(a, a);
}
public float getGirth(){
    return (float)3.14*2*width;
}
public float getArea(){
    return (float)3.14*width*width;
}
}
public class HelloWorld{
public static void main (String[] args){
    Rectangle rect = new Rectangle(2, 3);
    Circle circle = new Circle(3);
    System.out.println("rect girth: " + rect.getGirth() + "  rect area: " + rect.getArea());
    System.out.println("circle girth: " + circle.getGirth() + "  circle area: " + circle.getArea());
} 
}

七.接口

接口可以理解為一種特殊的類,由全局常量和公共的抽象方法所組成,接口定義使用 interface 關鍵字。
類是一種具體實現體,而接口定義了某一批類所需要遵守的規范,接口不關心這些類里方法的實現細節
,它只規定這些類里必須提供某些方法。

使用接口:
一個類可以實現一個或多和接口,實現接口使用implements關鍵字。java中一個類只能繼承一個父類,可以通過實現多個接口作補充。
繼承父類實現接口的語法:
[修飾符] class 類名 extends 父類 implements 接口1,接口2……{
類體部分
}//如果繼承的是抽象類,需要實現繼承的抽象方法;要實現接口中的抽象方法
如果要繼承父類,繼承父類必須在實現接口之前,接口命名時首字母為I,以區分類名??赏ㄟ^add繼承父接口。

接口的使用還經常與匿名內部類配合。(匿名內部類就是沒有名字的內部類,多用于關注實現而不關注實現類的名稱)
語法格式:
Interface i=new Interface(){
public void method(){
System.out.print("匿名內部類實現接口的方式……");
}
} //即通過創建接口的對象,直接寫出實現的方法,再調用此方法
還可以直接創建并調用方法,如:
new IPlay(){
public void playGame(){
System.out.println("……");
}
}.playGame();


八.UML

  1. Unified Modeling Language,統一建模語言/標準建模語言,是支持模型化和軟件系統開發的圖形化語言;是一個支持模型化和軟件系統開發的圖形化語言;為軟件開發的所有階段提供模型化的可視化支持
  2. 用例圖:可視化表達系統如何滿足業務規則和特定的用戶需求;
  3. 序列圖:表述計算機角色和相互關系,按照交互發生的順序顯示對象之間的交互;
  4. 類圖/類別圖:描述類之間的關系,類中的屬性和方法;
  5. UML類圖、業務邏輯和所有支持結構一同被用于定義全部的代碼結構。
  6. UML建模工具:如Visio、Rational Rose、PowerDesiner
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容

  • 1.import static是Java 5增加的功能,就是將Import類中的靜態方法,可以作為本類的靜態方法來...
    XLsn0w閱讀 1,252評論 0 2
  • 面向對象主要針對面向過程。 面向過程的基本單元是函數。 什么是對象:EVERYTHING IS OBJECT(萬物...
    sinpi閱讀 1,071評論 0 4
  • 姓名: 李小娜 [嵌牛導讀]:封裝、繼承、多態三大特征是java中比較常用的,務必要掌握,下面給大家介紹Java封...
    n184閱讀 1,325評論 0 1
  • 封裝 定義:把對象的屬性和(服務)結合為一個整體,盡可能的隱藏對象內部的實現細節。 優點: 對象的數據封裝特性徹底...
    一根煙的彈跳閱讀 2,839評論 0 3
  • *“楚之南有冥靈者,以五百歲為春,五百歲為秋;上古有大椿者,以八千歲為春,八千歲為秋。此大年也。” 你相信奇跡嗎?...
    晌風閱讀 5,354評論 0 5