Java的访问修饰符

为了实现面向对象程序设计(OOP)的封装这个特性,需要程序设计语言提供一定的语法机制来支持。这个语法机制就是访问权限控制(访问修饰符:public、protected、private、default)。

Java 中,封装就意味着所有的实例域都带有 private 访问修饰符(私有的实例域),并提供带有 public 访问修饰符的域访问器方法和域更改器方法(公共的操作方法)。

访问修饰符

下面归纳一下 Java 用于控制可见性的 4 个访问修饰符:

  • public:声明为 public 的内容对所有类可见。
  • protected:声明为 protected 的内容对所有子类和同一个包中的所有其他类可见。
  • private:声明为 private 的内容仅对本类可见。对其他类都是不可见的,这对于子类来说也完全适用,即子类也不能访问父类的私有域。
  • 缺省(无访问修饰符):无访问修饰符的内容对同一个包中的所有其他类可见。

Java 中的受保护部分(protected)对所有子类及同一个包中的所有其他类都可见。这与 C++ 中的保护机制稍有不同,Java 中的 protected 概念要比 C++ 中的安全性差。


访问修饰符用来修饰类,及类的内部结构

  • 修饰类,只能用:public、缺省
  • 修饰类的内部结构(属性、方法、构造器、内部类),可以用:public、protected、private、缺省 修饰

受访问保护

大家都知道,最好将类中的域标记为 private,而将方法标记为 public。任何声明为 private 的内容对其他类都是不可见的,这对于子类来说也完全适用,即子类也不能访问父类的私有域。

然而,在有些时候,人们希望父类中的某些方法允许被子类访问,或者允许子类的方法访问父类的某个域。为此,需要将这些方法或域声明为 protected。例如,如果将父类 Employee 中的 hireDay 声明为 proteced,而不是私有的,Manager 中的方法就可以直接地访问它。

不过,Manager 类中的方法只能够访问 Manager 对象中的 hireDay 域,而不能访问其他 Employee 对象中的这个域。这种限制有助于避免滥用受保护机制,使得子类只能获得访问受保护域的权利。

在实际应用中,要谨慎使用 protected 属性。假设需要将设计的类提供给其他程序员使用,而在这个类中设置了一些受保护域,由于其他程序员可以由这个类再派生出新类,并访问其中的受保护域。在这种情况下,如果需要对这个类的实现进行修改,就必须通知所有使用这个类的程序员。这违背了 OOP 提倡的数据封装原则。

受保护的方法更具有实际意义。

  • 如果需要限制某个方法的使用,就可以将该方法声明为 protected。这表明子类(可能很熟悉祖先类)得到信任,可以正确地使用这个方法,而其他类则不行。这种方法的一个最好的示例就是 Object 类中的 clone 方法。
  • protected 方法对于指示那些不提供一般用途而应在子类中重新定义的方法很有用。

参考资料

《Java核心技术卷一:基础知识》(第10版)第 5 章:继承 5.1.10 受保护访问

原文链接:https://www.cnblogs.com/feiyu2/p/17320472.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java的访问修饰符 - Python技术站

(0)
上一篇 2023年4月17日
下一篇 2023年4月17日

相关文章

  • java 中Spring task定时任务的深入理解

    对于Java中Spring task定时任务的深入理解,我们可以通过以下步骤来进行实现: 1. 添加依赖 首先,我们需要在项目中添加Spring task的相关依赖,该依赖包括: <dependency> <groupId>org.springframework</groupId> <artifactId>sp…

    Java 2023年6月15日
    00
  • 关于IDEA git 只有Commit没有Push的问题

    下面是关于IDEA git只有Commit没有Push的问题的完整攻略: 问题描述 在使用IntelliJ IDEA进行git提交时,有时候只有Commit并没有进行Push操作,导致提交的代码并没有同步到仓库中,其他人无法看到最新的代码。 原因分析 首先,需要明确Commit和Push的区别: Commit:将代码提交到本地git仓库中,并生成一个comm…

    Java 2023年6月15日
    00
  • 浅谈JackSon的几种用法

    浅谈Jackson的几种用法 什么是Jackson Jackson是一个Java库,用于将Java对象转换为JSON格式,或者将JSON格式转换为Java对象。它提供了一种简便的方法,用来处理序列化和反序列化的JSON数据。 Jackson使用方式 1. 序列化 序列化是将Java对象转换为JSON字符串的过程。在Jackson中,我们使用ObjectMap…

    Java 2023年5月26日
    00
  • JSP 开发之servlet中调用注入spring管理的dao

    下面是关于 JSP 开发中在 Servlet 中调用注入 Spring 管理的 DAO 的完整攻略: 1. Maven 依赖 首先,在 pom.xml 文件中添加以下依赖: <!– Spring Framework –> <dependency> <groupId>org.springframework</gro…

    Java 2023年6月16日
    00
  • 传统tomcat启动服务与springboot启动内置tomcat服务的区别(推荐)

    传统Tomcat启动服务与Spring Boot启动内置Tomcat服务的区别 在传统的Java Web应用程序中,我们通常使用Tomcat等Web容器来启动应用程序。而在Spring Boot应用程序中,我们可以使用内置的Tomcat来启动应用程序。以下是传统Tomcat启动服务与Spring Boot启动内置Tomcat服务的区别: 区别一:部署方式 在…

    Java 2023年5月15日
    00
  • java实现图片验证码

    实现Java图片验证码的过程包括三个主要步骤:生成随机字符串、将字符串转化为图片、获取用户输入的验证码并进行验证。下面对这三个步骤分别进行详细的说明。 1. 生成随机字符串 我们可以使用Java的Random类生成指定长度的随机字符串。下面是一个生成6个字符长度的随机字符串的示例代码: Random random = new Random(); String…

    Java 2023年6月15日
    00
  • java多文件压缩下载的解决方法

    java多文件压缩下载的解决方法 在Java Web开发中,我们经常需要让用户下载多个文件,而将这些文件打包成一个压缩包是很常见的方法。本文将介绍如何在Java Web应用中实现多文件压缩下载功能。 1. 添加相关依赖 你需要添加相关依赖来实现多文件压缩的功能。本文选择使用Apache commons-compress库,添加以下依赖到你的项目中: <…

    Java 2023年5月20日
    00
  • java删除文件和文件夹具体实现

    当我们需要清理旧数据或者卸载应用程序时,通常需要删除一些文件或者文件夹。下面我来讲解一下Java中如何删除文件和文件夹的实现过程。 删除文件 Java中删除文件的方式非常简单,使用Java的File类提供的delete()方法即可。该方法有一个返回值,表示是否成功删除文件。 例如,我有一个名为test.txt的文件,它的绝对路径为C:\Users\usern…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部