深入理解 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.让客户端程序员无法触及他们不应该触及的部分 ...
随机推荐
- pep8相关规范
https://www.jianshu.com/p/ffcc66bab3ce 导包规范: 1.首先是标准库,如 import os 2.然后是第三方库,如 from django.conf impor ...
- 【Azure Redis 缓存】Azure Cache for Redis 是否记录具体读/写(Get/Set)或删除(Del)了哪些key呢?
问题描述 在Azure Redis的门户活动日志中,可以查看到的是对于Redis资源本身的操作.但是对于客户端连接到Redis服务后,对服务所做出的读写,或删除操作,是否有日志可以查看到呢? 问题回答 ...
- .Net之配置文件自定义
前文讲获取配置文件内容的时候,是获取默认的appsettings.json配置文件的配置,下面说明下如何进行自定义配置文件获取 1. Json Provider 1.1 构建独立的IConfigura ...
- Redis高级数据类型
## 1.Redis相关配置信息 服务器端设定 设置服务器以守护进程的方式运行 daemonize yes|no 绑定主机地址 (只能此ip访问) bind 127.0.0.1 设置服务器端口号 po ...
- vscode 自动格式化md文件,搞得很是郁闷,加入 [markdown] 自定义配置 "editor.formatOnSave": false 搞定了。
上下文: vscode做vue的项目开发,需要对代码进行格式化,用的vetur插件 正常来讲,代码保存的时候,需要进行格式化,所以配置文件会写成 "editor.formatOnSave&q ...
- Debian打开架构支持
第一步检查内核有没有 AMD和i386 dpkg --list | grep linux-image 会出现现在电脑上的内核,可以看到支持的架构 dpkg --print-foreign-archi ...
- 360Linux 运维工程师面试真题
360Linux 运维工程师面试真题 首先我们来看下 360Linux 运维工程师招聘岗位要求: [岗位定义]运维工程师 [岗位薪资]15K-25K [基本要求]北京 / 经验不限 / 本科及以上 / ...
- CAST电子部单片机方向授课——串口通信 预习文档
CAST电子部单片机方向授课--串口通信 预习文档 课前小准备 安装串口调试助手 第一步:进入Microsoft Store 第二步:在Microsoft Store中搜索 "串口调试助手& ...
- linux文件编辑
1.VIM基本概述 1.什么是VIM? vi和vim是Linux下的一个文本编辑工具.(可以理解为windows的记事本,或word文档) 2.为什么要使用VIM? 因为Linux系统一切皆为文件,而 ...
- Linux快速入门(七)效率工具(Vim)
Vim编辑器 所有的Linux系统都会内建一个Vi文本编辑器,而Vim是从Vi发展出来的一个高度可配置的文本编辑器,旨在高效的创建和更改任何类型的文本,它还可以根据文件的扩展名判别编程语言. 使用方式 ...