有两个包pack1和pack2,pack1中是父类,pack2中子类继承自pack1中的父类。这里主要探索一下子类访问父类中protected内部类的问题:
第一个类:
package pack1; public class BaseClass { protected class InnerProt {} public class InnerPub{} }
第二个类:
package pack2 import pack1.*; public class Mytest extends BaseClass { //继承自第一个包中的类BaseClass InnerPub pub ; //【1】ok! InnerProt prot ; //【2】ok! public void innertest(){ pub = new InnerPub(); //【3】 //【4】error! can't new InnerProt(); //prot = new InnerProt(); } }
我们分析一下:
1、包pack2中的Mytest继承包pack1中的BaseClass,所以Mytest类对BaseClass的public、protected成员具有访问权限,即【1】和【2】都是ok
2、在使用"new classname"创建一个对象的时候会调用构造函数,而这里是调用的默认构造函数;
默认构造函数的访问权限与其所属的类一致,所以InnerPub和InnerProt的默认构造函数的权限分别是public和protected;
"pub = new InnerPub()"构造pub对象时,默认构造函数的调用为:包pack2中的类Mytest访问另一个包pack1中InnerPub类的“public”属性的默认构造函数,所以ok。
而"prot = new InnerProt()"构造pub对象时,包pack2中的类Mytest访问的则是另一个包pack1中类InnerProt的"protected"属性的默认构造函数,Mytest与InnerProt并没有继承关系,也不是同一个包,所以这次访问是拒绝的!