子类(父类的外部包)中访问父类的protetcted属性或者方法,是不可以通过创建父类对象调用的。
注意:此处不讨论同包下的父类子类,因为同包下所有类都可访问protected属性或者方法。
请参见Java官方文档:Chapter 6. Names中的6.6.2.1. Access to a protected Member
具体例子如下:
1 packagec; 2 public classC { 3 protected intid; 4 protected voidtest() { 5 6 } 7 }
子类S:在包s下
1 packages; 2 importc; 3 importq; 4 importt; 5 public class S extendsC { 6 voidaccessProtected() { 7 //C中的protected仅允许其子类S内部访问 8 id = 5; 9 test(); 10 //此外通过E.id访问(在C子类S的内部),则E必须是S或者S的子类(注意不是C) 11 S s = newS(); 12 s.id = 6; 13 s.test(); 14 15 Q q = newQ(); 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下
packageq; imports; public class Q extendsS{ }
C的子类T,包t下
packaget; importc; public class T extendsC { }