温暖的电波  

有两个包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并没有继承关系,也不是同一个包,所以这次访问是拒绝的!

posted on 2016-05-08 11:28  温暖的电波  阅读(684)  评论(0编辑  收藏  举报