Java学习笔记14——常量与变量

曾和儿子分享过所谓计算机程序,都是编写代码进行“数据处理和处理数据”而已。任何编程语言编写何种应用,数据都必须以某种方式表示。掌握变量和常量的用法,可以使代码的可维护性、可读性大大提高。

一、常量

常量就是在程序中固定不变的量,一旦被定义,它的值就不能再被改变。

1、声明常量

在定义常量时需要对常量进行初始化,初始化后,常量的值是不允许再进行改变的。在Java语言中,为了区别常量与变量,常量名称通常用大写字母。声明常量使用final关键字,语法为:

final  数据类型 常量名称  [= 初始化的值 ]

2、常量应用示例

当常量用于一个类的成员变量时,必须给常量赋值,否则会出现编译错误。

如下代码示例,在类中声明一个常量PRICE,并在main()方法中打印它的值。

public class Zoo {static final float PRICE = 2.5F;public static void main(String[] args) {System.out.println("动物园门票价格是:" + PRICE + "元。");}
}

上面代码中,定义了常量PRICE,并赋给初始值,在主函数中打印PRICE的值。

二、变量

在程序中存在大量的数据来代表程序的状态,其中有些数据的值在程序的运行过程中会发生改变,这种数据被成为变量。在程序中通过改变变量的值来实现程序的逻辑功能。

1、声明变量

在Java语言中,所有的变量在使用前必须先声明,声明多个变量时使用逗号隔开(建议每行声明一个变量),分号结尾,基本格式如下:

类型  变量名 [ = value], 变量名 [ = value], 变量名 [ = value] ;

int x,y,z;                  // 声明3个int类型变量:x,y,z
int a = 3, b = 4, c = 5;    // 声明3个整数a、b、c变量并赋初始值
byte z = 22;                // 声明并初始化字节型变量z
String s = "Java example";  // 声明并初始化字符串型变量s
double pi = 3.14;           // 声明双精度浮点数变量pi,并赋值
char x = 'a'                // 声明字符型变量x,并赋值‘a’,使用单引号

一个知识点:

声明一个变量时,编译程序会在内存里开辟一块足以容纳这个变量的内存空间给它。不管变量的值如何改变,都永远使用相同的内存空间。因此,要学会使用变量,它是一种节省内存的方式。常量是不同于变量的一种类型,它的值是固定的,如整数常量、字符串常量。通常给变量赋值时,会将常量赋值给它。

2、变量的分类

变量是有作用范围的,一旦超出它的范围,就再无法使用这个变量(被分配的内存会给回收)。

按照作用范围进行划分,Java中的变量分为成员变量、局部变量和类变量。

1)成员变量

成员变量声明在一个类中,在方法、构造方法和语句块之外。它的作用范围是整个类,也就是在这个类中都可以访问。当一个对象被实例化之后,每个成员变量的值就跟着确定。

成员变量在对象建立的时候创建,在对象被销毁的时候销毁。成员变量可以直接通过变量名访问,但在静态方法以及其它类中,就要通过类的引用访问。

成员变量的值应该至少被一个方法、构造函数或者语句块引用,使得外部能够通过这些方式获取成员变量的信息。

访问修饰符可以修饰成员变量,成员变量对于类中的方法、构造函数或者语句块是可见的。一般情况下应该把成员变量设为私有(private)。通过使用访问修饰符可以使成员变量对子类可见(public,protected)。

成员变量具有默认值,数值型变量的默认值是0,布尔型变量默认值是false,引用类型变量的默认值是null。

成员变量的值可以在声明时指定,也可以在构造方法中指定。如果没有指定,则使用默认值;如果通过上面方式指定(初始化),则对象创建时,默认值是初始值。

public class MemberVar {private int age; // 声明私有的成员变量,仅在该类中可见public void setAge(int a) {age = a;}public void printMember() {System.out.println("我儿子的年龄是:" + age);}public static void main(String[] args) {MemberVar emp = new MemberVar();emp.setAge(19);emp.printMember();;}}

上面代码声明的成员变量age,使用了private修饰符,它只能在MemberVar类中访问。但是可以在MemberVar类中定义相关方法,通过此类创建的对象来访问。

2)局部变量

局部变量是在方法、构造函数或者语句块中声明,它们在所在方法、构造方法、语句块被执行的时候创建,当该方法、构造方法、语句块执行完毕后,变量将会被销毁。访问修饰符不能用于局部变量,局部变量只在声明它的方法、构造方法、语句块中可见。

系统不会给局部变量没有默认值,所以局部变量被声明后,必须经过初始化进行赋值后才能使用,否则会出现编译错误。

3)类变量(静态变量)

类变量,也称为静态变量,在类中使用static关键字声明,但必须在方法、构造方法、语句块之外。无论一个类创建多少个对象,类只拥有静态变量的一份拷贝(只在内存中有一个地址指引)。静态变量的访问格式一般是:

类名.类变量名

类变量和成员变量特别相似,一旦声明(未赋值),会有默认值。数值型变量的默认值是0,布尔型变量默认值是false,引用类型变量的默认值是null。

类变量的值可以在声明时指定,也可以在构造函数中指定(赋值)。除此之外,还可以在静态语句块中初始化(使用static 关键字和{} 中定义的代码块,会在类初次加载时运行)。

在当前类中访问类变量(静态成员变量)可以不加类名直接访问,也可以使用“类名.静态成员变量名)方式访问。但是其它类想要访问静态变量,必须使用“类名.静态变量名”来引用。

3、Java中静态变量(类变量)和成员变量的区别

Java中静态变量(类变量)和成员变量的区别是否被static关键字修饰,被static关键字修饰的叫静态变量(类变量),否则即成员变量。两者的区别是:

(1)静态变量在内存中只有一份拷贝(节省内存),JVM只为静态变量分配一次内存,在加载类的过程中完成静态变量的内存分配及初始化默认值,可以通过类名直接访问。

(2)成员变量是每创建一个对象,就会为成员变量分配一次内存。创建多个对象,成员变量就有多个拷贝,互不影响。成员变量属于每个对象,而静态变量属于这个类创建的所有对象共享。

public class QuBieVar {private static int staticInt = 0;  // 定义静态变量,并赋值0private int random = 0;  // 定义成员变量,并赋值0public QuBieVar() {  // 构造方法中初始花静态变量和成员变量staticInt++;  // 静态变量自加1random++;     // 成员变量自加1System.out.println("静态变量staticInt的值:" + QuBieVar.staticInt);System.out.println("成员变量random的值:" + random);System.out.println("");}public static void main(String[] args) {QuBieVar test1 = new QuBieVar();QuBieVar test2 = new QuBieVar();}}

运行上面代码的结果是:

静态变量staticInt的值:1
成员变量random的值:1

静态变量staticInt的值:2
成员变量random的值:1

在上面代码中,无论创建多少个类QuBieVar的对象,永远都只分配一个staticInt变量,所有对象都共享这个变量(对应的同一个内存地址),所有对象修改这个静态变量,都将发生变化;但是创建的任何类的对象,都会分配一个专属的成员变量random,互不影响,因为被分配在不同的内存,有不同的内存指引。

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

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

相关文章

C语言scandir函数获取文件夹内容

scandir 函数用于列举指定目录下的文件列表,并将结果存储在一个动态分配的数组中。 函数原型: int scandir(const char *dirpath, struct dirent ***namelist,int (*filter)(const struct dirent *),int (*compar)(const struct dirent **, const stru…

labview中6种机械动作的区别

1.单击时转换:单击时转换,需要手动转换或者赋值回复原来状态; 2.释放时转换:释放时时转换,需要手动转换或者赋值回复原来状态; 3.单击时转换保持到鼠标释放:触发两次,自动恢复原来状…

Python互斥锁实例(包含超时解锁)

Python互斥锁实例(包含超时解锁) 文章目录 前言正文1 锁被占用直接返回2 拿不到锁则一直等待3 拿不到锁等待直到超时 总结 前言 最近遇到一个小需求,大概是请求机器人&自动化设备执行某些功能,这些功能之间有共同操作资源或在…

Linux:导出环境变量命令export

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Linux中的内建命令export命令用于创建一个环境变量,或将一个普通变量导出为环境变量,并且在这个过程中,可以给该环境变量赋值。 下面…

多数问题求解之蒙特卡洛与分治法

多数问题(Majority Problem)是一个有多种求解方法的经典问题,其问题定义如下: 给定一个大小为 n n n的数组,找出其中出现次数超过 n / 2 n/2 n/2的元素 例如:当输入数组为 [ 5 , 3 , 5 , 2 , 3 , 5 , 5 ] […

【WPS】压缩图片

第一步: 点击插入,点击图片 第二步: 点击图片工具,点击压缩图片 第三步:

Vue3 前端生成随机id( 生成 UUID )

效果展示 封装工具(代码展示) 重新创建一个文件**/utils/someTools.js**,并在里面写入如下代码。 function Tools() {}Tools.prototype.guid function () {return xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx.replace(/[xy]/g, function (c) {v…

jQuery模态框弹窗提示代码

jQuery模态框弹窗提示代码 下载地址 jQuery模态框弹窗提示代码

GPT每日面试题—Vue中style的scoped是如何实现样式隔离的

充分利用ChatGPT的优势,帮助我们快速准备前端面试。今日问题:Vue中style的scoped是如何实现样式隔离的。 Q:在前端面试中,如果被问到,vue文件中的scoped是如何实现样式格式的,什么回答比较好,全…

Requests教程-17-请求代理设置

上一小节我们学习了requests解决乱码的方法,本小节我们讲解一下requests设置代理的方法。 代理基本原理 代理实际上指的就是代理服务器, 英文叫作proxy server ,它的功能是代理网络用户去取得网络信息。形象地说,它是网络信息的中…

【阿里云系列】-基于云效构建部署Springboot项目到ACK

介绍 为了提高项目迭代的速度加速交付产品给客户,我们通常会选择CICD工具来减少人力投入产生的成本,开源的工具比如有成熟的Jenkins,但是本文讲的是阿里云提高的解决方案云效平台,通过配置流水线的形式实现项目的快速部署到服务器…

【数据结构】双向链表及LRU缓存的实现

目录 前言 1. 在原有的自定义链表类 Linked 的基础上,添加新的 “节点添加”方法 addNode(Node node) 测试用例 测试结果 2. 在自定义链表类的基础上,使用双重循环“强力” 判断两个节点是否发生相交 测试用例 测试结果 3. 在自定义链表类的基础上…

突破编程_C++_面试(STL 编程 list)

面试题 1 :描述 std::list 的内部数据结构是什么,以及它如何影响性能? std::list 的内部数据结构是一个双向链表。这意味着它是由一系列节点组成的,每个节点都包含两部分:一部分是存储实际数据的数据域,另…

每日OJ题_哈希表⑤_力扣49. 字母异位词分组

目录 力扣49. 字母异位词分组 解析代码 力扣49. 字母异位词分组 49. 字母异位词分组 难度 中等 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入…

基于opencv的手势识别

当然可以,下面是一个使用OpenCV实现简单手势识别,并在摄像头捕捉的视频中描绘出手部轮廓为线条的示例。该代码会读取摄像头流,然后检测出手部,并用线条描绘出手的轮廓。 首先,你需要安装OpenCV库。如果你还没有安装&am…

Vulnhub靶机:Kioptrix_Level1.1

一、介绍 运行环境:Virtualbox 攻击机:kali(192.168.56.101) 靶机:Kioptrix_Level1.1(192.168.56.104) 目标:获取靶机root权限和flag 靶机下载地址:https://www.vul…

C语言例2-3:从键盘输入一个正整数(位数小于或等于10),判断其是否是回文数

回文数是将自然数n的各位数字反向排列得到自然数n1,若n1与n相等,则称为回文数,例如12321 //从键盘输入一个正整数(位数小于或等于10),判断其是否是回文数 //回文数是将自然数n的各位数字反向排列得到自然数…

Mac管理Ruby环境

在 macOS 上切换 Ruby 环境主要涉及到使用不同的 Ruby 版本管理工具,比如 RVM(Ruby Version Manager)或 rbenv。下面分别介绍如何使用这两种工具在 Mac 上切换 Ruby 环境: 使用 RVM 切换 Ruby 环境 安装 RVM: 首先&am…

spring boot对外部文件的访问

很多朋友都会遇到这个问题,项目打包成jar格式,本地其他盘符里面的文件访问不到(项目达成war包的和资源是在服务器访问的请忽视),这里只需要在配置文件中添加配置,然后使用建立一个WebMvcConfigurerAdapter拦截就可以了 (1) 首先 …

(BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等

看面试题可以是为了面试,也可以是对自己学到的东西的一种查漏补缺,更加深刻的去了解一些核心知识点 Spring面试高频问题 问题一:谈 需要zi料 绿色徽【vip1024b】 谈你对spring IOC 和 DI 的理解,它们有什么区别? **问题…