1. 程式人生 > >Java初始化順序

Java初始化順序

如何 eache 區別 stat 類型 基礎 返回值 內存結構 第一次

*********************繼承中的對象初始化順序(內存結構)************************


private 修飾的屬性 和方法 不能被繼承

父類中 private 修飾的屬性 比如 private BMW bmw = new BMW(); 在子類對象中存在不存在?


其實是有的! 子類對象包含父類中所有的屬性的....

一.隱式的創建父類的對象

1. 給父類對象的實例變量分配空間、默認初始化

2. 聲明時初始化、初始化塊初始化

3. 構造函數初始化


二.創建子類的對象

1. 給子類對象的實例變量分配空間、默認初始化

2. 聲明時初始化、初始化塊初始化

3. 構造函數初始化

二.創建子類的對象

父類對象的初始化塊執行
使用父類的name,age構造函數初始化
子類對象的初始化塊執行
子類sno,name,age構造函數執行

*******************************super指針****************************

super 指向隱式創建的父類對象


一. 使用super()調用父類的構造函數

(1) super()

在子類構造函數中 如果什麽也不寫 相當於寫上 super() 調用父類默認的構造函數

註意: 這時 父類中 如果寫了帶參數的構造函數,一定要把不帶參數的默認的構造函數加上

否則會報錯

2. super(參數) 調用指定的父類構造函數


public Student(int sno,String name,int age){
//super();//調用父類的默認的構造函數
super(name,age);//調用指定的父類構造函數初始化

System.out.println("子類sno,name,age構造函數執行");
this.sno = sno;
}


繼承! = 含有


繼承: 子類對象可以有權利隨意訪問,使用this來隨意訪問屬性或方法才叫繼承


二. 使用super 訪問被隱藏的父類同名實例變量

super.父類屬性名

例如

super.name


三. 使用super調用 父類的方法

super.父類方法名()


public class JavaTeacher extends Teacher{

public void teach(){

super.teach();//調用父類的teach()方法 保留父類的行為 解決了代碼冗余問題

System.out.println("我不僅要說 而且要敲代碼");
}

public static void main(String[] args) {
JavaTeacher jt = new JavaTeacher();

jt.teach();
}
}


*********************************************屬性的隱藏**************************************


父類Person 中定義一個name="父親"

子類Student中也定義一個name="孩子"


子類對象中有兩份name,直接在子類對象中 定義一個方法 intro 打印 name 打印的是子類對象的name

叫做屬性的隱藏

*******************************************繼承中的類初始化**************************************


第一次使用類的時候

Student s = new Student();


一.父類的類初始化


二.子類的類初始化


********************************重寫 Override (也叫覆蓋)************************

一.why


大雁和鴿子都屬於鳥類, 繼承鳥這個類,都可以飛,而鴕鳥是一種特殊的鳥,不會飛.如果鴕鳥

繼承鳥類以後不做任何處理,鴕鳥也會飛了.. 顯然不對


當子類的行為 和 從父類繼承下來的行為 不太一樣的時候, 需要使用重寫 ,來重新定義子類的行為


二.what 什麽是重寫

也叫做覆蓋


推翻 父類繼承下來的行為 整個推翻 重寫

三. how 如何重寫


重寫首先建立在繼承的基礎上,子類要繼承父類..

最簡單的重寫: 子類定義的方法 和父類方法完全一樣 ,叫做重寫


演示代碼:


package com.chapter8.演示重寫;

//鳥
public class Bird {

public void fly(){
System.out.println("我是一只小小鳥,我在飛");
}
}


鴕鳥

public class TuoNiao extends Bird {

public void fly(){
System.out.println("我是鴕鳥,我不會飛");
}

public static void main(String[] args) {
TuoNiao tuoniao = new TuoNiao();

tuoniao.fly();
}
}


************************************重寫規則: 一同一大兩小 ***************************************


一同: 方法的簽名相同


方法的簽名 = 方法名 + 參數列表

如何驗證是否是正確的重寫

使用註解 @Override

如果是正確的重寫 不報錯 否則 編譯報錯

編譯的時候 編譯器幫你驗證


註解是有功能的,註釋只是一個提示作用,沒有其他功能

一大: 子類方法的訪問控制權限 比父類方法的訪問控制權限要大(或相同)


private
default
protected
public


兩小:

1. 子類方法的返回值 是 父類方法返回值的子類(協變式返回值)

2. 子類方法拋出的異常 比 父類方法拋出的異常 範圍小



************************************Overload 和Override的區別***************************************


一.Overload 重載


1.方法的名稱相同,參數列表不同的方法之間叫做重載

參數列表不同體現在三個方面:

1. 個數不同

2. 類型不同

3. 順序不同


二. Override 重寫


子類繼承父類, 子類重寫父類的方法, 只要符合重寫規則就叫重寫


重寫規則如下:

...

************************************其他零散知識***************************************


1.同一個類中的方法之間可以相互重寫嗎??

不可以. 重寫要建立在繼承的基礎上,子類去重寫父類的方法.

2. 子類可以重載父類的方法嗎??


可以.

Java初始化順序