四、变量

本章节目标:

理解变量本质是什么,在开发中有什么用?变量三要素是什么?怎么声明变量?怎么给变量赋值?变量是如何分类的?变量的作用域?

1 知识框架:

img

2 Java字面量

字面量就是数据/数值,例如:1234,true,”abc”,’中’,3.14。在现实生活中每天都会接触到数据,例如:你今天的体重是86Kg,你今天花了500元,买了个西瓜重量是8.6Kg,外面明明是晴天,你却说狂风暴雨,你说的是假话(false),你明明喜欢她,却嘴上说不喜欢,撒谎(false)。软件其实就是为了解决现实生活当中的问题,解决生活当中的问题其实就是处理生活当中的数据,所以一门编程语言首先要能够表示数据,通过字面量就可以表示数据。

在编程语言中数据一般会被分门别类,所以每个数据都是有数据类型的,不同的数据类型会分配不同的内存空间去存储它,数据通常被分为:整数型、浮点型、字符型、布尔型、字符串型等。

整数型(数字):1、2、100、-2

浮点型(数字,带小数):1.0、2.0、3.14

字符型(文字,单个字符):’a’、’中’

布尔型(真假):true、false

字符串型(文字,多个字符):”你好呀童鞋”

需要注意的是,java中规定字符型字面量必须采用半角的单引号括起来,而字符串型字面量必须使用半角双引号括起来。

找出以下代码中哪些是字面量?

public class ConstTest {
public static void main(String[] args) {
	System.out.println("小明的体重=" + 86 + "kg");
	System.out.println("圆周率=" + 3.1415926);
	System.out.println(true);
	System.out.println(false);
	System.out.println('男');
	System.out.println('a');
	System.out.println("你的对手在看书!");
	System.out.println("你的闺蜜在减肥!");
	System.out.println("你的仇人在磨刀!");
	System.out.println("隔壁老王在练腰!");
	System.out.println("你还不赶紧抓紧时间,还在这愣着干啥呀!!!");
}
}

运行结果如下图所示:

img

​ 图3-1:字面量

3 Java变量介绍

变量是内存当中存储数据最基本的单元,将字面量(数据/数值)放到内存当中,给这块内存空间起一个名字,这就是变量。所以变量就是内存当中的一块空间,这块空间有名字、有类型、有值,这也是变量必须具备的三要素。例如下图:

img

​ 图3-2:变量内存抽象图

上图中a、c、pi、sex是4个变量的名字,13、’好’、3.14、true是4个变量中分别存储的数据(字面量),int、char、double、boolean是4个变量分别对应的数据类型。

数据类型在任何一门编程语言当中都很重要,因为程序在运行的过程中会通过不同的数据类型给数据分配不同大小的空间。有的数据类型占用的空间较小,但有的数据类型占用的空间就会很大。

变量要求“变量的数据类型”和变量中存储的“数据(字面量)”必须类型是一致的,换句话说,冰箱是用来存放小食品的,也就是说冰箱只能存放小食品,大象不能往冰箱里放,原因是放不下,空间不合适。例如:int类型就只能存下4个字节大小的整数,再长一点儿放不下,比如long类型的整数占有8个字节,这样的数据肯定是无法放到int类型的变量当中的。

所谓变量:可变化的量。它的意思是变量中存储的数据不是一成不变的,是可以被改变的,假设变量i中之前存储的数据是10,我们可以将10换成100,变量就是这个意思。

4 Java变量使用

**声明变量的语法格式为:**数据类型 变量名; //例如:int i;

数据类型我们在下一章节会详细讲解,目前我们以“int”类型为例,int表示整数类型(注意:int是关键字,不能随意写,必须全部小写)。变量名只要符合标识符命名规则即可,当然也要见名知意,命名规范中还要求变量名首字母小写,后面每个单词首字母大写。例如以下代码:

public class VarTest01 {
public static void main(String[] args) {
	int age; //年龄
}
}

这个age变量可以访问吗,我们来试一下,请看代码:

public class VarTest01 {
public static void main(String[] args) {
	int age;
	System.out.println(age);
}
}

编译报错了,请看下图:

img

​ 图3-3:编译错误提示信息

以上编译错误信息为:可能尚未初始化变量age,这句话的意思是age变量还没有赋值,也就是说变量age中还没有数据,空间还没有开辟出来,可见,java语言中的变量必须先声明,再赋值才能访问。那么java语言中怎么给变量赋值呢?请看**赋值的语法格式:**变量名 = 字面量; //字面量就是值

语法中要求“字面量”和“变量的数据类型”一致,不然会出现类型不兼容的错误信息。以上语法当中的“=”是一种运算符,它被称为赋值运算符,赋值运算符右边的表达式优先级较高,也就是说等号右边先执行,将执行结果赋给左边的变量。(注意:java语言中的单等号不是用来判断是否相等的,是为了完成赋值运算。

接下来我们来修改一下以上错误的代码,让其编译通过并能够运行:

public class VarTest01 {
	public static void main(String[] args) {
		int age;
		age = 20;
		System.out.println(age);
	}
}

运行的结果是在控制台输出了:20

变量赋值之后可以重新赋值吗?当然可以,要不然怎么能叫变量呢。请看:

public class VarTest01 {
	public static void main(String[] args) {
		int age;
		age = 20;
		System.out.println(age);
		age = 30;
		System.out.println(age);
	}
}

重新赋值之后,再次输出到控制台,结果是:30

变量的声明和赋值可以在一行代码上完成吗?可以的,请看代码:

public class VarTest02 {
	public static void main(String[] args) {
		//声明一个int类型的变量count,赋值15
		//声明和赋值一气呵成
		int count = 15;
		System.out.println(count);
		//重新赋值
		count = 18;
		System.out.println(count);
	}
}

在一行上可以同时声明多个变量吗?可以的,请看代码:img

public class VarTest03 {
	public static void main(String[] args) {
		int a, b , c = 300;
		System.out.println(a);
		System.out.println(b);
		System.out.println(c);
	}
}

编译出错了,请看下图:

img

​ 图3-4:编译错误提示信息

根据以上错误提示信息得知,int a , b , c = 300表示声明3个int类型变量,分别起名a,b,c,其中a和b没有赋值,c赋值300。这一点大家需要注意:这行代码并不代表给3个变量全部赋值300哦!要想让以上代码编译通过,在访问变量之前赋上值就行了,可以这样修改:

public class VarTest03 {
	public static void main(String[] args) {
		int a, b , c = 300;
		a = 90;
		System.out.println(a);
		b = 88;
		System.out.println(b);
		System.out.println(c);
	}
}

img

在同一个大括号当中,可以声明两个同名的变量吗?不可以的,在同一个大括号当中表示在内存的同一个域当中,在同一块区域上面有两个名字都叫做a的变量,这是不允许的,因为这样程序在运行的时候,java虚拟机也不知道该访问哪个变量了(好比说,你有两个朋友,他们的俩的名字都叫张三,当你们三个人同时在场的时候,你呼张三,其实他俩也不知道你喊谁呢!)。所以,同一个域中变量名不能重名,但是记住:变量是可以重新赋值的。请看以下程序以及编译错误提示信息:

public class VarTest03 {
	public static void main(String[] args) {
		int a = 10;
		int a = 100;
	}
}

编译错误提示信息:

img

​ 图3-5:编译错误提示信息

5 Java变量分类

这一小节的内容需要大家先记住,后面会详细讲解。

变量根据声明的位置不同可以分为:局部变量和成员变量。

在方法体当中声明的变量以及方法的每一个参数变量都是局部变量。

在方法体外,类体内声明的变量称为成员变量,成员变量声明时如果使用static关键字修饰的称为静态成员变量(简称静态变量),如果没有static关键字修饰则称为实例成员变量(简称实例变量),如以下代码:

public class VarTest04 {
 
	//实例变量(成员变量)
	int x = 20;
	
	//静态变量(成员变量)
	static int y = 200;
	
	//方法:int a,int b都是局部变量
	public static void sum(int a, int b){
		//局部变量
		int firstNum = 100;
	}
}

img

局部变量只在方法体当中有效,方法开始执行的时候局部变量的内存才会被分配,当方法执行结束之后,局部变量的内存就释放了。所以局部变量的生命周期非常短暂。

6 Java变量的作用域

所谓变量的作用域就是变量的有效范围。通过后面内容的学习大家会更加明白,实际上局部变量、实例变量、静态变量它们存储在Java虚拟机的不同内存区域上,所以变量是有作用域的。

关于变量的有效范围,在这里我给大家总结了一个口诀:出了大括号就不认识了。虽然这句话属于大白话,但很实用。我们来测试一下:

public class VarTest05 {
	//后面会学习为什么这里的变量定义为静态变量
	static int i = 1000;
	public static void main(String[] args) {
		System.out.println("k = " + k);
		int k = 100;
		System.out.println("k = " + k);
		int i = 2000;
		System.out.println("i = " + i);
	}
	//后面会学习方法怎么定义
	public static void m1(){
		System.out.println("k = " + k);
	}
	public static void m2(){
		System.out.println("i = " + i);
	}
}

编译报错了:imgimg

img

​ 图3-6:变量的作用域

通过以上的测试我们发现:

● 方法体当中的代码是有执行顺序的,遵循自上而下的顺序依次逐行执行,变量在没有声明的时候是不能访问的,需要先声明,接下来才能访问。

● 另外在main方法中声明的变量k有效范围是main方法,只能在main方法中使用,出了大括号就不认识了,在m1方法中是无法访问的。

● 在类体当中声明的变量i作用域是整个类体,所以在m2方法中是可以使用的。

修改以上代码并运行:

public class VarTest05 {
	//后面会学习为什么这里的变量这个时候定义为静态变量
	static int i = 1000;
	public static void main(String[] args) {
		//System.out.println("k = " + k);
		int k = 100;
		System.out.println("k = " + k);
		int i = 2000;
		System.out.println("i = " + i);
	}
	//后面会学习方法怎么定义
	public static void m1(){
		//System.out.println("k = " + k);
	}
	public static void m2(){
		System.out.println("i = " + i);
	}
}

运行结果如下图所示:imgimg

img

​ 图3-7:变量作用域

通过以上程序的运行结果得知,java是遵循就近原则的,在类体当中有i变量,在main方法中声明了i变量,那么在main方法中一定访问离自己最近的变量,也就是就近取材,这就是就近原则,几乎所有的编程语言都是这样的。

项目管理变量是:环境变量、全局变量、角色变量和主机变量。它们之间存在着辩证关系,具体如下: 1. 环境变量:环境变量是在整个Ansible项目共享的变量,可以在所有主机和角色使用。它们通常用于存储与整个环境相关的值,如IP地址、端口号等。环境变量可以在Ansible的配置文件定义,也可以通过命令行参数传递。 2. 全局变量:全局变量是在整个Ansible项目共享的变量,但与环境变量不同,全局变量通常是在一个文件定义,并在需要时通过include_vars指令引入。全局变量可以存储与整个项目相关的值,如数据库连接信息、API密钥等。 3. 角色变量:角色变量是与特定角色相关的变量,它们定义在角色的vars目录,并在角色的任务使用。角色变量可以存储与角色功能相关的值,如软件版本、配置文件路径等。角色变量的作用范围仅限于该角色内部。 4. 主机变量:主机变量是与特定主机相关的变量,它们定义在主机清单文件或通过动态清单脚本提供。主机变量可以存储与特定主机相关的值,如主机名、操作系统类型等。主机变量的作用范围仅限于该主机。 这变量之间的辩证关系是:环境变量和全局变量是在整个项目共享的变量,而角色变量和主机变量是与特定角色和主机相关的变量。通过合理使用这些变量,可以实现灵活的项目管理和配置管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值