被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问,也能够被不同包中的子类访问。

  • 也就是说,java中的"protected"变量会被同包下的类和派生类直接访问调用,但是这种受保护的类无法直接对象显式外部显示调用.
  • 而对比c++中的protected关键字,这种权限修饰的方法属性被继承之后,可以根据不同的继承方法有用不同的新的属性,这个网上很多;


public

protected

private

类内

可以访问



派生类



不可

此外


不可

不可


Java中的继承应该都是public继承,原本是protected的方法怎么继承依然还是被protected修饰;
由于private无法被派生类继承,也可能是像c++那种继承了但是无法调用的属性方法,于是有了安全受保护的protected,在有关系的包下的朋友类(友元那种情况,java没这么关键词),以及派生类下都可以内部直接调用这个属性或者方法;但是其他外部情况无法直接调用:

附加一个代码:

package com.example.demo.dao;

/**
 * @Author:
 * @Date:2021/7/23
 * @Description:com.example.demo.dao
 * @Version:
 */
class A{
//    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

}
class B extends A{
    public static void main(String[] args) {


        A a=new A();
        a.clone();//结果1


        B b=new B();
        b.clone();//结果2


    }

}

我第一反应是,这会返回父类的clone().那结果1有错,结果2应该没错;仔细想想,应该会有点向上递归那种,找爸爸的感觉,应该都有错,但是我以为是因为A没有爸爸,也就是"基类"(新手学习忘记了object);后来转念一想,java所有的对象不都是object的派生吗?

所以有爸爸为啥报错呢?归根结底,是因为object类源码的clone()里面,这是个没有函数体的接口,必须要@override重写的接口而已.
其实也能理解,对于Object定义clone()函数体没啥意义,不如声明成c++那种虚函数,留着这个共同的方法接口继承,调用就自己重写;,多态嘛

看了不少对比,做个记录~依然是一只菜狗的一天呢

javaprotected的使用范围 java protected_javaprotected的使用范围