聲明爲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成員變量和方法