java中private,public,protected详解

2023-05-16

参照甲骨文的java文档:点击打开链接

访问级别

访问级别修饰符确定其他类是否可以使用特定字段或调用特定方法。有两个级别的访问控制:

1.在顶级

 - public或package-private(没有显式修饰符即默认权限)。

类可以用修饰符public声明,在这种情况下,类对所有类都可见。如果一个类没有修饰符(默认,也称为package-private),它只在自己的包中可见。


2.在成员级别 

- public,private,protected或package-private(没有显式修饰符即默认权限)。

在成员级别,也可以使用public修饰符或无修饰符(package-private),如同顶级类一样,具有相同的含义。

对于成员,除public和默认外有两个附加的访问修饰符:private和protected:

private修饰符指定该成员只能在其自己的类中访问。

protected修饰符指定该成员只能在其自己的包(如package-private)中访问,此外还可以由另一个包中的该类的子类访问。


下表显示了对每个修饰符允许的成员的访问权限。


第一列指示类本身是否有权访问由访问级别定义的成员。正如你可以看到,一个类总是有权访问它自己的成员。

第二列指示与该类(不管其父级)相同的包中的类是否具有对成员的访问权限。

第三列指示在此包外部声明的该类的子类是否有权访问成员。

第四列指示是否所有类都具有对成员的访问权限。


访问级别通过两种方式影响您

当您使用来自另一个源(例如Java平台中的类)的类时,访问级别将确定您自己的类可以使用的那些类的哪些成员

第二,当你写一个类时,你需要决定每个成员变量和类中的每个方法应该具有什么访问级别。


让我们看一下类的集合,看看访问级别如何影响可见性。下图显示了此示例中的四个类以及它们之间的关系。


此例中:

One包有Alpha和Beta两个类,Two包中有AlphaSub和Gamma类,其中AlphaSub继承Alpha

下表显示了Alpha类的成员(成员变量、成员函数)对于可应用于它们的每个访问修饰符的可见性。


Alpha类内所有成员都可以访问

Beta与Alpha在同一包中,因而Alpha的私有成员Beta不能访问

Alphasub与Alpha不在同一包中,但AlphaSub是Alpha的子类,因而AlphaSub不能访问Alpha的默认和私有成员

Gamma与Alpha位于不同包且无继承关系,因而Gamma只能访问Alpha的public成员


选择访问级别的提示:

如果其他程序员使用你的类,你想要确保不会发生滥用错误。访问级别可以帮助您这样做。

1.使用对特定成员有意义的最严格的访问级别。使用私人,除非你有一个很好的理由不使用。

2.避免使用公共字段(常量除外)。 (本教程中的许多示例使用公共字段。这可能有助于简要说明一些要点,但不推荐用于生产代码。)公共字段往往会将您链接到特定实现

并限制您在更改代码时的灵活性。


参照甲骨文的java文档:点击打开链接


文档看完了就实际编写例子验证一下吧(只验证了成员函数):

其中每个类中的test方法是用来测试的

Alpha.java

分别定义了四个public,protected、默认,private权限的方法

package com.one;

public class Alpha
{
	public void test()
	{
		this.pub();
		this.pro();
		this.def();
		this.pri();
	}

	public void pub()
	{
		System.out.println( "public");
	}

	protected void pro()
	{
		System.out.println( "protected");
	}
	
	void def()
	{
		System.out.println( "default");
	}

	private void pri()
	{
		System.out.println( "private");
	}
}


Beta.java

和Alpha在同一包下

package com.one;

public class Beta
{
	public void test()
	{
		Alpha alpha = new Alpha();
		alpha.pub();
		alpha.pro();
		alpha.def();
		alpha.pri();
	}

}


AlphaSub.java

AlphaSub作为Alpha的子类,用super进行验证。

package com.two;
import com.one.Alpha;

public class AlphaSub extends Alpha
{
	public void test()
	{
		super.pub();
		super.pro();
		super.def();
		super.pri();
	}
}


Gamma.java

与Alpha不同包且无继承关系

package com.two;
import com.one.Alpha;

public class Gamma
{
	public void test()
	{
		Alpha alpha = new Alpha();
		alpha.pub();
		alpha.pro();
		alpha.def();
		alpha.pri();
	}
}

接下来就开始验证:

1.验证Alpha类

import com.one.Alpha;

class  Test 
{
	public static void main(String[] args) 
	{
		new Alpha().test();
	}
}
分别编译Alpha.java和Test.java:

F:\javaStuff>javac -d F:\javaStuff Alpha.java

F:\javaStuff>javac Test.java

F:\javaStuff>java Test
public
protected
default
private
编译没有报错,即证明四种访问权限在类内都是可以访问的


2.验证Beta类

依次编译Alpha.java和Beta.java

F:\javaStuff>javac -d F:\javaStuff Alpha.java

F:\javaStuff>javac -d F:\javaStuff Beta.java
Beta.java:11: 错误: pri()可以在Alpha中访问private
                alpha.pri();
                     ^
1 个错误

可以看到编译Beta,java时报错,提示Alpha类中的pro方法是私有的,不可访问

3.验证AlphaSub类

依次编译Alpha.java和AlphaSub.java

F:\javaStuff>javac -d F:\javaStuff Alpha.java

F:\javaStuff>javac -d F:\javaStuff AlphaSub.java
AlphaSub.java:10: 错误: def()在Alpha中不是公共的; 无法从外部程序包中对其进行访问
                super.def();
                     ^
AlphaSub.java:11: 错误: pri()可以在Alpha中访问private
                super.pri();
                     ^
2 个错误
编译报错

Alpha的def方法为默认权限无法在外部包访问

Alpha的pri方法为私有权限无法在外部包访问

4.验证Gamma类

依次编译Alpha.java和Gamma.java

F:\javaStuff>javac -d F:\javaStuff Alpha.java

F:\javaStuff>javac -d F:\javaStuff Gamma.java
Gamma.java:10: 错误: pro()可以在Alpha中访问protected
                alpha.pro();
                     ^
Gamma.java:11: 错误: def()在Alpha中不是公共的; 无法从外部程序包中对其进行访问
                alpha.def();
                     ^
Gamma.java:12: 错误: pri()可以在Alpha中访问private
                alpha.pri();
                     ^
3 个错误
3个错误

Alpha的def方法为默认权限无法在外部包访问

Alpha的pri方法为私有权限无法在外部包访问

Alpha的pro方法为保护方法无法被外部非子类访问

代码的目录结构如下



因为编译Beta、AlphaSub和Gamma时都有编译错误自然就不会生成com.two包了



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中private,public,protected详解 的相关文章

  • 将字符串转换为整数数组 String at = "1 2 3 4 5" 转换为 ar=[1,2,3,4,5]

    我正在读取一个字符串 作为一整行数字 用空格分隔 即1 2 3 4 5 我想将它们转换为整数数组 以便我可以操作它们 但这段代码不起作用 它说不兼容的类型 String str br readLine int array new int 4
  • XSD 验证错误:在 web.xml 中找不到 TagLib 标记

    我详细显示错误如下 cvc complex type 2 4 a 发现以元素开头的无效内容 taglib One of http java sun com xml ns javaee 描述 http java sun com xml ns
  • 使用缩略图器,我可以制作具有相同高度和宽度的缩略图,无论图像大小如何

    In 缩略图器 http code google com p thumbnailator 我正在制作缩略图 如果图像大小是 400 300 并且如果我执行以下操作 Thumbnails of new File original jpg si
  • 什么是“非阻塞”并发?它与普通并发有何不同?

    什么是 非阻塞 并发 它与使用线程的普通并发有何不同 为什么不在所有需要并发的场景中都使用非阻塞并发呢 使用非阻塞并发有开销吗 我听说Java中可以实现非阻塞并发 我们是否应该在特定场景下使用此功能 将这些方法之一与集合一起使用是否有区别或
  • Firebase 实时数据库 .info/connected 本应为 True 时为 False

    我有一个 Android 服务 它的调用地址为onCreate FirebaseDatabase database FirebaseDatabase getInstance database getReference info connec
  • 将双精度转换为二进制表示形式?

    我尝试将双精度数转换为其二进制表示形式 但使用此Long toBinaryString Double doubleToRawLongBits d 没有帮助 因为我有大量数字 Long 无法存储它们 即2 900 Long toBinaryS
  • 如何在异常处理程序中访问访问请求主体

    我们有一个 Spring Boot 应用程序 我们的控制器期望在我们的端点之一中有一个 XML 文档元素 PostMapping value api v1 do stuff consumes APPLICATION XML VALUE pr
  • 使用 WebDriver 暂时绕过隐式等待

    当使用隐式等待时 正如这里所建议的 https stackoverflow com a 10950905 56285 我仍然有时想要断言即时元素不可见或不存在 换句话说 我know有些元素应该隐藏 并希望我的测试做出这样的断言fast 而不
  • JCombobox 字符串项(可见)和整数键(固有)

    我有一个数据库模式 它将作为 JTable 列显示在 JCombobox 中以选择名称 但我希望将 ID 字段插入 作为外键 到另一个表中 通常 在下拉列表中选择一个项目 将所选项目带到组合框的显示区域 我想要做的是 当选择组合框中的任何项
  • Java OR 运算符优先级

    如何在 Java 中以 if 的方式链接条件语句b是假的 不如不检查c If a and c是假的 并且b是真的 确实c会被检查吗 if a b c 我正在寻找 PHP 所拥有的类似功能 但两者之间存在差异OR and 爪哇 如果左操作数是
  • 无法在android中使用retrofit发出@Post请求

    我正在学习如何在 android 中使用改造 但是每当我尝试从互联网检索数据时 我的应用程序不会返回任何内容我的响应没有成功 我不知道如何修复当前我正在尝试发布的错误并使用此 URL 检索数据https jsonplaceholder ty
  • Java文本输出中的UTF-8编码问题

    我一直致力于测试高棉语 Unicode Wordbreaker 的各种解决方案 高棉语单词之间没有空格 这使得拼写检查和语法检查变得困难 以及从旧高棉语转换为高棉语 Unicode 我得到了一些源代码 现在在线 http www white
  • 如何告诉 Eclipse 忽略 Ant build.xml 中的错误?

    我有一个使用 Maven 构建的 Eclipse 项目 并且我在 Eclipse 中使用 m2eclipse 插件来获得 Maven 支持 然而这个项目还包含一个build xml它并不用于实际构建项目 而只是用于编写脚本功能 作为项目开发
  • 码头无故停止

    我需要经验丰富的码头用户的建议 我在负载均衡器 亚马逊云 后面维护着 2 台 Linux 机器 使用 Jetty 9 0 3 有时我的 Jetty 容器会被 Thread 2 无故关闭 同时地 显示以下日志并且容器无故停止 没有错误 没有例
  • 在 Struts 2 中使用单个文件标签上传多个文件

    我想使用单个 Struts 2 文件标签上传多个文件 就像在 Gmail 中一样 我们使用 CTRL 键来选择多个文件来附加多个文件 我知道如何上传多个文件 但我想使用单个文件标签 我在一个小画廊应用程序中上传多个文件 如果您的操作已设置为
  • 使用 Spark SQL 时找不到 Spark Logging 类

    我正在尝试用 Java 进行简单的 Spark SQL 编程 在程序中 我从 Cassandra 表获取数据 将RDD into a Dataset并显示数据 当我运行spark submit命令 我收到错误 java lang Class
  • 未找到 GroovyEvaluator

    我会尝试在以下位置制作我的 PIE 3D 报告iReport 在我的 struts xml 中 我用这个来调用我的报告
  • 从 Brixton.RC1 开始的 ZuulProxy 未传递授权标头

    从 Spring Cloud 切换时Brixton M5 to Brixton RC1我的 ZuulProxy 不再通过Authorization标头下游到我的代理服务 我的设置中有各种各样的角色 但大多数都相当简单 Authorizati
  • 启动 Firefox 并等待其关闭

    Question 我想启动 Firefox 网络浏览器作为访问特定网站的过程 然后等到它关闭 一种特殊情况是浏览器可能已经打开并正在运行 因为用户可能已经访问过某个网站 在这种情况下 浏览器可能会在现有窗口中打开一个新选项卡 并且新启动的进
  • Swing:如何创建事件并将其分派给组件?

    我需要将一些事件发送到 Swing 中的组件 因此它的处理方式就像任何用户生成的标准 Swing 事件一样 基本上 类似于宏记录器 然后是 JEditorPane 的执行器 但我需要对生成的事件有更多的控制 所以 假设我有一个编辑 我想 捕

随机推荐

  • OS文件/目录方法----获取当前py文件的路径

    获取当前py文件的路径 xff1a 1 直接获取 只返回当前文件的工作目录 aa 61 os getcwd print 39 当前文件的路径 39 aa 输出 当前文件的路径 G PycharmProjects SeleniumUnitte
  • vscode如何配置git-2022.10

    文章目录 1 vscode填写git配置2 打开git命令行界面 windows本地已经安装git 并配置成功 1 vscode填写git配置 在搜索框中搜索 terminal integrated automation profile w
  • LCD12864串口高级操作

    上面是LCD12864的串口通信时序图 其中RW是方向位 xff0c RS是命令数据选择位 xff0c SID为数据线 xff0c SCLK为时钟线 xff0c CS为使能端 其中CS为1时使能时序操作 xff0c 由图可以看出 xff0c
  • Ubuntu server 18.04 服务器配置

    文章目录 前言一 下载镜像 制作系统u盘启动盘二 安装设置三 创建用户 给普通用户root权限四 GPU驱动安装五 miniconda安装 操作虚拟环境常用指令六 pytracking环境配置总结 前言 例如 xff1a 原有centos服
  • OpenCV数据载入、显示与保存

    一 图像存储器 OpenCV提供了一个Mat类用于存储矩阵数据 Mat类用来保存矩阵类型的数据信息 xff0c 包括向量 矩阵 灰度或彩色图像等数据 Mat类分为矩阵头和指向存储数据的矩阵指针的两部分 矩阵头中包含矩阵的尺寸 存储方法 地址
  • Colab运行YOLOv5训练自己的数据集

    最近想使用YOLOv5模型训练自己的数据集 xff0c 但是没有GPU 所以白嫖一下Google的Colab 第一 xff1a 制作自己的数据集 这里给出一篇自己看过的博客写和博主自制的视频 xff0c 我觉得讲的挺好 xff0c 数据集方
  • HC05主从蓝牙通信的配置步骤

    HC05主从一体化蓝牙模块 xff0c 可以配置为一个主蓝牙和一个从蓝牙 xff0c 两个蓝牙之间实现互相通信 拿到蓝牙之后只需接VCC GND RX TX 首先让蓝牙进入AT模式 先按住蓝牙上的微动开关 xff0c 然后给蓝牙上电 蓝牙上
  • 游记_秦皇岛-北戴河两日游

    写在开篇 在北京上学 xff0c 经常收到各种关于秦皇岛 北戴河的安利 xff0c 一直想去但是都没有实现 xff0c 前段时间终于和男朋友决定用一个周末的时间 xff08 周五晚上从北京出发 xff0c 周六早上到秦皇岛 xff0c 周日
  • STM32学习之路(首篇)

    STM32的学习之路 xff0c 到目前为止学习32也有一段时间了 xff0c 学习32的过程和学51单片机的道路差不多 首先要拥有自己的32开发板 xff0c 我买的是正点原子的开发板 xff0c 商家提供了很多学习资料 xff0c 一开
  • STM32学习之路(五---IIC)

    IIC是由数据线SDA和时钟SCL构成的串行总线 xff0c 可以发送和接收数据 在CPU与被控IC之间 xff0c IC与IC之间进行双向传送 IIC总线在传送数据过程中共有三种类型的信号 xff0c 分别是 xff1a 开始信号 xff
  • PWM调速的原理

    PWM调速实质上是调节占空比 xff0c 我们都是根据占空比的大小来衡量速度 xff0c 但是为什么我们调节占空比就可以实现对速度的调节呢 xff1f 这就需要我们了解调速的本质 xff0c 我们用PWM调节速度问什么能够实现 xff1f
  • keil中显示expected expression

    在keil中出现error expected expression的错误 xff0c 网上很多人都是在 Misc Cortrols这里改一下写c99就好了 xff0c 但是我改过之后还是没好 xff0c 依然报警告 xff0c 后来我自己的
  • Linux学习(C语言学习之Gcc)

    言之者无罪 xff0c 闻之者足以戒 诗序 Linux的学习需要对C语言有一个透彻性的了解 xff0c 需要有非常好的C语言基础 xff0c Gcc是Linux中的C文件的一个编译器 xff08 当然也不只局限于C文件 xff09 Gcc最
  • 如何在 python中查询某个函数的使用方法

    在Python 中查询某个函数的使用 方法时由两种途径 xff1a 1 利用help来查询 xff0c 比如用help来查询print内置函数的使用 xff0c 直接打开Shell输入 help print 就可以了 2 利用Python官
  • 玩转电机驱动——电机编码器

    玩转电机驱动 电机编码器 文章目录 玩转电机驱动 电机编码器前言一 旋转编码器1 光学编码器2 光学旋转编码器与Arduino连接3 程序 二 Arduino Encoder h库相关知识1 硬件要求2 基本用法3 了解正交编码信号4 示例
  • 6、SYSTEM文件夹介绍

    1 delay文件夹 delay c和delay h两个文件 xff0c 其中有七个函数 xff1a void delay osschedlock void void delay osschedunlock void void delay
  • 姿态估计0-06:DenseFusion(6D姿态估计)-源码解析(2)-linemod数据集,预处理解读

    以下链接是个人关于DenseFusion 6D姿态估计 所有见解 xff0c 如有错误欢迎大家指出 xff0c 我会第一时间纠正 有兴趣的朋友可以加微信 xff1a 17575010159 相互讨论技术 若是帮助到了你什么 xff0c 一定
  • 动作识别0-02:mmaction2(SlowFast)-官方数据训练测试-ucf101

    以下链接是个人关于mmaction2 SlowFast 动作识别 所有见解 xff0c 如有错误欢迎大家指出 xff0c 我会第一时间纠正 有兴趣的朋友可以加微信 xff1a 17575010159 相互讨论技术 若是帮助到了你什么 xff
  • 如何快速找到你想要的文献

    阅读文献是深入科研和跟随前沿发展的必要条件 xff0c 大家写论文的时候也需要查阅各种文献 xff0c 引证自己的观点 很多人并不太清楚下载文献的途径 xff0c 只简单了解图书馆 xff0c 知网 xff0c sci等 xff0c 多者使
  • java中private,public,protected详解

    参照甲骨文的java文档 xff1a 点击打开链接 访问级别 访问级别修饰符确定其他类是否可以使用特定字段或调用特定方法 有两个级别的访问控制 xff1a 1 在顶级 public或package private xff08 没有显式修饰符