当A继承B,但是A和B位于不同的包的时候,A对B中的protected数据成员的访问会有一些限制:
我们知道在java和C#中,对于protected成员只有在同一个包或是子类才能访问protected数据。
上次我遇到了一种情况那就是:在子类中可以通过super.method或super.variable方式访问,而不能以
new Father().method或.variable的形式去调用,采用后者的话,编译器会提示出错,说只有在包内才能访问protected属性的成员。今天受一个同学的启发可以很好的解释这种现象了:protected成员只能在包内访问所以不能在包外访问,或只能是子类访问。我们可以想想假若采用new Father()来调用protected成员,这其实本质上是通过产生一个对象去访问父类的成员,这里并没有体现出继承访问的关系,就相当于在包外面去访问该包内类的成员,显然这是违背了protected访问规则,而采用super方式的话,这很好的体现了我是子类,所以我要访问父类中的protected成员,请允许我进去。super很好的反映了这种继承的关系。
对于编译器的具体实现来说,我感觉,如果我们采用new产生父类对象的方式来访问的话,该父类对象所申请的内存空间,脱离了产生父类对象的子类的内存空间,因而不能访问,但是采用super的方式的话,因为从子类对象的构造那时候就产生了父类对象,构造子类对象的父类对象他们应该是位于同一个内存空间的,也就是具有相同的访问权限。大家有更好的解释的请留言