Java 的变量
什么是变量?
变量来源于数学, 是计算机语言中能储存计算结果或能表示值的抽象概念.
在Java中, 变量用于存放基本数据类型和对象这些数据, 这些数据可以是字面常量, 表达式, 方法, 匿名函数等语句的结果. 我们将结果存放到变量的这个过程, 称之为 赋值. 赋值其实就给内存里存放的数据, 牵了一根线头, 这样我们需要用到这个数据的时候, 直接找这个线头就可以了.
变量可以通过变量名访问, 变量名是一种符号, 是上文中提到的标识符的一种, 变量的命名要符合标识符的命名规范.
Java 中给变量赋值的基本语句是:
类型 变量名 = 同类型(或子类)结果的表达式/常量/方法;
Java 中使用给变量赋值的示例:
String name = "张三"; int age = 2021 - 2001; double height = 1.78; System.out.println("你好, 我是" + name + ", 今年 " + age + " 岁, 身高 " + height + " 米.");
执行结果为:
在上面的例子中, 套用变量赋值的基本语句:
String name = "张三";
中 String 是字符串类型 , name 是变量名, 表示姓名, = 是赋值符号, "张三" 是 String 类的字面常量.
int age = 2021 - 2001;
中 int 是基础类整型 , age 是变量名, 表示年龄, = 是赋值符号, 2021-2000 是 int 类的计算表达式.
double height = 1.78;
中 double 是基础双精度浮点数, height 是变量名, 表示身高, = 是赋值符号, 1.78 是 double 类的字面常量.
这样, 我们分别赋值了三个变量: 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; }
上述代码里, 分别声明了两个变量 r 和 name, 但是 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中会发出类似下图的警告:
关于修饰符 final
final 修饰符可以修饰 实例变量与类变量.
另一种是按数据类型分类, 详细划分请参照下一篇 Java 变量的数据类型 .
以上就是 Java 变量的全部内容了.