【Java 学习】详讲 局部变量、成员变量

【Java 学习】详讲 局部变量、成员变量

1. 什么是成员变量?什么是局部变量?

局部变量成员变量是两种常见的变量类型,它们在作用域、生命周期、初始化等方面有显著的区别。理解这两者的区别对于编写清晰和高效的 Java 程序至关重要。

创建一个类,在类中创建成员变量,然后创建对象,打印出对象的成员变量:

publicclassPhone{String brand;// 品牌String color ;// 颜色int memory;// 内存// 程序的开始publicstaticvoidmain(String[] args){Phone p =newPhone();System.out.println("brand:"+ p.brand);System.out.println("color:"+p.color);System.out.println("memory:"+p.memory);}}
在这里插入图片描述


不初始化,而打印出了值

在这里插入图片描述

创建局部变量,然后打印局部变量:

publicstaticvoidmain(String[] args){String brand;// 品牌String color ;// 颜色int memory;// 内存System.out.println("brand:"+ brand);System.out.println("color:"+ color);System.out.println("memory:"+ memory);}
在这里插入图片描述


不初始化就会报错

通过上述的两个测试,我们可以发现,在类中创建的成员变量有默认值,即,成员变量不用初始化就会有一个值,而局部变量必须手动赋值。

2. 成员变量

2.1 定义和特点

成员变量是类中的字段(属性),它们是类的组成部分。

成员变量有两种类型

  1. 实例变量 (Instance Variables):属于类的实例(对象),每个对象有一份独立的实例变量。
  2. 类变量 (Class Variables):使用 static 关键字声明,属于类本身,而不是类的任何实例。

2.2 实例变量

  1. 实例变量是类中定义的字段,每个类的实例(对象)都有自己的实例变量副本。
  2. 实例变量在对象创建时被分配内存,每个对象都有独立的实例变量。
  3. 实例变量具有默认值:如果未显式初始化,实例变量会根据其类型自动赋予默认值(例如,int 类型默认为 0,boolean 默认为 false,对象引用类型默认为 null)。
  4. 实例变量在类的实例化期间存在,当对象被销毁时,实例变量也会被销毁。

示例:

publicclassExample{privateint x;// 实例变量 默认值为0publicvoidprintX(){System.out.println(x);// 访问实例变量}}

在这个例子中,x 是实例变量。每当你创建一个 Example 对象时,都会为每个对象分配一个 x 变量,并且每个对象有自己的 x 值。

2.3 类变量

  1. 类变量使用 static 关键字声明,它们属于类本身,而不是类的实例。
  2. 类变量在类加载时就会被初始化,并且所有类的实例共享同一个类变量。
  3. 类变量有默认值,如果未显式初始化,它们也会被赋予默认值(与实例变量相同)。

示例:

publicclassExample{staticint count;// 类变量publicvoidincrement(){ count++;// 访问类变量}}

在这个例子中,count 是类变量。所有Example 类的实例共享同一个 count 变量,类变量在类加载时初始化。

2.4 成员变量的默认值

数据类型默认值
byte0
char‘\u0000’
short0
int0
long0L
booleanfalse
float0.0f
double0.0
referencenull

3. 局部变量

3.1 定义和特点

  1. 局部变量是在方法、构造方法、或者代码块内定义的变量。
  2. 局部变量的作用域仅限于它们被声明的代码块或方法。
  3. 局部变量没有默认值,必须在使用前初始化。
  4. 局部变量的生命周期从其定义开始,到方法或者代码块执行完毕时结束。换句话说,局部变量只存在于方法或代码块的执行过程中,一旦方法返回或代码块执行完毕,局部变量会被销毁。

3.2 示例和说明

publicclassExample{publicvoidmyMethod(){int x =10;// x 是局部变量 必须要被初始化System.out.println(x);// 可以使用局部变量}}

在这个例子中,x 是局部变量,它只在 myMethod() 方法内部存在。当方法执行完毕,x 会被销毁。

关键特点

  • 作用域:局部变量的作用域限制在其所在的方法、构造方法或代码块内。
  • 初始化:局部变量在使用前必须被显式初始化。否则,编译器会报错。
  • 生命周期:局部变量的生命周期是方法或者代码块的执行周期,即方法/代码块开始执行时创建,结束时销毁。

注意事项

  • 局部变量的作用域仅限于方法内,因此它不能被方法外部访问。
  • 局部变量不能声明为 static,因为它的生命周期与方法的调用有关,而不是与类的实例或类本身的生命周期有关。

4. 局部变量 vs 成员变量

特性局部变量成员变量 (实例变量/类变量)
定义位置方法、构造器、代码块中类中,方法外
初始化必须显式初始化会自动初始化为默认值(实例变量/类变量)
作用域仅限于所在的方法/代码块实例变量:限于对象;类变量:限于类
生命周期方法/代码块执行期间实例变量:对象的生命周期;类变量:类的生命周期
访问修饰符无法使用访问修饰符可以使用访问修饰符 publicprivate
是否与类相关实例变量与对象相关;类变量与类本身相关
静态关键字不可以是 static类变量必须是 static

局部变量:只在方法、构造方法、或代码块内有效,必须显式初始化,并且生命周期仅限于方法或代码块执行时。

成员变量:包括实例变量和类变量,实例变量属于对象,类变量属于类,成员变量有默认值,生命周期较长,且可以使用访问修饰符来控制访问权限。

Read more

深入探究 Linux 设备树

深入探究 Linux 设备树

引言 在上一篇文章《深入探究 Linux 总线-设备-驱动模型》中,我分别介绍了总线、设备和驱动这三个部分,并对相应的内核源码进行了分析,还描述了他们之间的协同工作关系,说白了,其实这三个部分是互成掎角之势的。 如下图,左边是驱动,就是我们自己写的逻辑代码,告诉内核操作这个设备的方法。 右边是设备,它是用来描述硬件资源的一种数据结构,负责告诉内核这是哪种类型的设备,地址在哪,中断号是多少,但有一点要注意,这里的设备指的并不是我们日常生活中的使用的硬件设备,而是内核中的 struct device 结构体。 中间是总线,用来匹配驱动和设备的,这里的匹配过程是有优先级的(上一篇文章的1.2节讲过),但这并不是现在的重点,只需要知道总线通过比较二者一个特殊的字符串是否相同来决定他们能否匹配成功,这个特殊的字符串到底是什么取决于优先级。 驱动代码是咱们自己写的,咱们当然熟了,但是那个跟驱动配对的 struct device,如果只是单纯的去写一个驱动,而不深入底层去探究原理,其实你会发现对这个结构体并没有什么印象,那么问题就来了,它到底是怎么进入内核并与驱动进行配对的呢? 如果在用

By Ne0inhk
我把OpenClaw调教成了能替我干活的AI员工,以后上班可以摸鱼了!

我把OpenClaw调教成了能替我干活的AI员工,以后上班可以摸鱼了!

手把手教你一键部署OpenClaw(Clawdbot),2分钟搞定! 网上教你装OpenClaw(小龙虾)的文章满大街都是,但装好后怎么让它真正派上用场,几乎没人讲透。 这半个月我为了折腾搜索、浏览器、文件同步和人格配置,前前后后烧掉不少钱,最后理出了这份实战清单。 文章挺长,建议把配置方法直接丢给你家的AI,让它手把手带你弄。 动手之前,咱们先得换个思路:别把小龙虾当成ChatGPT那种助手,把它想成你刚招的一个远程员工。 既然是员工,你就得给人家配电脑、开网络、装工具,还得讲清楚你是谁、你平时干活的习惯是什么。 下面分享的,就是我给这位“远程同事”搭工位的全过程。 手把手教你一键部署OpenClaw(Clawdbot),2分钟搞定! 一、 准备工作:电脑、大脑、部署 1、 搞台云服务器 首先,小龙虾得有个安身立命的电脑。 虽然很多人喜欢部署在Mac mini或者闲置本子上,但我更建议买云服务器。 服务器24小时不关机,你随时随地都能用,不像家里的电脑关了就断了。 这里有两个坑得避开: 第一,

By Ne0inhk
Python+AI 实战:搭建属于你的智能问答机器人

Python+AI 实战:搭建属于你的智能问答机器人

欢迎文末添加好友交流,共同进步! “ 俺はモンキー・D・ルフィ。海贼王になる男だ!” 引言 * 在数字化转型浪潮中,智能问答机器人正成为企业客服、知识库检索乃至个人助理等场景的关键交互入口。它能让员工秒级获取技术解答、客户即时获得业务支持、学习者随时得到个性化辅导,极大提升信息获取效率与用户体验。 * 为何选择 Python 与开源 AI 模型?Python 拥有成熟的 AI 生态——Hugging Face Transformers、LangChain、FAISS 等工具大幅降低开发门槛;而本地部署的开源大模型(如 Phi-3、Mistral、Llama 系列)则保障了数据隐私、规避了 API 成本,特别适合对安全性或离线能力有要求的场景。 * 本文将手把手带你从零构建一个基于 RAG(检索增强生成)架构的本地智能问答系统:使用 Sentence-BERT 实现语义检索,FAISS 作为向量数据库,并集成轻量级开源语言模型生成答案。

By Ne0inhk

Flutter 三方库 bip39 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、稳健的工业级助记词生成与确定性分层秘钥引擎

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 bip39 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、稳健的工业级助记词生成与确定性分层秘钥引擎 在鸿蒙(OpenHarmony)系统的加密钱包、隐私文件保护或去中心化身份(DID)应用中,如何构建一套符合国际标准的、易于离线备份且可恢复的秘钥体系?bip39 为开发者提供了一套完整的助记词(Mnemonic Code)生成与种子(Seed)推导方案。本文将深入实战其在鸿蒙安全域内的应用。 前言 什么是 BIP39?它是比特币改进建议(Bitcoin Improvement Proposal)中的第 39 号提案。它的核心思想是将原本难以记忆的二进制秘钥转化为 12 或 24 个常见单词。在 Flutter for OpenHarmony 的实际开发中,利用该库,我们可以让鸿蒙用户通过备份一组“

By Ne0inhk