被声明为 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++那种虚函数,留着这个共同的方法接口继承,调用就自己重写;,多态嘛
看了不少对比,做个记录~依然是一只菜狗的一天呢