2021-08-09

java中protected权限修饰词的用法

首先,根据菜鸟教程的说法,protected的可见性在于两点:

基类的 protected 成员是包内可见的,并且对子类可见;
若子类与基类不在同一包中,那么在子类中,子类实例可以访问其从基类继承而来的protected方法,而不能访问基类实例的protected方法。

也就是说protected只具有包权限,但是和包权限不同的是他可以为子类提供权限,下面我来用代码演示一下:

首先,创建一个Fruit类,放在了com.java.study.Entity这个包里

package com.java.study.Entity;

public class Fruit {
    protected int taste;

    protected void eat(){}
}

那我们首先验证第一个原则,即在同一包中的Test类(非子类)和不在同一包中的类OtherTest访问taste属性和eat方法

package com.java.study.Entity;

public class Test {
    public void test(){
        Fruit fruit = new Fruit();
        int a =fruit.taste; //编译通过
        fruit.eat(); //编译通过
    }
}

而不在同一包内的OtherTest类中引用,则会在编译期间报错

package com.java.study.OtherEntity;
import com.java.study.Entity.Fruit;

public class OtherTest {
   public static void main(String[] args) {
       Fruit fruit = new Fruit();
       int a =fruit.taste; //报错,taste是protected属性
       fruit.eat();  //报错,eat是protected方法
   }
}

这里可以看到在同一个包内的Test,编译期间没有报错,原则一没有问题

接下来是重点,第二个原则是什么意思呢
我们创建Fruit的子类Orange(和Fruit类不在同一个包中)

package com.java.study.OtherEntity;
import com.java.study.Entity.Fruit;

public class Orange extends Fruit {
    public static void main(String[] args) {
        Orange orange = new Orange();
        Fruit fruit = new Fruit();

        int a = orange.taste; //这个taste是从父类继承过来的属性
        int b = fruit.taste;//这个taste是父类实例的属性

        orange.eat();//这个eat是从父类继承过来的方法
        fruit.eat();//这个eat是父类实例的方法
    }

}

打个不太恰当但是容易理解的例子: 比如爸爸有聪明的脑袋,儿子从爸爸那里继承了同样聪明的脑袋,在儿子离开爸爸(即不在同一个包中)的生活中(即子类中),儿子可以用自己的脑袋来思考,但是不能使用爸爸的,因为爸爸在另一个包里,没办法跑过来帮儿子思考.

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值