Java 的变量

什么是变量?

变量来源于数学, 是计算机语言中能储存计算结果或能表示值的抽象概念.

在Java中, 变量用于存放基本数据类型和对象这些数据, 这些数据可以是字面常量, 表达式, 方法, 匿名函数等语句的结果. 我们将结果存放到变量的这个过程, 称之为 赋值. 赋值其实就给内存里存放的数据, 牵了一根线头, 这样我们需要用到这个数据的时候, 直接找这个线头就可以了.

变量可以通过变量名访问, 变量名是一种符号, 是上文中提到的标识符的一种, 变量的命名要符合标识符的命名规范.

Java 中给变量赋值的基本语句是:

类型 变量名 = 同类型(或子类)结果表达式/常量/方法;

Java 中使用给变量赋值的示例:

String name = "张三";
int age = 2021 - 2001;
double height = 1.78;
System.out.println("你好, 我是" + name + ", 今年 " + age + " 岁, 身高 " + height + " 米.");

执行结果为:

Java 的变量赋值与输出

在上面的例子中, 套用变量赋值的基本语句:

String name = "张三";

String 是字符串类型 , name 是变量名, 表示姓名, = 是赋值符号, "张三"String 类的字面常量.

int age = 2021 - 2001;

中 int 是基础类整型 , age 是变量名, 表示年龄, = 是赋值符号, 2021-2000int 类的计算表达式.

double height = 1.78;

中 double 是基础双精度浮点数, height 是变量名, 表示身高, = 是赋值符号, 1.78double 类的字面常量.

这样, 我们分别赋值了三个变量: name 字符串类型, age 基础类整型, height 基础双精度浮点数.

然后我们通过 

System.out.println("你好, 我是" + name + ", 今年 " + age + " 岁, 身高 " + height + " 米.");

完成了对变量的使用.

什么是常量

变量的值是会变化的, 与之对应的常量值一旦赋值就不能再更改(变化)了.

需要注意的是, 在 Java 中, 不能变化的是常量

根据常量的表现形式, 常量分为 字面型常量标识型常量 两种.

1. 字面型常量, 就是看起来是什么值, 他就是什么值的常量:

比如

1, 2.3, 'a', "你好"

因为出现了就表达了自身的意义, 且自身不会再发生变化, 因此称之为字面型常量.

注: 其实只要知道这是一种常量就好了, 不用刻意记忆这些概念.

2. 标识型常量, 就是通过将一个数据赋值给一个标识符, 在 Java 中标识符常量仅仅约束了标识符到数据的值之间的映射不可更改, 如果数据自身内部值发生变化是允许的. 用上面牵线为例, 就相当于皇帝把他妹妹嫁给了你, 受到皇权的约束你和对象你不能分开, 但是这个对象自身还是会发生年龄增长这样的变化的.

Java 中的标识型常量, 是使用 final 修饰符修饰的标识符, 举例: 

final Double PI = Double.valueOf(3.14159265);
int r = 15;
System.out.println(String.format("半径为 %d 米的圆的周长是 %f 米", r, 2 * PI * r));

在这里我们定义了 PI 常量(常量一般采用全大写), 用于计算圆的周长.

当我们再次未PI赋值时

PI = Double.valueOf(3.14);

就会看到以下错误:

The final local variable PI cannot be assigned. It must be blank and not using a compound assignment

这表明一个本地 final 变量(即常量), 无法再指派新的值.

变量的分类

变量的分类可按两种方式分类:

一种是按作用域分类分为 局部变量成员变量

局部变量

局部变量主要作用于, Java 类的方法, 函数的内部, 按照其作用的位置不同可以分为三类:

方法参数

  • 在方法定义时定义的局部变量, 在整个方法内生效
  • 由方法调用者负责为其赋值
  • 随着方法的结束而销毁

示例代码, 最常见的 static main 方法:

public static void main(String[] args)

这里的 args 就是方法参数

方法内的局部变量

方法内定义的局部变量

  • 在方法内定义的局部变量, 在整个方法内生效
  • 使用前必须对其进行显式的初始化(赋值)
  • 随方法的结束而销毁

示例代码如下:

public static void main(String[] args) {
	String name;
	name = "张三";
	int r = 5;
}

上述代码里, 分别声明了两个变量 rname, 但是 name 在使用前必须为其赋值.

代码块的局部变量

在代码块内定义的局部变量, 严格来说也是方法内局部变量的一种. 同时如果在代码块外已经定义了同名变量, 在代码块内将不能再次声明同名变量.

  • 在代码块内定义的局部变量, 在整个代码块内生效
  • 使用前必须对其进行显式的初始化(赋值)
  • 随方法的结束而销毁

代码示例:

public static void main(String[] args) {
	if (true) {
		String str = "Hello";
		System.out.println(str);
	}
}

在这里定义的变量 str 就无法放在 if 外的区域使用, 如果使用会报错:

str cannot be resolved to a variable

成员变量

成员变量是定定义于 Java 类中且在方法以外的地方, 生效范围取决于定义时的访问控制修饰符, 按照其生效的方式可分为 实例变量 类变量.

实例变量

实例变量又称为非静态变量, 它不能使用 static 修饰符进行修, 饰它的生效需要将类初始化为一个实例, 然后在使用实例时生效, 因此称为实例变量或非静态变量.

示例代码:

class Human {
	protected int age;

	public void growUp(int age) {
		this.age += age;
	}

	public void hello() {
		System.out.println("你好, 我今年 " + age + " 岁了.");
	}
}

在上述代码中我们定义了实例变量 age , 下面我们看看如果让 age 生效, 示例如下:

public static void main(String[] args) {
	Human human = new Human();
	human.hello();
	human.growUp(20);
	human.hello();
}

执行结果如下:

你好, 我今年 0 岁了.
你好, 我今年 20 岁了.

 通过调用 groupUp() 方法, 将 age 的值改为了 20.

类变量

类变量又称为静态变量, 它需要 static 修饰符进行修饰, 它的生效无需实例化实例, 可直接通过类名调用或在类的静态方法中调用, 因此称为类变量或静态变量.

示例代码如下:

class Human {
	public static String first = "Lucky";
}

在上述代码中我们定义了类变量 first , 下面看看我们如何使用 first , 示例如下:

public static void main(String[] args) {
Human h = new Human(); System.out.println("The first human, " + h.first); System.out.println("The first human, " + Human.first); }

执行力结果如下:

The first human, Lucky
The first human, Lucky

我们可以看到, 类变量的使用无需初始化, 但是初始化了也可以调用, 但是我们不建议这样使用, 而且有些编辑器或IDE中会发出类似下图的警告:

Java 静态变量非静态调用的警告

关于修饰符 final

final 修饰符可以修饰 实例变量与类变量.

另一种是按数据类型分类, 详细划分请参照下一篇 Java 变量的数据类型 .

以上就是 Java 变量的全部内容了.