3.7 static关键字

news2025/3/4 3:11:26

思维导图:

 3.7.1 静态属性

### 3.7 static关键字

---

Java提供了一个称为`static`的关键字,用于修饰类的成员,如成员变量、成员方法和代码块。使用`static`修饰的成员拥有特殊性。

---

#### 3.7.1 静态属性

当属性被`static`关键字修饰时,该属性称为**静态属性**(又称全局属性)。不同于普通属性,静态属性属于类而不是对象,因此可以直接使用类名进行访问:

**访问格式**:
```java
类名.属性名
```

**例子**:

在`Example13.java`中,Student类有三个属性:`name`、`age`和`school`,其中`school`是一个普通属性。即使`stu1`对象的`school`属性值被修改为"B大学",其他对象的`school`属性值并不受影响。

为了使所有对象共享同一个学校名称,且当其中一个对象的学校名称发生改变时,其他所有对象的学校名称都能随之改变,我们可以将`school`属性声明为静态属性。

在`Example14.java`中,`school`属性已经被声明为静态属性。因此,当`stu1`对象的`school`属性值被修改后,所有对象的`school`属性值都被修改。

---

#### 重点结论:

1. 静态属性是类级别的,所有的实例对象共享同一个静态属性。
2. 静态属性可以直接使用类名进行访问,无需实例化对象。
3. 修改某个对象的静态属性值会影响所有其他对象的相应静态属性值。
4. 静态属性在程序启动时创建,程序结束时销毁。

---

#### 使用场景:

当某个属性需要被类的所有对象共享,并且当其中一个对象修改了这个属性的值时,希望其他所有对象的这个属性值都能随之改变时,可以使用静态属性。

---

#### 注意事项:

- 由于静态属性不依赖于任何对象,因此可以在没有创建对象的情况下访问。
- 静态属性在内存中只有一个副本,这可以帮助节省内存。
- 非静态成员不能直接访问静态成员,但静态成员可以访问非静态成员。

---

这一节的内容主要介绍了静态属性的定义、特点和使用方法。在实际编程中,静态属性经常用于存储那些与类的所有对象相关的信息,如公司名称、版本号等。

 3.7.2 静态方法

### 3.7.2 静态方法

**静态属性**

首先需要了解,当一个属性被`static`关键字修饰时,这个属性就成为了静态属性,它属于整个类而不是某个具体的对象实例。这意味着所有的对象实例共享同一个静态属性。这可以通过图3-19的示例来证实,当我们修改了`stu1`对象的`school`属性后,`stu2`和`stu3`的`school`属性也随之发生了变化。这是因为它们都引用了同一块内存空间。

**图3-20的内存分配** 

从图中可以看出,当我们修改一个对象的静态属性值时,其他所有对象的这个静态属性值都会被修改,因为它们在内存中的位置是共享的。

**关于static关键字**

- `static`关键字不能修饰局部变量,它只能修饰成员变量。如果尝试修饰局部变量,编译器会报错。

**静态方法**

在日常开发中,有时候我们希望能够在不创建对象的情况下,直接通过类名调用某个方法,此时就需要使用静态方法。要创建一个静态方法,只需要在方法声明前添加`static`关键字。

静态方法可以通过以下两种方式来访问:

1. 类名.方法
2. 实例对象名.方法

**例子:** 文件3-15展示了一个简单的例子,其中`Student`类有一个静态属性`school`和两个静态方法`getSchool()`和`setSchool()`. 在`main`函数中,我们可以看到在不创建任何对象的情况下,通过`Student`类名直接调用`setSchool()`方法来修改静态属性`school`的值。

**注意事项** 

静态方法只能访问静态成员。非静态成员需要先创建对象才能访问。这是因为,只有当对象被创建时,非静态成员才会在内存中被分配。而静态方法在被调用时不需要创建任何对象。

**结论**

- 静态属性是类级别的,所有对象实例共享同一个静态属性值。
- 静态方法可以在不创建对象的情况下被调用。
- 在静态方法内,只能直接访问静态成员,非静态成员需要通过对象来访问。

 3.7.3 静态代码块

### 3.7.3 静态代码块

**定义**:
静态代码块是使用`static`关键字修饰的代码块。它会在类被加载时执行,由于类只被加载一次,所以静态代码块也只会执行一次。通常情况下,静态代码块用于对类的成员变量进行初始化。

**示例**:
在文件3-16中,我们可以看到一个简单的例子。其中第3~5行是一个构造代码块,第6~8行是一个静态代码块。而第15~17行实例化了三个Student对象。

**执行顺序**:
当运行文件3-16时,我们可以从图3-22的输出结果看到,代码块的执行顺序是:静态代码块 → 构造代码块 → 构造方法。其中,`static`修饰的代码块是优先级最高的,它会随着class文件一同加载。

**特点**:
- 从文件3-16的输出结果中,我们可以明显看到,尽管我们实例化了三个Student对象,但静态代码块中的内容只输出了一次。这正是因为静态代码块只在类第一次被使用时加载,并且只会被加载一次。

### 3.8 本章小结
本章深入讨论了面向对象的基本知识,主要涵盖了以下内容:
1. 面向对象的核心思想。
2. 类与对象的关系,包括:
   - 类的定义。
   - 对象的创建与使用。
   - 对象的引用传递。
   - 访问控制。
3. 类的封装原理及其实现。
4. 构造方法的定义与重载。
5. `this`关键字的使用。
6. 代码块与`static`关键字的使用。

通过本章的学习,读者应能够对Java中面向对象的思想有初步的认识,为后续章节的学习打下坚实的基础。理解面向对象的核心思想对实际开发非常关键。

 

 

 

 

 总结:

### 3.7 `static`关键字总结

**重点**:

1. **定义与作用**:
    - `static`是一个关键字,用于声明静态成员(属性或方法)。
    - 静态成员属于类,而不是对象,所以它们可以在没有创建类的对象的情况下被访问。

2. **静态变量**:
    - 共享性:所有对象共享同一份静态变量,修改其中一个对象的静态变量,其他对象的静态变量值也会发生变化。
    - 生命周期:静态变量随类的加载而加载,存在于全局数据区。

3. **静态方法**:
    - 只能访问静态成员,不能访问非静态成员。
    - 通过类名或对象来访问。

4. **静态代码块**:
    - 在类被加载时执行,且只执行一次。
    - 通常用于对静态成员变量进行初始化。

**难点**:

1. **与非静态成员的区别**:
    - 静态成员是属于类的,而非静态成员属于对象。
    - 静态方法中不能直接访问非静态成员,因为非静态成员需要对象的存在。

2. **生命周期和存储区域**:
    - 静态成员的生命周期从类加载到类卸载,而非静态成员随对象的创建而存在,随对象的消失而消失。
    - 静态变量存放在全局数据区,非静态变量存放在堆内存。

**易错点**:

1. **误用静态方法**:
    - 在静态方法中尝试直接访问非静态成员会导致编译错误。

2. **静态变量误解**:
    - 误以为不同对象的静态变量是独立的,实际上所有对象共享同一静态变量。

3. **局部变量使用`static`**:
    - `static`关键字不能修饰局部变量,这是一个常见的编码错误。

4. **执行时机误区**:
    - 误以为静态代码块每次创建对象时都会执行,实际上静态代码块只在类被加载时执行一次。

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

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

相关文章

嵌入式实时操作系统的设计与开发(轮询系统学习)

轮询系统具有以下工作特点:系统完成一个轮询的时间取决于循环中需要执行的函数个数。此外,轮询的次序是静态固定的,在运行时不能进行动态调整。 典型系统 许多工业线程网络中,由于需要控制的设备较多、相互距离又较远&#xff0…

手把手教你用Python绘制神经网络图

接下来教大家如何使用 Python 中的 networkx 库,绘制美观且标准的神经网络。会根据指定的层和节点数量,绘制不同结构的神经网络。 networkx 库可以用来创建和操作图类型的数据结构,其中包括无向图、有向图、带权图等等。 神经网络可以看做是一…

字节码之 Lambda 表达式底层原理

文章目录 0.前言0. lambda程序示例1. 编译程序:2. 使用 javap 分析字节码3. 输出字节码4. 分析指令 1. Lambda 表达式的字节码实现1.1 什么是invokedynamic 指令invokedynamic 的工作原理为何 invokedynamic 如此特殊? 1.2 bootstrap method 详解1.1 Lam…

Qt之给控件添加右键菜单

一、设置控件 在对应控件的属性中,将contextMenuPolicy设置为CustomContextMenu。 二、添加槽函数 在对应控件上右键选择槽函数customContextMenuRequested(QPoint)。 三、在槽函数中添加右键菜单 在槽函数中输入如下代码,添加右键菜单。 //右键菜单 …

红帽Linux的安装和部署

目录 一、红帽Linux的安装阶段 1、下载redhat7.9的iso镜像 2、安装阶段 二、红帽Linux的配置阶段 1、第一次进入装机配置 2、进入机器后的一些配置 三、远程连接阶段 1、关闭防火墙 2、使用Xshell远程连接(其他连接工具也行) 1.开启SSH服务 2.连…

二十、【钢笔工具组】

文章目录 钢笔工具自由钢笔工具弯度钢笔工具 钢笔工具 钢笔工具在photoshop作图中是一款使用频率较高的路径工具,我们可以在窗口选项栏中将路径编辑栏打开,如果我们需要选中使用路径,需要用到后边的路径工具才能去拖动,而选择工具不能拖动&a…

9月大型语言模型研究论文总结

大型语言模型(llm)在今年发展迅速,随着新一代模型不断地被开发,研究人员和工程师了解最新进展变得非常重要。本文总结9-10月期间发布了一些重要的LLM论文。 这些论文涵盖了一系列语言模型的主题,从模型优化和缩放到推理、基准测试和增强性能…

Sigma中的数字增益放大/降低方法

1 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?加他微信hezkz17, 本群提供音频技术答疑服务

如何快速分析一款产品?

一、何时需要对一个产品进行分析? 首先,当你刚刚融入一个新的产品团队,尤其是当你需要深入了解你将负责的产品时,分析产品就显得尤为重要。这有助于你对产品的全面理解,发现其中的优势和不足,为未来的工作提…

14.5 Socket 应用组播通信

组播通信是一种基于UDP协议的网络通信方式,它允许发送方将消息同时传递给多个接收方。在组播通信中,发送方和接收方都会加入一个共同的组播组,这个组播组对应一个特定的IP地址,所有加入该组播组的主机都能够接收到发送方发送的消息…

C++概述

一、C特色 1.C是面向对象的高级程序设计语言 2.支持数据封装,将数据和对该数据进行操作的函数封装在一个类中,对象就是某一个具体的类。即类是数据封装的工具,对象是数据封装的实现。 3.具有继承性 4.具有函数重载 二、拓展介绍 1.C标准&a…

基于音频SOC开发板的主动降噪ANC算法源码实现

基于音频SOC开发板的主动降噪ANC算法源码实现 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,+群附加赠送降噪开发资料,

IO流:java中解码和编码出现乱码说明及代码实现

IO流:java中解码和编码的代码实现 一、UTF-8和GBK编码方式二、idea和eclipse的默认编码方式三、解码和编码方法四、代码实现编码解码 五、额外知识扩展 一、UTF-8和GBK编码方式 如果采用的是UTF-8的编码方式,那么1个英文字母 占 1个字节,1个…

深度学习-优化算法与梯度下降

文章目录 前置知识指数移动平均EMAL2正则(L2 Regularization)权重衰减(Weight Decay) 优化器SDGMomentumNAGAdagradRMSPropAdaDeltaAdamAdamW综上 学习率StepLRMultiStepLRExponentialCosineAnealingRLROP(ReduceLRonPlateau)lambda总结 前置…

【图像处理】图像配准、图像增强和图像分割研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

网络编程基础知识总结——IP,端口,协议

目录 1. 什么是网络编程? 2. 网络编程的三要素 3. IP 3.1 IP地址的概念 3.2 IP地址的分类 3.3 IPv4解析 3.4 Ipv6解析 4. IPv4 的使用细节 5. 特殊IP地址 4. 端口号 5. 协议 5.1 UDP协议 5.2 TCP协议 1. 什么是网络编程? 总的来说就是一句…

RuntimeWarning: More than 20 figures have been opened

在画图操作结束后使用plt.close(all)语句,但是此时图像仍然不能正常显示,之前是可以正常显示的,然后又在最后的画图的部分添加plt.show()语句,可以正常显示图像并且不再出现警告了。

Android---DVM以及ART对JVM进行优化

Dalvik Dalvik 是 Google 公司自己设计用于 Android 平台的 Java 虚拟机,Android 工程师编写的 Java 或者 Kotlin 代码最终都是在这台虚拟机中被执行的。在 Android 5.0 之前叫作 DVM,5.0 之后改为 ART(Android Runtime)。在整个…

oracle创建数据库,导入dmp操作全家桶

背景:小明在一家IT公司就职,通过查看项目,公司使用的是oracle,几天后,经理要求他从服务器导入数据库到公司服务器,聪明的小明就开始干了起来,整理如下教程。 说明:此次演示环境oracl…

【LeetCode力扣】297. 二叉树的序列化与反序列化

目录 1、题目介绍 2、解题思路 2.1、详细过程图解 2.2、代码描述 2.3、完整代码 1、题目介绍 原题链接:297. 二叉树的序列化与反序列化 - 力扣(LeetCode) 示例 1: 输入:root [1,2,3,null,null,4,5] 输出&#…