子类(父类的外部包)中访问父类的protetcted属性或者方法,是不可以通过创建父类对象调用的。
注意:此处不讨论同包下的父类子类,因为同包下所有类都可访问protected属性或者方法。
请参见Java官方文档:Chapter 6. Names中的6.6.2.1. Access to a protected Member
具体例子如下:
1 package c; 2 public class C { 3 protected int id; 4 protected void test() { 5 6 } 7 }
子类S:在包s下
1 package s; 2 import c; 3 import q; 4 import t; 5 public class S extends C { 6 void accessProtected() { 7 //C中的protected仅允许其子类S内部访问 8 id = 5; 9 test(); 10 //此外通过E.id访问(在C子类S的内部),则E必须是S或者S的子类(注意不是C) 11 S s = new S(); 12 s.id = 6; 13 s.test(); 14 15 Q q = new Q(); 16 q.id = 5; 17 q.test(); 18 19 //此外通过E.id访问(在C子类S的内部),则E必须是S或者S的子类(注意不是C) 20 //所以c.id不可访问 21 // C c = new C(); 22 // c.id; 23 // c.test(); 24 25 //此外通过E.id访问(在C子类S的内部),则E必须是S或者S的子类(注意不是C) 26 //所以t.id不可访问 27 // T t = new T(); 28 // t.id; 29 // t.test(); 30 } 31 }
S的子类Q,包q下
package q; import s; public class Q extends S{ }
C的子类T,包t下
package t; import c; public class T extends C { }