关于propected修饰的属性在子孙类下无法访问的问题解析

关于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的子类*/
    }
}

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值