Java访问控制修饰符详解

在 Java 语言中提供了多个作用域修饰符,其中常用的有 public、private、protected、final、abstract、static、transient 和 volatile,这些修饰符有类修饰符、变量修饰符和方法修饰符。

在实际生活中,如果要获取某件物品,与其直接穿过堡垒的墙壁,从而导致墙壁毁灭和破坏,不如通过门口的警卫请求进入堡垒的许可。一般而言,这对对象同样适用:没有对象的许可(即对象的属性是私有的),不能直接访问该对象的私有属性。

信息隐藏是 OOP 最重要的功能之一,也是使用访问修饰符的原因。在编写程序时,有些核心数据往往不希望被用户调用,需要控制这些数据的访问。

对类成员访问的限制是面向对象程序设计的一个基础,这有利于防止对象的误用。只允许通过一系列定义完善的方法来访问私有数据,就可以(通过执行范围检查)防止数据赋予不正当的值。例如,类以外的代码不可能直接向一个私有成员赋值。同时,还可以精确地控制如何以及何时使用对象中的数据。

当正确实现对类成员的方法控制后,类就可以创建一个可用的“黑箱”,其内部动作不会被打开而任意篡改。

通过使用访问控制修饰符来限制对对象私有属性的访问,可以获得 3 个重要的好处。

	防止对封装数据的未授权访问。有助于保证数据完整性。当类的私有实现细节必须改变时,可以限制发生在整个应用程序中的“连锁反应”。

访问控制符是一组限定类、属性或方法是否可以被程序里的其他部分访问和调用的修饰符。类的访问控制符只能是空或者 public,方法和属性的访问控制符有 4 个,分别是 public、 private、protected 和 friendly,其中 friendly 是一种没有定义专门的访问控制符的默认情况。

各种访问修饰符的可访问性
在这里插入图片描述

访问控制在面向对象技术中处于很重要的地位,合理地使用访问控制符,可以通过降低类和类之间的耦合性(关联性)来降低整个项目的复杂度,也便于整个项目的开发和维护。在 Java 语言中,访问控制修饰符有 4 种。

1. private
用 private 修饰的类成员,只能被该类自身的方法访问和修改,而不能被任何其他类(包括该类的子类)访问和引用。因此,private 修饰符具有最高的保护级别。例如,设 PhoneCard 是电话卡类,电话卡都有密码,因此该类有一个密码域,可以把该类的密码域声明为私有成员。

2. friendly(默认)
如果一个类没有访问控制符,说明它具有默认的访问控制特性。这种默认的访问控制权规定,该类只能被同一个包中的类访问和引用,而不能被其他包中的类使用,即使其他包中有该类的子类。这种访问特性又称为包访问性(package private)。

同样,类内的成员如果没有访问控制符,也说明它们具有包访问性,或称为友元(friend)。定义在同一个文件夹中的所有类属于一个包,所以前面的程序要把用户自定义的类放在同一个文件夹中(Java 项目默认的包),以便不加修饰符也能运行。

3. protected
用保护访问控制符 protected 修饰的类成员可以被三种类所访问:该类自身、与它在同一个包中的其他类以及在其他包中的该类的子类。使用 protected 修饰符的主要作用,是允许其他包中它的子类来访问父类的特定属性和方法,否则可以使用默认访问控制符。

4. public
当一个类被声明为 public 时,它就具有了被其他包中的类访问的可能性,只要包中的其他类在程序中使用 import 语句引入 public 类,就可以访问和引用这个类。

类中被设定为 public 的方法是这个类对外的接口部分,避免了程序的其他部分直接去操作类内的数据,实际就是数据封装思想的体现。每个 Java 程序的主类都必须是 public 类,也是基于相同的原因。

示例Java 中访问控制修饰符的使用。

1 新建 Student.java 文件,在该文件中定义不同修饰符的属性和方法,代码如下:

class Student {// 姓名,其访问权限为默认(friendly)String name;// 定义私有变量,身份证号码private String idNumber;// 定义受保护变量,学号protected String no;// 定义共有变量,邮箱public String email;// 定义共有方法,显示学生信息public String info() {return"姓名:"+name+",身份证号码:"+idNumber+",学号:"+no+",邮箱:"+email;}
}

2 新建 StudentTest.java 文件,在该文件中定义 main() 方法,访问 Student 类中的属性并赋值,打印出用户的信息。代码如下:

public class StudentTest {public static void main(String[] args) {// 创建Student类对象Student stu = new Student();// 向Student类对象中的属性赋值stu.name = "张三";// stu.idNumber="093765290763137806";// 这是不允许的。提示stu.idNumber是不可见的,必须注释掉才可运行stu.no = "20lil01637";stu.email = "zhzngsan@qq.com";System.out.println(stu.info());}
}

在 StudentTest 类中,“stu.idNumber=“093765290763137806”;”代码行将提示 “The field User.password is not visible”错误信息。将该代码行注释掉再运行 StudentTest.java 文件,输出的内容如下:

姓名:张三,身份证号码:null,学号:20lil01637,邮箱:zhangsan@qq.com

在源文件中创建了两个类,分别为主类 StudentTest 和辅助类 Student,二者在同一个包中。

在辅助类 Student 中,创建了 4 个属性,其访问控制分别为默认的、私有的、受保护的和共有的,除了私有控制符修饰的变量之外,其他的都可以被主类访问,同时创建了一个共有的方法——info(),用于打印用户信息。

在主类 StudentTest 中,创建类 Student 的实例化对象 stu,通过对象 stu 来访问该对象中的属性并赋值,因为 idNumber 属性的修饰符为 private(私有的),因此,在 StudentTest 类中的 main() 方法中无法访问该属性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564596.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为资产分类定义折旧范围_RFID固定资产管理系统方案

项目介绍随着经济的不断发展,企业的规模日益壮大,固定资产管理作为企业资产管理最要的一部分,一直是企业关注的难题。由于固定资产具有价值高,使用周期长、使用地点分散的特点、相关责任人员多,在实际工作中不容易做到…

ssh中c3p0连接mysql_JSP+SSH+Mysql+C3P0实现的传智播客网上商城

项目简介本系统是传智播客授课时的开发案例,基于JSPSSHMysql的简单网上商城。在当代开发中,SSH的使用已经逐渐被SSM取代,但不代表我们不需要学习SSH,该系统简单,但功能齐全可以作为SSH框架初学者的入门项目。难度等级&…

zabbix配置mysql监控_【zabbix】zabbix配置MySQL监控

说明:除最后的测试步骤之外,以下操作均在zabbix的agent端(被监控端)执行一、环境准备:1、操作系统:CentOS 5.6 (zabbix server端)CentOS 5.6 (zabbix agent端)2、数据库:MySQL 5.6 (安装在agent端的数据库)3、软件&…

python把数据变为数据框_将Python dict转换为数据框

正如在另一个使用pandas.DataFrame()的答案中所解释的那样,这里的行为不会像您想象的那样。你可以做的是使用pandas.DataFrame.from_dict与orientindex:In[7]: pandas.DataFrame.from_dict({u2012-06-08: 388,u2012-06-09: 388,u2012-06-10: 388,u2012-0…

Java 静态变量和静态方法

在类中,使用 static 修饰符修饰的属性(成员变量)称为静态变量,也可以称为类变量,常量称为静态常量,方法称为静态方法或类方法,它们统称为静态成员,归整个类所有。 静态成员不依赖于…

java 静态方法同步_Java – 同步静态方法

这是我的测试代码,表明你是对的,这篇文章有点过分谨慎:class Y {static synchronized void staticSleep() {System.out.println("Start static sleep");try {Thread.sleep(2000);} catch (InterruptedException e) {}System.out.println("End static…

北信源管理网页卸载密码_Homebrew: 一行代码实现mac软件管理

Homebrew是一款帮助我们管理软件的软件。任何开源软件都可以通过Homebrew的一行代码完成软件的下载、升级或卸载等。目前Homebrew主要适用macOS或Linux系统。(Windows系统下的类似软件叫Chocolatey,功能相近,使用方法类似。详情请见https://chocolatey.o…

Java import static静态导入

在 JDK 1.5 之后增加了一种静态导入的语法,用于导入指定类的某个静态成员变量、方法或全部的静态成员变量、方法。如果一个类中的方法全部是使用 static 声明的静态方法,则在导入时就可以直接使用 import static 的方式导入。 静态导入使用 import stat…

python数据集的预处理_关于Pytorch的MNIST数据集的预处理详解

关于Pytorch的MNIST数据集的预处理详解MNIST的准确率达到99.7%用于MNIST的卷积神经网络(CNN)的实现,具有各种技术,例如数据增强,丢失,伪随机化等。操作系统:ubuntu18.04显卡:GTX1080tipython版本&#xff1…

java集合基础_java常用集合基础知识

【纯出自个人笔记,如有错误,望改正,谢谢哈!学习~】一、Java集合1、集合类:容器类 装对象的(不能存放基本数据类型,但是里面看到的其实是包装类型)java.util包ArrayList底层是一个对象数组----------------------------…

java cookie安全_cookie的安全性问题

HTTP协议:(1)请求组成部分:请求行:(get或者post请求;请求路径(不包括主机) ;http1.1)请求头:请求头是浏览器交给服务器的一些信息(比较cookie啥的)请求体:只有post请求有请求体,get请…

python画环形图_用Python把图做的好看点:用Matplotlib画个环形图

P老板:小Lo啊,你觉得这几个图好看吗我:好看,好看P老板:我也觉得,这个月的月报,就用这个把,你给我几个,我看看我:.....于是乎,我们今天的目标是什么…

Java main()方法

在 Java 中,main() 方法是 Java 应用程序的入口方法,程序在运行的时候,第一个执行的方法就是 main() 方法。main() 方法和其他的方法有很大的不同。 下面先来看最简单的一个 Java 应用程序 HelloWorld,我们将通过这个例子讲解 Ja…

Java方法的可变参数

在具体实际开发过程中,有时方法中参数的个数是不确定的。为了解决这个问题,在 J2SE 5.0 版本中引入了可变参数的概念。 声明可变参数的语法格式如下: methodName({paramList},paramType…paramName)其中,methodName 表示方法名称…

python中ans的用法_python cx_Oracle基础使用方法

问题使用python操作oracle数据库,获取表的某几个字段作为变量值使用。使用Popensqlplus的方法需要对格式进行控制,通过流获取这几个字段值不简洁(个人观点……)。(优点是能够使用sqlplus的方法直接访问sql文件,不需要考虑打开/关闭连接&#…

java gradle 资源访问_java在gradle工程访问src/test/resources目录下的资源配置文件

package com.jiepu;import java.io.File;import java.net.URISyntaxException;import java.util.Map;import java.util.Properties;//java在gradle工程访问src/test/resources或者src/main/resources目录下的资源配置文件public class TestMain{public static void main(String…

python 匹配字符串map lambda函数_Python map amp; reduce 以及lambda匿名函数 - jvisualvm - ITeye博客...

map()map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。使用map实现一个f(x) x * x的功能def f(x):return x * xm map(f, list(range(1, 10)))# [1, 4…

java执行数据库命令行_java程序执行命令行,解锁数据库表

有些表锁的时间长或其他原因,在plsql中不能解锁,只能用命令行解锁。有些功能跨平台系统的交互偶尔会锁表,就需要自动解锁。下面是解锁的代码:package com.lg.BreakOracleUtils;import com.lg.DB.DBProjp;import com.lg.database.D…

python display函数_【python】pandas display选项

import pandas as pd1、pd.set_option(expand_frame_repr, False)True就是可以换行显示。设置成False的时候不允许换行2、pd.set_option(display.max_rows, 10)pd.set_option(display.max_columns, 10)显示的最大行数和列数,如果超额就显示省略号,这个指…

Java查询个人信息

每个员工都会有自己的档案,主管可以查看在职员工的档案。使用 Java 创建一个员工实体类,然后通过构造方法创建一个名为“王洁”的员工,最后打印出员工档案信息。 1 . 创建 Person 类,在该类中定义个人基本信息属性,并…