Java入门最小必要知识:变量及其本质

编程语言是与计算机交流的桥梁,而在编程世界中,变量是这座桥上不可或缺的砖石。

从本质上,可以把复杂的编程工作简化为两件事

  • ①定义变量
  • ②操作变量

可见,变量之于编程的重要性。

对于Java开发者,理解和掌握变量是必不可少的,重要的知识通常是简单的,从以下几个方面学习变量,就可以快速掌握变量:

  • ①概念
  • ②本质
  • ③变量的类型
  • ④变量的生命周期与作用域

1. 变量的定义

在Java中,变量是程序中存储数据的最基本单元,❶它有一个特定的数据类型(如int、double等),❷并被赋予一个标识符(即变量名),用于在程序的不同部分引用该存储位置的数据。

可以将其想象成一个容器,用来存放各种类型的信息,这些信息在程序执行过程中可能会发生变化。

示例

int age = 25; // 定义了一个名为age的整型变量,并初始化为25age = 38; // 定义变量后,在变量的生命周期和作用域内,可以修改变量的值

2. 变量的本质

变量的本质在于其背后的内存管理

当你在Java中声明一个变量时,编译器会在内存中为其❶分配一块空间。这块空间的❷大小由变量的数据类型决定。变量名则是一个地址标签,指向这块内存空间。赋值操作实际上是将值存入这个内存地址中。因此,❸改变变量的值,实际上是改变了该内存地址所存储的内容。

为了加深理解,结合编译后的字节码,分析变量在运行时的本来面目。

以代码int number = 38;为例,要查看其字节码,可以编写一个Variable的类:
在这里插入图片描述
然后使用javac编译代码:

javac Variable.java

对于编译结果,使用JDK自动的反编译命令javap:

javap -c Variable

执行这个命令后,可以看到如下输出,红框部分是int number = 38;的字节码:
其可能的字节码如下:

0: bipush 38:这将数字 38 推入操作数栈。
2: istore_1:这将操作数栈顶的值(即数字 38)存储到局部变量表中索引为 1 的位置。

下图画出了这行代码运行时涉及的两个内存区域,sipush对应图中①,表示把38这个数字存放到操作数栈的栈顶,注意,操作数栈也是内存。

istore_1对应图中②,表示把38这个数字从操作数栈弹出,存入内存的局部变量表区域,1表示变量序号,因为我们只定义了变量,编译器给这个变量分配的序号就是1。特别说明,在实例方法中,序号0默认存储this变量。从这里可以看出,运行过程中,变量名会被替换为序号。
在这里插入图片描述

3. 变量的类型

在Java中,有三种变量类型:

在这里插入图片描述
① 实例变量。直接定义在类中,但在任何方法之外的变量。其至少由三部分构成:访问修饰符、变量类型、变量名。
② 静态变量。和实例变量一样,直接定义在类中,但在任何方法之外的变量。区别在于,定义时多了static关键字。其至少由三部分构成:访问修饰符、变量类型、变量名、static关键字。
③ 局部变量。在方法、构造器或块中定义的变量,没有访问修饰符。其至少由两部分构成:变量类型、变量名。

4. 变量的生命周期与作用域

生命周期

变量的生命周期指的是从创建到销毁的整个过程。在Java中,变量的生命周期与其所在的作用域紧密相关。

  • 局部变量:在方法、构造器或块中定义的变量,其生命周期始于所属代码块的执行开始,止于该代码块执行完毕。每次方法调用都会创建新的局部变量副本。
  • 实例变量:其生命周期与对象的生命周期相同,即从对象创建时开始,至对象被垃圾回收时结束。
  • 静态变量(类变量):使用static关键字定义的变量,属于类而不是对象。这类变量在类加载时创建,在类卸载时销毁,只有一份,被所有实例共享。

作用域

作用域决定了变量的可见性和可访问性。

  • 局部作用域:局部变量只在其声明的方法、构造器或代码块内可见。
  • 类作用域:实例变量在整个类中都可见,但要通过对象实例访问。
  • 全局作用域(静态作用域):静态变量在整个类中都可见,可以通过类名直接访问,无需实例化对象。

示例

public class ScopeDemo {static int globalVar = 10; // 静态变量,全局作用域public void method() {int localVar = 5; // 局部变量,仅在此方法内有效System.out.println(globalVar); // 可以访问全局变量System.out.println(localVar); // 访问局部变量}public static void main(String[] args) {ScopeDemo demo = new ScopeDemo();demo.method(); // 调用method,局部变量localVar被创建并使用后销毁System.out.println(globalVar); // 可以直接访问静态变量}
}

通过上述内容,我们简要探讨了Java中变量的定义、本质、生命周期以及作用域。理解这些基础概念,不仅能够帮助我们写出更清晰、高效的代码,也是深入学习面向对象编程、数据结构和算法等高级主题的基石。

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

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

相关文章

阿里云 物联网平台 MQTT连接、数据传输

阿里云 物联网平台 MQTT连接、数据传输 1、设备连接阿里云 2、多设备之前的通信、数据流转 3、设备数据来源的读取。 基于C# winform 开发上位机,读取设备、仪器、MES或者电子元器件的数据,MQTT传输至阿里云平台,可视化界面构建界面&#…

华为OD介绍

概念 华为OD是华为提出的一种新的用工方式,其全称是Outsourcing Dispacth,也可以简写为ODP,是华为和北京外企德科人力资源服务上海有限公司联合招聘的简称。华为OD岗位属于华为外包员工的一种,仅限于软件研发类岗位,类…

1065: 无向图的连通分量计算

解法&#xff1a; dfs求连通性 1.设节点表vis[] 2.遍历节点表dfs标记&#xff0c;每次得到一个连通分量 #include<iostream> #include<vector> using namespace std; int arr[100][100]; void dfs(vector<bool>& vis, int v) {//不用终止条件&#x…

StringRedisTemplate使用

文章目录 一&#xff0c;StringRedisTemplate介绍二&#xff0c;StringRedisTemplate使用1.字符串&#xff08;String&#xff09;&#xff1a;2.哈希&#xff08;Hash&#xff09;&#xff1a;3.列表&#xff08;List&#xff09;&#xff1a;4.集合&#xff08;Set&#xff0…

省级生活垃圾无害化处理率面板数据(2004-2022年)

01、数据简介 生活垃圾无害化处理率是指经过处理的生活垃圾中&#xff0c;达到无害化标准的垃圾所占的比例。这一指标是衡量城市垃圾处理水平的重要标准&#xff0c;反映了城市对垃圾进行有效管理和处理的能力。 生活垃圾无害化处理的主要方式包括生活垃圾焚烧、生活垃圾卫生…

金三银四面试题(二十八):观察者模式知多少?

什么是观察者模式 观察者模式&#xff08;Observer Pattern&#xff09; 是一种设计模式&#xff0c;它定义了一种一对多的关系&#xff0c;让多个观察者对象能够同时监听一个主题对象。当主题对象的状态发生变化时&#xff0c;会通知所有观察者对象&#xff0c;使它们能够作出…

Sass:强大而灵活的CSS预处理器详解

Sass&#xff1a;强大而灵活的CSS预处理器详解 在前端开发的世界里&#xff0c;CSS&#xff08;层叠样式表&#xff09;作为样式描述语言&#xff0c;为我们提供了丰富的样式定义和布局方式。然而&#xff0c;随着项目规模的不断扩大和复杂度的提升&#xff0c;原生CSS的编写和…

C++:完美转发(二)(std::forward)

一、RVO优化和std::move、std::forward 以下是一个综合性的例子&#xff1a; #include <iostream> #include <memory> #include <ostream> using namespace std;// 1. 针对右值引用实施std::move&#xff0c;针对万能引用实施std::forward class Data {};c…

react之Reducer和Context的联合使用

第三章 - 状态管理 使用 Reducer 和 Context 拓展你的应用 Reducer 可以整合组件的状态更新逻辑。Context 可以将信息深入传递给其他组件。你可以组合使用它们来共同管理一个复杂页面的状态。 结合使用 reducer 和 context 在 reducer 介绍 的例子里面&#xff0c;状态被 r…

如何修复Windows中的“无Internet,安全”错误?这里有详细步骤

序言 在Windows计算机上连接到互联网非常容易,但是,当你尝试连接到网络时,Windows有时可能会显示消息“无Internet,安全”。此消息的确切含义是什么?如何修复?以下是你需要了解的所有信息。 为什么Windows显示“无Internet,安全”消息 “无Internet,安全”消息是一个…

简约在线生成短网址系统源码 短链防红域名系统 带后台

简约在线生成短网址系统源码 短链防红域名系统 带后台 安装教程&#xff1a;访问 http://你的域名/install 进行安装 源码免费下载地址抄笔记 (chaobiji.cn)https://chaobiji.cn/

图像分割各种算子算法-可直接使用(Canny、Roberts、Sobel)

Canny算子&#xff1a; import numpy as np import cv2 as cv from matplotlib import pyplot as pltimg cv.imread("../test_1_1.png") edges cv.Canny(img, 100, 200)plt.subplot(121),plt.imshow(img,cmap gray) plt.title(Original Image), plt.xticks([]), …

MySQL数据库之UNION 和JOIN连接的区别?

UNION和JOIN连接是用于合并表中数据的两种不同方法。 1、JOIN连接&#xff1a; 用于在查询中将两个或多个表中的行基于它们之间的关联条件进行匹配。JOIN操作允许您将来自不同表的相关数据组合到一起&#xff0c;以便一次性检索所有相关信息。JOIN操作通常涉及使用ON子句指定…

电文加密(C语言)

一、题目说明&#xff1b; 即第1个字母变成第26个字母&#xff0c;第i个字母变成第(26 - i 1)个字母&#xff0c;非字母字符不变。 二、N-S流程图&#xff1b; 三、运行结果&#xff1b; 四、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h&g…

C语言深入理解指针(4)--指针笔试题解析

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 C语言深入理解指针(4) 收录于专栏【C语言学习】 本专栏旨在分享学习C语言学习的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. size…

【机器学习300问】79、Mini-Batch梯度下降法的原理是什么?

Mini-Batch梯度下降法是一种将训练数据集分成小批次进行学习的优化方法&#xff0c;通过这种方式&#xff0c;可以有效地解决内存限制问题并加速学习过程。 一、为什么要使用Mini-Batch&#xff1f; 在机器学习尤其是深度学习中&#xff0c;我们常常面临海量数据处理的问题。如…

吴恩达 深度学习 神经网络 softmax adam 交叉验证

神经网络中的层&#xff1a;输入层&#xff08;layer 0&#xff09;、隐藏层、卷积层&#xff08;看情况用这个&#xff09;、输出层。&#xff08;参考文章&#xff09; 激活函数&#xff1a; 隐藏层一般用relu函数&#xff1b; 输出层根据需要&#xff0c;二分类用sigmoid&…

ExcelVBA在选择区域(有合并)中删除清除空行

【问题】 关于删除空行&#xff0c;以前是用函数来完成工作的&#xff0c; 今天有人提出问题&#xff0c;传来这个文件&#xff0c; 现有数据&#xff0c;1w多行&#xff0c;其中有部分列有不同合并单元格&#xff0c;跨行也不一样。如果要进行筛选删除空行&#xff0c;有一定的…

matlab使用教程(70)—修改坐标区属性

1.控制坐标轴长度比率和数据单位长度 您可以控制 x 轴、y 轴和 z 轴的相对长度&#xff08;图框纵横比&#xff09;&#xff0c;也可以控制一个数据单位沿每个轴的相对长度&#xff08;数据纵横比&#xff09;。 1.1图框纵横比 图框纵横比是 x 轴、y 轴和 z 轴的相对长度。默认…

【二叉树算法题记录】404. 左叶子之和

题目描述 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 题目分析 其实这题无论是迭代法还是递归法&#xff0c;最重要的是要明确判断左叶子的条件&#xff1a;当前节点有左孩子&#xff0c;且这个左孩子没有它的左孩子和右孩子。 迭代法 感觉只要二叉树相关…