Java|類的初始化順序、屬性覆蓋、類的訪問權限、面向對象

一:繼承變量(屬性)的覆蓋

問題描述:java

      變量(或者叫作類的屬性),在繼承的狀況下,若是父類和子類存在同名的變量會出現什麼狀況?數組

答案:ide

    一、變量的類型影響屬性的取值。函數

    二、修飾符(protected、public、friendly)不影響屬性覆蓋。this

    三、final_var常量能夠覆蓋。spa

    四、var_變量(除去private)不可覆蓋。.net

    五、static_var靜態變量、static_final靜態常量(二者都屬於類)不可覆蓋。翻譯


二:類訪問權限

java裏面分爲4類權限:friendly、private、protected、public設計

friendly權限:code

    不加任何權限修飾符,在同一個包中能夠訪問。即便是子類,若是不在同一個包中也沒法訪問。

private權限:

    私有權限,用private來修飾,只有這個類能夠訪問,其它類(即便是子類)都不能夠訪問。

protected權限:

    繼承訪問權限,這個類及其子類能夠訪問。同時protected權限還提供包訪問權限,就是在同一個包下面均可以訪問。

public權限:

    公共權限,即最開放的權限,能夠隨意訪問。

三:類的初始化順序

註釋:靜態常量排在最前面。。。測了下。。。沒得出什麼結果。。。

    一、{靜態常量} > {靜態變量 、靜態初始化快} >  {變量 、初始化塊} >  構造函數

    二、在遵照1的前提下,按照定義順序初始化

    三、在遵照1 & 2 的前提下,按照

                父類的 {靜態變量,靜態初始化塊}

                        子類的{靜態變量,靜態初始化塊}

                父類的{ 變量、初始化塊}

                父類構造函數

                子類的{ 變量、初始化塊}

                子類的構造函數

四:傳值和傳引用

    一、基本類型變量:char、byte、short、int、long、float、double、boolean

    二、引用類型變量:類、接口、數組

結論:

    一、基本類型和基本類型變量被看成參數傳遞給方法時,爲值傳遞。在方法體中,沒法給變原變量賦新值,也沒法改變它的值。

    二、    對象和引用型變量被看成參數傳遞給方法時,在方法體中,沒法給原變量賦新值。可是能夠改變引用所指對象的屬性。

五:繼承、多態、overload、overwrite

       面向對象三特徵:封裝、多態、繼承(組合)

繼承的好處是複用原有類。除了繼承Inhericance外,還能夠經過組合Composition的方式複用類。

若是存在一種IS-A的關係,而且一個類須要向另外一個類暴露全部的方法接口,那麼更應該用繼承。

若是存在一種HAS-A的關係,那麼更應該運用組合。

Composition組合

            

interface Attack {
    public void move();
    public void attack();
}

class AttackImpl implements Attack {
    private String move;
    private String attack;
 
    public AttackImpl(String move, String attack) {
        this.move = move;
        this.attack = attack;
    }
 
    @Override
    public void move() {
        System.out.println(move);
    }
 
    @Override
    public void attack() {
        move();
        System.out.println(attack);
    }
}
class Insect {
    private int size;
    private String color;
 
    public Insect(int size, String color) {
        this.size = size;
        this.color = color;
    }
 
    public int getSize() {
        return size;
    }
 
    public void setSize(int size) {
        this.size = size;
    }
 
    public String getColor() {
        return color;
    }
 
    public void setColor(String color) {
        this.color = color;
    }
}
class Bee extends Insect implements Attack {
    private Attack attack;
 
    public Bee(int size, String color, Attack attack) {
        super(size, color);
        this.attack = attack;
    }
 
    public void move() {
        attack.move();
    }
 
    public void attack() {
        attack.attack();
    }
}

Inheritance繼承

Java類分爲:

一、類:使用class定義,不包含抽象方法

二、抽象類:使用absract class定義的類,能夠不包含抽象方法

三、接口:使用interface定義的類

Java類的繼承規律:

一、類能夠繼承(extends)類,能夠繼承(extends)抽象類,能夠繼承(implements)接口。

二、抽象類能夠繼承(extends)類,能夠繼承(extends)抽象類,能夠「繼承」(implements)接口。

三、接口只能繼承(extends)接口。

四、類(類、抽象類)是單一繼承;接口容許多繼承接口;類和抽象類容許實現多個接口。

五、抽象類繼承抽象類、接口,容許缺省實現父級的abstract方法、接口。

六、類繼承抽象類或者實現接口,必須所有實現抽象類的抽象方法,或者父級接口的所有接口。

類的多繼承缺點:
一、若是多繼承,當父類方法重名,會產生歧義
二、若是多繼承,當父類方法重名,子類沒有overwrite,會產生歧義
接口能夠用來設計多繼承,同時接口能夠避免上述問題

Polymorphism多態

    繼承是多態得以實現的基礎。多態就是一種類型表現出多種狀態。

    一個方法調用同這個方法所屬的主體(也就是對象或類)關聯起來叫作綁定,分前期綁定和後期綁定。

1. 前期綁定:

    在程序運行以前進行綁定,由編譯器和鏈接程序實現,又叫作靜態綁定。好比static方法和 final

方法,注意,這裏也包括private方法,由於它是隱式final的。

2. 後期綁定:

    在運行時根據對象的類型進行綁定,由方法調用機制實現,所以又叫作動態綁定,或者運行 時

綁定。除了前期綁定外的全部方法都屬於後期綁定。

    多態就是在後期綁定這種機制上實現的。多態消除了類之間的耦合關係,使程序更容易擴展。

Overload Overwrite

    重載和重寫都是針對方法的概念。方法的型構(英文名是signature,有的譯做「簽名」,雖然它被使用的較爲普遍,可是這個翻譯不許確的)。型構就是指方法的組成結構,具體包括方法的名稱和參數,涵蓋參數的數量、類型以及出現的順序,可是不包括方法的返回值類型,訪問權限修飾符,以及abstract、static、final等修飾符。好比下面兩個就是具備相同型構的方法

public void method(int i, String s) {
        // do something
}
public String method(int i, String s) {
        // do something
}
重寫,英文名是overriding,是指在繼承狀況下,子類中定義了與其基類中方法具備相同型構的新方

法,就叫作子類把基類的方法重寫了。這是實現多態必須的步驟。

    重載,英文名是overloading,是指在同一個類中定義了一個以上具備相同名稱,可是型構不一樣的方
    
法。在同一個類中,是不容許定義多於一個的具備相同型構的方法的。

    

 

常見題目1

相關文章
相關標籤/搜索