本文主要是帮助理解变量的本质是什么,在开发中有什么用?变量的三要素是什么?怎么声明变量?怎么给变量赋值?变量是如何分类的?变量的作用域?等一系列问题。总之,这篇文章全面讲解Java中的变量。
在理解变量之前,认识一下什么是字面量是很有必要的。
1.字面量
字面量就是数据/数值,例如:1234,true,"abc",'中',3.14。其实在现实生活中我们每天都会接触到数据,例如:你今天的体重是60Kg,你今天花了200元,买了一个西瓜的重量是6.5Kg等等。
软件其实就是为了解决现实生活中的问题,解决生活当中的问题其实就是处理生活当中的数据,一门编程语言首先要能够表示数据才可以处理数据,所以Java程序通过字面量来表示数据。
在编程语言中数据一般会被分门别类,所以每个数据都是有数据类型的,不同的数据类型会分配不同大小的内存空间去存储它。
数据被分为:整数型、浮点型、字符型、布尔型、字符串型等。
--整数型(数字):1、2、100、-2等。
--浮点型(数字,带小数):1.0、2.0、3.14等。
--字符型(文字,单个字符):' a '、' 中 '、' 9 '等。
--布尔型(真假):true、false等。
--字符串型(文字,多个字符):"你好呀"、" Hello "、" 100 "、" true "、" 3.14 "、" abc "等。
需要注意的是,Java中规定字符型字面量必须是单个字符,采用半角的单引号 ' ' 括起来,而字符串型字面量必须使用半角双引号 " " 括起来。这是一个语法规定,不然编译器就报错了。
2.变量
(1)变量概述
变量是内存当中存储数据最基本的单元,将数据(字面量)放到内存当中,给这块内存空间起一个名字,这就是变量。所以变量就是内存当中的一块空间,这块空间有名字、有类型、有值,这也是变量必须具备的三要素。
上面我们提到过一个东西叫做数据类型,数据类型在任何一门编程语言当中都很重要,因为程序在运行的过程中会通过不同的数据类型给数据分配不同大小的空间。有的数据类型占用的空间较小,但有的数据类型占用的空间就会很大。这也是符合现实的,在现实生活中有些数据较大,有些数据则较小。
变量要求“变量的数据类型”和变量中存储的“数据(字面量)”的类型必须是一致的,换句话说,冰箱是用来存放小食品的,也就是说冰箱只能存放小食品,大象不能往冰箱里放,原因是放不下,空间不合适。例如:int 类型就只能存下 4 个字节大小的整数,再长一点儿放不下,比如 long 类型的整数占有 8 个字节,这样的数据肯定是无法放到 int 类型的变量当中的。
所谓变量:可变化的量。它的意思是变量中存储的数据不是一成不变的,是可以被改变的,假设变量 i 中之前存储的数据是 10,我们可以将 10 换成 100,变量就是这个意思。
变量是有三要素组成的,分别是:数据类型、变量名、存储的值。其中存储的值就是上面说到的字面量。
(2)使用变量
我们在使用变量之前需要先进行变量的声明,那么声明变量的语法格式是什么呢?如下:
数据类型 变量名
我们以“ int ”这种数据类型为例,int 表示整数类型(注意:int 是关键字,不能随意写,必须全部小写)。变量名只要符合标识符命名规则即可,当然也要见名知意,命名规范中还要求变量名首字母小写,后面每个单词首字母大写。请看以下代码则表示声明一个 int 类型的变量age 用来存储年龄数据:
public class VarTest01 {
public static void main(String[] args){
int age; // 年龄
}
}
大家可以看到上面的代码中这个 age 变量的三要素当中只具备了两个要素:数据类型和变量名,此时的 age 变量并没有存储数据(或者说没有赋值),那么这个 age 变量可以访问吗?我们来试一下,请看代码:
public class VarTest01 {
public static void main(String[] args){
int age; // 年龄
System.out.println(age);
}
}
以上编译错误信息为:可能尚未初始化变量 age,意思是说 age 变量还没有初始化(没有赋值),也就是说变量 age 中还没有数据,空间还没有开辟出来,可见,Java 语言中的变量要求必须先声明,再赋值,才能访问。那么 java 语言中怎么给变量赋值呢?在 Java 语言中给变量赋值需要采用赋值运算符“=”,请看赋值的语法格式:
变量名 = 值;
在以上的语法当中,等号右边的值其实就是数据,上面所说的字面量就可以当做“值”。其中的等号“=”是一种运算符,它被称为赋值运算符,赋值运算符右边的表达式优先级较高,所以等号右边先执行,将执行结果赋给左边的变量。(注意:Java 语言中的单等号不是用来判断是否相等的,是为了完成赋值运算的)接下来我们给 age 变量赋值,请看以下代码:
public class VarTest01 {
public static void main(String[] args){
int age; // 年龄
age = 20;
System.out.println(age);
}
}
我们对以上的代码进行编译并运行,请看下图结果:
可以看到,以上程序的运行在控制台输出了:20。这里需要注意的是,当在 Java程序中输出某个变量的时候,会自动输出变量中所保存的值。以上的测试说明了我们的赋值是没有问题的。那么赋值运算还有其他注意事项吗?有的。在进行赋值运算的时候,Java 中规定 “值” 的数据类型必须和 “变量” 的数据类型保持一致,也就是说 int 类型的变量只能存储 int 类型的数据,不能存储其他类型的数据,我们来进行一个简单的测试,请看以下代码:
public class VarTest01 {
public static void main(String[] args){
int age;
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);
}
}
我们对以上代码进行编译和运行,结果如下图所示:
public class VarTest02 {
public static void main(String[] args){
int count = 100;
System.out.println(count);
}
}
我们对以上程序进行编译和运行,请看运行结果:
public class VarTest03 {
public static void main(String[] args) {
int a = 200, b = 300, c = 400;
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}
public class VarTest03 {
public static void main(String[] args) {
int a, b, c = 400;
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}
对以上的程序进行编译,请看以下编译结果:
public class VarTest04 {
public static void main(String[] args) {
int age = 20;
int age = 30;
System.out.println(age);
}
}
我们对以上的代码进行编译,请看下图结果:
public class VarTest04 {
public static void main(String[] args) {
int age = 20;
age = 30;
System.out.println(age);
}
}
我们将以上代码进行编译并运行,请看下图结果:
public class VarTest05 {
public static void main(String[] args) {
System.out.println(age);
int age = 20;
}
}
对以上程序进行编译,请看下图编译结果:
public class VarTest06 {
int x = 20; // 实例变量
static int y = 200; // 静态变量
public static void sum(int a, int b){ // 局部变量 a 和 b
int firstNum = 100; // 局部变量
}
}
public class VarTest07 {
public static void main(String[] args){
int k = 100; // 局部变量 k
}
public static void m() {
System.out.println(k);
}
}
public class VarTest07 {
static int k = 100; // 静态变量 k
public static void main(String[] args){
System.out.println("main k = " + k);
}
public static void m(){
System.out.println(k);
}
}
我们对以上代码进行编译,并运行,请看下图结果:
public class VarTest07 {
static int k = 100; // 静态变量 k
public static void main(String[] args){
int k = 300; // 局部变量 k
System.out.println("main k = " + k);
}
public static void m(){
System.out.println(k);
}
}
public class VarTest07 {
static int k = 100; // 静态变量 k
public static void main(String[] args){
int k = 300; // 局部变量 k
System.out.println("main k = " + k);
m(); // 调用 m 方法
}
public static void m(){
System.out.println(k);
}
}