被 protected
修飾的成員對于本包和其子類可見:
- 基類的
protected
成員在包內(nèi)可見 - 若繼承了基類的子類與基類不在同一個包中宜咒,那么在子類中幌绍,子類實例可以訪問其從基類繼承而來的
protected
方法修械,不能訪問基類中的protected
方法趾牧。
/**
* 基類
*/
package com.example.demo.base;
public class ProFather {
protected void f() {
System.out.println("protected father");
}
}
/**
* 與基類處于同一個包的子類
*/
package com.example.demo.base;
public class ProSon1 extends ProFather {
}
/**
* 與基類處于不同包的子類
*/
package com.example.demo.base2;
public class ProSon2 extends ProFather {
}
在基類所在的包中,基類肯污,子類1和子類2都可以訪問函數(shù) f()
/**
* 與基類處于同一個包的測試類
*/
package com.example.demo.base;
public class BaseTest {
public static void main(String[] args) {
// 基類可以訪問函數(shù)f
ProFather father = new ProFather();
father.f();
// 子類1可以訪問函數(shù)f
ProSon1 son1 = new ProSon1();
son1.f();
// 子類2可以訪問函數(shù)f
ProSon2 son2 = new ProSon2();
son2.f();
}
}
在不同的包下翘单,基類,子類1和子類2都不能訪問函數(shù) f()
仇箱,
/**
* 與基類處于不同包的測試類
*/
package com.example.demo.base2;
public class Base2Test {
public static void main(String[] args) {
ProFather father = new ProFather();
// f 方法被保護县恕,在不同的包不可見
father.f(); // error
ProSon1 son1 = new ProSon1();
// f 方法被保護,在不同的包不可見
son1.f(); // error
ProSon2 son2 = new ProSon2();
// f 方法被保護剂桥,在不同的包不可見
son2.f(); // error
}
}
在子類2中:
- 基類無法訪問函數(shù)
f()
- 子類2可以訪問函數(shù)
f()
/**
* 與基類處于不同包的son2
*/
package com.example.demo.base2;
public class ProSon2 extends ProFather {
protected void f1() {
super.f();
}
public static void main(String[] args) {
ProFather father = new ProFather();
// f 方法被保護忠烛,在不同的包不可見
father.f(); // error
ProSon2 son2 = new ProSon2();
// f 方法被 son2 繼承,在子類可見
son2.f(); // ok
}
}
如果子類2重寫了父類的 f 方法权逗,并用 protected
修飾美尸,那么在子類2所在的包下可以訪問冤议。
/**
* 與基類處于不同包的子類2
*/
package com.example.demo.base2;
public class ProSon2 extends ProFather {
@Override
protected void f() {
super.f();
}
public static void main(String[] args) {
ProSon2 son2 = new ProSon2();
// f 方法被 son2 重寫,在子類可見
son2.f();
}
}
/**
* 與基類處于不同包的測試類
*/
package com.example.demo.base2;
public class Base2Test {
public static void main(String[] args) {
// f 方法來自于ProSon2在同一個包內(nèi)可見
son2.f(); // ok
}
}
參考資料
本文首發(fā)于我的個人博客 https://chaohang.top
作者張小超
轉(zhuǎn)載請注明出處
歡迎關(guān)注我的微信公眾號 【超超不會飛】师坎,獲取第一時間的更新恕酸。