Java 程序设计基础之 Java 变量

变(常)量——Java 程序中最基础的元素。我们在前面提到过,Java 字面值是 Java 数据具体、直观的表现,就是一个具体的值。事实上, Java 中字面值的主要功能就是来给变量、常量进行赋值用的。程序设计语言中变量的引入是至关重要的,有了变量后续的一切才是有意义的。

Java 变量

什么是变量

变量你可以将其看成是一个个带有名字的小盒子,用来存放我们的数据(字面值),方便后续在程序中引用(使用),这是有意义的。

严格来说,

在 Java 中,变量是指向计算机内存中的某一存储区域的引用,该区域有自己的名称(变量名)和数据类型(变量类型)。

事实上,变量的类型是,变量所指向的存储区域中所存储数据的类型。

该区域的数据可以在同一类型范围内不断的变化~


变量定义

Java 语言是强类型(Strongly Typed)语言,强类型包含以下两方面的含义:

  • 所有的变量必须先定义(声明)、后使用
  • 指定数据类型的变量只能接受类型与之匹配的值

定义(声明)变量,就是要告诉编译器这个变量的数据类型,和变量的名称,编译器才知道它能存放什么样的数据,需要分配多少空间给它,以及如何找到它。

1 –> 声明变量

在 java 中用户可以通过指定数据类型和标识符来声明变量,其基本语法如下所示:

DataType identifier;

或者:

DataType identifier=value;

注意:同一代码块范围内不允许有多个相同命名的变量。


2 –> 初始化变量

初始化变量是指为变量指定一个明确的初始值,变量声明后并不会分配内存空间,只有赋值之后才会分配内存。

初始化变量有两种方式:

  • 声明时直接赋值
  • 先声明、后赋值。
1
2
3
4
5
6
// 声明时直接赋值
char usersex='female';

// 先声明、后赋值
String username;
username = "Wangyi";

多个同类型的变量可以同时定义或者初始化,但是多个变量中间要使用逗号分隔,声明结束时用分号分隔。

1
2
3
# Java 编码规范中不推荐使用
String username,address,phone,tel; // 声明多个变量
int num1=12,num2=23,result=35; // 声明并初始化多个变量

Java 中初始化变量时需要注意以下事项:

  1. 变量是类或者结构中的字段(属性),如果没有显式地初始化,默认状态下会创建变量并初始化为【默认值】,默认值见:【数据类型默认值对照表】。
  2. 方法中的变量必须显式地初始化,否则在 使用该变量时 就会出错

常量

常量,一种特殊的变量!

当使用 final 关键字来修饰一个变量时,就成为一个 常量,也称为 final 变量。Java 语言使用 final 关键字来定义一个常量,其语法如下所示:

final dataType variableName = value

常量有很多种说法,比如不能改变等等。但更为准确的描述是:

当一个变量被 final 修饰的时候,该变量 只有一次赋值的机会!!!

==========================================

You Need Know More:

  • final 关键字不仅可以用来修饰基本数据类型的常量(或引用类型的变量),还可以用来修饰类、和方法。
  • 当定义的 final 变量为成员变量(类或结构中的属性)时,必须在定义时就设定它的初始值(没有显式初始化,会被隐式初始化为0),如果再次对其进行赋值将会提示编译错误
  • 当定义的 final 变量为方法中的局部变量时,则需要开发者在声明后,第一次使用该变量之前,显式的赋初始值,实例化该变量

Java 中 final 修饰符的用法详细见:Java 中的 final 修饰符,你可以看到 final 修饰类,方法的使用场景。


变量的作用域

变量的作用域,也称为:变量的有效范围

变量的有效范围是指:程序代码中能够访问该变量的区域,若超出该区域进行访问,则在编译时会出现错误。

在程序中,一般会根据变量的有效范围将变量划分为:

  • 成员变量
  • 局部变量

成员变量

成员变量是指:定义在类下面,不属于任何一个方法的变量。

别名:字段,属性,Field

作用域是:从变量声明的位置开始,整个类都可以访问得到

类中的成员变量,根据是否有无 static 修饰符修饰,可以分为:

1 –> 实例变量

无 static 修饰符修饰;访问方式:对象名.变量名;生命周期:只要对象被当作引用,实例变量就将存在。

2 –> 类变量(静态变量)

有 static 修饰符修饰;访问方式:类名.变量名(推荐,编码规范),或对象名.变量名;生命周期:其生命周期取决于类的生命周期,类被垃圾回收机制彻底回收时才会被销毁。

注意:Java 中 static 关键字只作用于成员变量,局部变量无法使用 static 修饰。

示例代码如下:

变量声明代码如下所示:

1
2
3
4
5
6
7
8
public class DataTest {
String name;
int age;

static final String website = "orangeshare.cn";
static String url = "https://www.orangeshare.cn";

}

测试类代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class HelloJava {

public static void main(String[] args) {
// TODO Auto-generated method stub
DataTest dataTest = new DataTest(); // 创建类的对象

// 实例变量调用方法(对象名.变量名):
System.out.println(dataTest.name);
System.out.println(dataTest.age);

// 类变量调用方法(类.变量名):
System.out.println(DataTest.website);
System.out.println(DataTest.url);
// 类变量调用方法(对象名.变量名):
System.out.println(dataTest.website);
System.out.println(dataTest.url);
}

}

上面,name 和 age 显示系统默认初始化的值,website 和 URL 显示初始化的值。且用 static final 修饰的变量必须赋予初始值。

关于 static 修饰符的用法详细见:Java 中的 static 修饰符


局部变量

局部变量是指:在方法或者方法代码块中定义的变量。

别名:参数

根据其所处的位置可以分为三种:

1 –> 方法局部变量(方法内定义)

作用域是:从定义这个变量开始到方法结束这一段时间内有效。

2 –> 方法参数变量(形参)

作用域是:整个方法内均有效。局部变量在使用前必须主动初始化值。

3 –> 代码块局部变量(代码块内定义)

作用域是:从定义这个变量开始到代码块结束这一段时间内有效。

观察下面程序是否可正常运行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class HelloJava {

public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Hello, Java World!");

for (int i = 0; i < 5; i++) {

}

System.out.println(i); // 无效作用域

}

}

重名问题

想象一种场景:如果局部变量和成员变量重名,那么在方法中调用打印标识符时,显示的是局部变量的值,还是成员变量的值?

java 采用局部优先的思想。局部变量可以和成员变量相同,使用标识符调用时,优先使用局部变量。想调用成员变量怎么办?如果该变量是实例变量,可使用 this.变量名,否者可使用 类.变量名


数据类型默认值对照表

数据类型 初始值
boolean false
char ‘/uoooo’(null)
byte (byte)0
short (short)0
int 0
long 0L
float 0.0f
double 0.0d
引用型(String等) null

注:引用型数据类型包括:类(class)、接口(interface)、数组(Array)、字符串(String),默认值都为 null。


Author

Waldeinsamkeit

Posted on

2017-10-13

Updated on

2023-04-03

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.

Comments

You forgot to set the shortname for Disqus. Please set it in _config.yml.