2021-02-26

本文深入探讨Java中protected修饰符。通过提出多个问题,如不同包下子类对象对父类protected方法的访问情况等,详细分析了在不同场景下protected修饰符的访问权限,包括父类为非静态和静态protected修饰类的情况,强调要多实践才能真正掌握其微妙之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

protected修饰符理解 转载

https://juejin.cn/post/6844903517988061191
转载链接

云大数据社区 lv-2
2017年12月01日 阅读 4249
关注
深入理解 Java 中 protected 修饰符
看似简单的东西可以引出很多问题,学习过程中很多概念我们都只是「好像了解」、「貌似是这样」、「应该没问题」, 其实缺乏的是仔细思考, 对自己少问了几个「为什么」。

在 Java 中, 访问权限修饰符属于最最基础的知识, protected 修饰符只是其中一个, 如果你要问为什么不拿 public、default、private 来深究呢? 那么看完这篇文章你会知道为何 protected 更值得深入️思考。

在 《Thinking in Java》 中,protected 的名称是「继承访问权限」,这也就是我们记忆中的 protected:protected 必须要有继承关系才能够访问。 所以你以为你懂了, 可是你真的理解了这句话吗?

先思考几个问题:

同一个包中, 子类对象能访问父类的 protected 方法吗?

不同包下, 在子类中创建该子类对象能访问父类的 protected 方法吗?

不同包下, 在子类中创建父类对象能访问父类的 protected 方法吗?

不同包下, 在子类中创建另一个子类的对象能访问公共父类的 protected 方法吗?

父类 protected 方法加上 static 修饰符又会如何呢?

《Thinking in Java》中有一句话:「protected 也提供包访问权限, 也就是说,相同包内的其他类可以访问 protected元素」, 其实就是 protected 修饰符包含了 default 默认修饰符的权限, 所以第 1 个问题你已经知道答案了, 在同一个包中, 普通类或者子类都可以访问基类的 protected 方法。

父类为非静态 protected 修饰类
package com.protectedaccess.parentpackage;

public class Parent {

protected String protect = "protect field";

protected void getMessage(){
    System.out.println("i am parent");
}

}复制代码
不同包下,在子类中通过父类引用不可以访问其 protected 方法

无论是创建 Parent 对象还是通过多态创建 Son1 对象, 只要 Parent 引用, 则不可访问, 编译器会提示错误。

package com.protectedaccess.parentpackage.sonpackage1;

import com.protectedaccess.parentpackage.Parent;

public class Son1 extends Parent{
public static void main(String[] args) {
Parent parent1 = new Parent();
// parent1.getMessage(); 错误

    Parent parent2 = new Son1();
    // parent2.getMessage();  错误
}

}复制代码
不同包下,在子类中通过该子类引用可以访问其 protected 方法

子类中实际上把父类的方法继承下来了, 可以通过该子类对象访问, 也可以在子类方法中直接访问, 还可以通过 super 关键字调用父类中的该方法。

package com.protectedaccess.parentpackage.sonpackage1;

import com.protectedaccess.parentpackage.Parent;

public class Son1 extends Parent{
public static void main(String[] args) {
Son1 son1 = new Son1();
son1.getMessage(); // 输出:i am parent,
}
private void message(){
getMessage(); // 如果子类重写了该方法, 则输出重写方法中的内容
super.getMessage(); // 输出父类该方法中的内容
}
}复制代码
不同包下,在子类中不能通过另一个子类引用访问共同基类的 protected 方法

package com.protectedaccess.parentpackage.sonpackage2;

import com.protectedaccess.parentpackage.Parent;

public class Son2 extends Parent {

}复制代码
注意是 Son2 是另一个子类, 在 Son1 中创建 Son2 的对象是无法访问父类的 protected 方法的

package com.protectedaccess.parentpackage.sonpackage1;

import com.protectedaccess.parentpackage.Parent;
import com.protectedaccess.parentpackage.sonpackage2.Son2;

public class Son1 extends Parent{
public static void main(String[] args) {
Son2 son2 = new Son2();
// son2.getMessage(); 错误
}
}复制代码
父类为静态 protected 修饰类
对于protected的静态变量, 在子类中可以直接访问, 在不同包的非子类中则不可访问

package com.protectedaccess.parentpackage;

public class Parent {

protected String protect = "protect field";

protected static void getMessage(){
    System.out.println("i am parent");
}

}复制代码
静态方法直接通过类名访问

无论是否同一个包,在子类中均可直接访问

package com.protectedaccess.parentpackage.sonpackage1;

import com.protectedaccess.parentpackage.Parent;

public class Son3 extends Parent{
public static void main(String[] args) {
Parent.getMessage(); // 输出: i am parent
}
}复制代码
在不同包下,非子类不可访问

package com.protectedaccess.parentpackage.sonpackage1;

import com.protectedaccess.parentpackage.Parent;

public class Son4{
public static void main(String[] args) {
// Parent.getMessage(); 错误
}
}复制代码
看到这里你应该知道有多少种情况了, 针对不同的情况都可能出现意外的结果, 所以还是得多实践, 仅仅在书上看一遍 protected 修饰符的作用是无法真正发现它的微妙。

转载链接
https://juejin.cn/post/6844903517988061191

2021-03-26 20:54:33,596 - Model - INFO - Epoch 1 (1/200): 2021-03-26 20:57:40,380 - Model - INFO - Train Instance Accuracy: 0.571037 2021-03-26 20:58:16,623 - Model - INFO - Test Instance Accuracy: 0.718528, Class Accuracy: 0.627357 2021-03-26 20:58:16,623 - Model - INFO - Best Instance Accuracy: 0.718528, Class Accuracy: 0.627357 2021-03-26 20:58:16,623 - Model - INFO - Save model... 2021-03-26 20:58:16,623 - Model - INFO - Saving at log/classification/pointnet2_msg_normals/checkpoints/best_model.pth 2021-03-26 20:58:16,698 - Model - INFO - Epoch 2 (2/200): 2021-03-26 21:01:26,685 - Model - INFO - Train Instance Accuracy: 0.727947 2021-03-26 21:02:03,642 - Model - INFO - Test Instance Accuracy: 0.790858, Class Accuracy: 0.702316 2021-03-26 21:02:03,642 - Model - INFO - Best Instance Accuracy: 0.790858, Class Accuracy: 0.702316 2021-03-26 21:02:03,642 - Model - INFO - Save model... 2021-03-26 21:02:03,643 - Model - INFO - Saving at log/classification/pointnet2_msg_normals/checkpoints/best_model.pth 2021-03-26 21:02:03,746 - Model - INFO - Epoch 3 (3/200): 2021-03-26 21:05:15,349 - Model - INFO - Train Instance Accuracy: 0.781606 2021-03-26 21:05:51,538 - Model - INFO - Test Instance Accuracy: 0.803641, Class Accuracy: 0.738575 2021-03-26 21:05:51,538 - Model - INFO - Best Instance Accuracy: 0.803641, Class Accuracy: 0.738575 2021-03-26 21:05:51,539 - Model - INFO - Save model... 2021-03-26 21:05:51,539 - Model - INFO - Saving at log/classification/pointnet2_msg_normals/checkpoints/best_model.pth 我有类似于这样的一段txt文件,请你帮我写一段代码来可视化这些训练结果
02-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值