關於protected權限的子類訪問方式

聲明爲protected權限的成員變量和成員方法,可以被同一包中的所有類和不同包中的子類訪問。

但是,在實際使用中,不同包中的子類要訪問父類中protected權限的成員,卻不是那麼隨意的調用。看幾個例子:

首先在ch13Test包中定義父類Animal,包含一個protected權限的成員變量 i 和成員方法eat():

package ch13Test;

public class Animal {
    protected int i = 5;
    protected void eat() {
        System.out.println("Animals eat.");
    }
}

 1. 子類Cat定義在ch13包中,在子類中直接使用Animal的protected成員變量和方法,可行

package ch13;

import ch13Test.Animal;

public class Cat extends Animal{
    public void eat() {
        i = 7;
        eat();
        System.out.println("Cat is eating" + i);
    }
}

2.  子類Cat定義在ch13包中,在子類中通過子類的對象訪問Animal的protected成員變量和方法,可行

package ch13;

import ch13Test.Animal;

public class Cat extends Animal{
    public void show() {
        Cat cat = new Cat();
        cat.i = 10;
        cat.eat();
        System.out.println("Cat is eating" + cat.i);
    }
}

3. 子類Cat定義在ch13包中,在子類中通過父類的對象訪問父類Animal的protected成員變量和方法,不行

package ch13;

import ch13Test.Animal;

public class Cat extends Animal{
    public void show() {
        Animal animal = new Animal();
        // 無法通過父類對象訪問父類的protected成員
//        animal.i = 9;
//        animal.eat();
//        System.out.println("Cat is eating" + animal.i);
    }
}

4. 子類Cat和Dog都定義在ch13包中,在Dog子類中通過其他子類(Cat)的對象訪問父類Animal的protected成員變量和方法,不行

package ch13;

import ch13Test.Animal;

public class Dog extends Animal{
    public void show() {
        Cat cat = new Cat();
        // 無法通過其他子類對象訪問父類的protected成員
//        cat.i = 9;
//        cat.eat();
    }
}

5. 子類Cat定義在ch13包中,同包中其他類中通過子類的對象訪問父類Animal的protected成員變量和方法,不行

package ch13;

public class Test {
    public static void main(String[] args) {
        Cat cat = new Cat();
//        cat.i = 9;
//        cat.eat();
    }
}

 總結:

1. 子類可以通過繼承獲得不同包父類的protected權限成員變量和成員方法,在子類中可以直接訪問

2. 在子類中可以通過子類的對象訪問父類的protected成員變量和方法

3. 在子類中反而不能通過父類的對象訪問父類的protected成員變量和方法

4. 在子類中不能通過其他子類的對象訪問父類的protected成員變量和方法

5. 在與子類同包的其他類中不能通過子類的對象訪問父類的protected成員變量和方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章