关于propected修饰的属性在子孙类下无法访问的问题解析:
我们都知道propected的修饰符权限是第二大的:它可以在同类,同包,子孙类中访问。
现在问题来了
:为什么不同包的情况下使用多态:也就是Father foo = new Son()时,无法直接点出父类中的protected属性呢?
根本原因
:jvm无法判断出声明的变量foo是否指向子类的引用,也就是Son的实例
解决方案
:1. 除非把foo强转为子类的对象:如(Son)foo。这样jvm就可以确定变量所指的对象是属于Father的子孙类了。
: 2.或者用子类声明变量去接收子类实例如:Son soo = new Son(),
/*
父类,声明四个访问修饰符的变量。
*/
package A;//----------------------A包
public class Father {
public int a;//public作用域:本类,同包,子孙类,其他
protected int b;//protected作用域:本类,同包,子孙类
int c;//default作用域:本类,同包
private int d;//private作用域:本类
}
package B;//----------------------B包
import A.Father;
import org.junit.Test;
public class Son extends Father {
@Test
public void test1() {
Father foo= new Son();//多态:父类的声明指向子类的对象。
int x1=foo.b;/*b字母爆红,出错。因为这时候的s2,是Father声明的变量foo.*/
int x2= ((Son) foo).b;/*这样就可以访问到b, 在不同包的情况下。jvm无法判断当前变量所指向的对象是否属于father的子类。(protected的权限问题)*/
Son s = new Son();//创建一个继承自father的对象
int x3 = s.b;/*这时候可以点出的原因是,因为s1是son的声明的变量,指向son的对象,根据声明可以直接知道son是father的子类*/
}
}