深入理解 Java 修饰符与封装:访问权限、行为控制与数据隐藏
Java 修饰符
Java 修饰符 用于控制类、属性、方法和构造函数的访问权限和行为。它们可以分为两组:
- 访问修饰符:
- public: 意味着代码对所有类可访问。
- private: 意味着代码只能在声明的类内部访问。
- default: 意味着代码只能在同一包中访问。
- protected: 意味着代码在同一包和子类中可访问。
- 非访问修饰符:
- final: 意味着类不能被继承,属性和方法不能被重写。
- static: 意味着属性和方法属于类,而不属于对象。
- abstract: 意味着类不能用于创建对象,方法没有主体,必须由子类提供。
- transient: 意味着在序列化包含它们的对象时,属性和方法将被跳过。
- synchronized: 意味着方法一次只能由一个线程访问。
- volatile: 意味着属性的值不会在本地线程缓存,总是从“主内存”读取。
示例:
访问修饰符:
// public类可以被任何类访问
public class Main {
// private属性只能在 Main 类内部访问
private int x = 10;
// default方法只能在同一个包中访问
void myMethod() {
System.out.println("This is a default method.");
}
// protected方法可以在同一个包和子类中访问
protected void myProtectedMethod() {
System.out.println("This is a protected method.");
}
public static void main(String[] args) {
Main myObj = new Main();
System.out.println(myObj.x); // 错误,无法访问私有属性
myObj.myMethod(); // 可以访问 default 方法
myObj.myProtectedMethod(); // 可以访问 protected 方法
}
}
非访问修饰符:
public class Main {
// final属性不能被修改
final int y = 20;
// static方法可以在不创建对象的情况下访问
static void myStaticMethod() {
System.out.println("This is a static method.");
}
// abstract方法没有主体,必须由子类提供
abstract void myAbstractMethod();
public static void main(String[] args) {
// y = 30; // 错误,无法修改 final 属性
myStaticMethod(); // 可以访问 static 方法
// myAbstractMethod(); // 错误,无法直接调用抽象方法
}
}
// 子类继承 Main 类并提供抽象方法的主体
class Child extends Main {
@Override
void myAbstractMethod() {
System.out.println("This is the implementation of myAbstractMethod.");
}
}
一些额外的说明:
- 可以使用多个修饰符来修饰类、属性、方法和构造函数。例如,
public final表示类是公开的并且不能被继承。 - 修饰符是 Java 语言的重要组成部分,它们可以帮助您控制代码的访问权限和行为。
以下是一些有关 Java 修饰符的其他重要信息:
- default 修饰符 也可以称为 package-private 修饰符。
- protected 修饰符允许子类访问父类中的成员,但不允许外部类访问。
- static 变量和方法也称为 类变量 和 类方法。
- abstract 类不能被实例化,只能被继承。
- transient 变量不会被序列化。
- synchronized 方法可以防止多个线程同时执行。
- volatile 变量保证每次读取都将获取最新的值。
Java 封装
封装 的含义是确保敏感数据对用户隐藏。为了实现这一点,你需要:
- 将类变量/属性声明为私有
- 提供公共的 get 和 set 方法以访问和更新私有变量的值
Get 和 Set 方法
私有变量只能在同一类中访问(外部类无法访问)。但是,如果我们提供了公共的 get 和 set 方法,就可以访问它们。
get 方法 返回变量值,而 set 方法 设置值。
两者的语法是它们都以 get 或 set 开头,后面跟着变量的名称,首字母大写:
public class Person {
private String name; // private = 受限制的访问
// Getter
public String getName() {
return name;
}
// Setter
public void setName(String newName) {
this.name = newName;
}
}
示例解释
- get 方法返回变量 name 的值。
- set 方法接受一个参数(newName)并将其分配给 name 变量。关键字 this 用于引用当前对象。
然而,由于 name 变量被声明为私有,我们无法从此类外部访问它:
public class Main {
public static void main(String[] args) {
Person myObj = new Person();
myObj.name = "John"; // 错误
System.out.println(myObj.name); // 错误
}
}
如果变量被声明为 public,我们期望以下输出:
John
然而,由于我们尝试访问一个私有变量,我们得到一个错误:
MyClass.java:4: error: name has private access in Person
myObj.name = "John";
^
MyClass.java
:5: error: name has private access in Person
System.out.println(myObj.name);
^
2 errors
相反,我们使用 getName() 和 setName() 方法来访问和更新变量:
public class Main {
public static void main(String[] args) {
Person myObj = new Person();
myObj.setName("John"); // 将 name 变量的值设置为 "John"
System.out.println(myObj.getName());
}
}
// 输出 "John"
为什么封装?
- 更好地控制类的属性和方法
- 类属性可以被设置为只读(如果仅使用 get 方法)或只写(如果仅使用 set 方法)
- 灵活性:程序员可以更改代码的一部分而不影响其他部分
- 数据的安全性增加
封装的优点:
- 提高安全性:隐藏内部实现细节,防止意外修改或访问敏感数据。
- 提高代码的模块化:将代码组织成独立的模块,每个模块只暴露必要的接口。
- 提高代码的可重用性:封装的模块可以被其他代码重用,降低代码的重复性。
- 提高代码的维护性:易于理解和维护代码,降低代码的复杂度。
一些额外的说明:
- 可以使用多个修饰符来修饰 get 和 set 方法,例如 public、protected 和 private。
- 可以使用 final 修饰符来声明常量,常量不能被修改。
- 可以使用 static 修饰符来声明静态方法和变量,静态方法和变量属于类,而不是对象。
最后
为了方便其他设备和平台的小伙伴观看往期文章:
微信公众号搜索:Let us Coding,关注后即可获取最新文章推送
看完如果觉得有帮助,欢迎 点赞、收藏、关注
深入理解 Java 修饰符与封装:访问权限、行为控制与数据隐藏的更多相关文章
- 类的高级:访问修饰符、封装、静态类成员static、内部类;
访问修饰符: 公开访问(public):对所有子类,非子类访问: 受保护的(protected):只有同包子类.非子类.不同包子类可访问,不同包非子类不可访问: 私有的(private):只有本类可访 ...
- JAVA修饰符类型(public,protected,private,friendly)
转自:http://www.cnblogs.com/webapplee/p/3771708.html JAVA修饰符类型(public,protected,private,friendly) publ ...
- Java修饰符关键词大全
所以我以此主题写了这篇文章.这也是一个可用于测试你的计算机科学知识的面试问题. Java修饰符是你添加到变量.类和方法以改变其含义的关键词.它们可分为两组: 访问控制修饰符 非访问修饰符 让我们先来看 ...
- JAVA修饰符类型(转帖)
JAVA修饰符类型(public,protected,private,friendly) public的类.类属变量及方法,包内及包外的任何类均可以访问:protected的类.类属变量及方法,包内的 ...
- java修饰符public final static abstract transient
JAVA 修饰符public final static abstract transient 关键字: public final static abstract ... 1.public prot ...
- Java基础之Java 修饰符
前言:Java内功心法之Java 修饰符,看完这篇你向Java大神的路上又迈出了一步(有什么问题或者需要资料可以联系我的扣扣:734999078) Java语言提供了很多修饰符,主要分为以下两类: 访 ...
- Java知识回顾 (2) Java 修饰符
一.Java 修饰符 1.1 访问控制修饰符 Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java 支持 4 种不同的访问权限. default (即缺省,什么也不写): 在 ...
- Java-Runoob:Java 修饰符
ylbtech-Java-Runoob:Java 修饰符 1.返回顶部 1. Java 修饰符 Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变 ...
- AJPFX分享JAVA修饰符详解
1.类的修饰符分为:可访问控制符和非访问控制符两种. 可访问控制符是:公共类修饰符 public 非访问控制符有:抽象类修饰符 abstract :最终类修饰符 final 1 )公共类修饰符 pub ...
- java修饰符的总结
引言:Java的修饰符根据修饰的对象不同,分为类修饰符.方法修饰符.变量修饰符,其中每种修饰符又分为访问控制修饰符和非访问控制修饰符.访问控制存在的原因:a.让客户端程序员无法触及他们不应该触及的部分 ...
随机推荐
- 异常处理之raise A from B
raise A from B 语句用于连锁chain异常 from 后面的B可以是: - 异常类 - 异常实例 - None 如果B是异常类或者异常实例,那么B会被设置为A的__cause__属性,表 ...
- ASP.NET Core 微信支付(二)【 发布到服务器上签名加密时报错:系统找不到指定的文件 APIV3】
参考资料 .Net微信支付退款操作"系统找不到指定的文件" 错误现象 微信支付(API v3)的统一下单接口和订单查询接口在本地调试成功,可以使用,但是发布到服务器上之后调用接口就 ...
- jquery实现轮播图切换
这个是我模仿网易云的音乐界面写的轮播图,主要实现的功能有 1.每隔4秒图片和对应的背景颜色一起切换 2.点击翻页会跳转到相对应的图片以及背景上 3.点击左右翻页,实现顺序切换 <1>HTM ...
- tomcat启动错误“The temporary upload location”
目录 问题的原因 解决方案 临时的,直接重新启动项目就行,会重新建立临时文件夹 在配置文件中配置tomcat的临时目录: 写个配置类,通过@Bean的方式配置目录: 问题的原因 在Linux 系统中, ...
- STM32标准库内部Flash读写
STM32标准库FLASH读写 1. STM32内部FLASH介绍 STM32系列一般集成有内部flash,这部分内存可以直接通过指针的形式进行读取.但是由于内部flash一般存储为重要数据或程序运行 ...
- 用linux命令cd 查找想要找的文件
如果想找文件Computer下的bin文件,在终端输入绝对路径 cd /bin,不能输入 cd /Computer/bin,因为文件目录不对 文件目录可以在文件的终端看到,/bin就是正确的目录 比如 ...
- Codeforces Round 170 (Div. 1)A. Learning Languages并查集
如果两个人会的语言中有共同语言那么他们之间就可以交流,并且如果a和b可以交流,b和c可以交流,那么a和c也可以交流,具有传递性,就容易联想到并查集,我们将人和语言看成元素,一个人会几种语言的话,就将这 ...
- 探究C# dynamic动态类型本质
本周在做接口动态传参的时候思考了个问题:如何把一个json字符串,转成C#动态类? 比如由 { 'userId': 100, 'id': 1, 'title': 'hello world', 'com ...
- leaflet 领图 一个本地的类似百度地图工具-不连外网
官网:https://leafletjs.com/ 二次开发手册-中文:http://112.91.146.167:9090/api/ 领图(一款给力的开源离线地图解决方案) https://blog ...
- SQL注入详细讲解概括-GET注入、POST注入、HEAD注入
SQL注入详细讲解概括-GET注入.POST注入.HEAD注入 1.SQL注入流程 2.GET注入 3.POST注入 4.HEAD注入 一.SQL注入流程 1.SQL注入流程 · 寻找注入点-与数据库 ...