Fork me on GitHub

三.变量的本质,分类;常量

变量的本质

变量本质上就是代表一个”可操作的存储空间”,空间位置是确定的,但是里面放置什么值不确定。我们可通过变量名来访问“对应的存储空间”,从而操纵这个“存储空间”存储的值。

Java是一种强类型语言,每个变量都必须声明其数据类型。变量的数据类型决定了变量占据存储空间的大小。 比如,int a=3; 表示a变量的空间大小为4个字节。

变量作为程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。变量在使用前必须对其声明, 只有在变量声明以后,才能为其分配相应长度的存储空间。

变量的声明
格式为:

1
2
3
type  varName [=value][,varName[=value]...]; 
//[]中的内容为可选项,即可有可无
数据类型 变量名 [=初始值] [,变量名 [=初始值]…];

【示例2-4】 声明变量

1
2
3
double  salary;
long earthPopulation;
int age;

不同数据类型的常量会在内存中分配不同的空间,如图所示。
image

注意事项:

  • 每个变量都有类型,类型可以是基本类型,也可以是引用类型。
  • 变量名必须是合法的标识符
  • 变量声明是一条完整的语句,因此每一个声明都必须以分号结束

示例 (在一行中声明多个变量)

1
int  i ,j; // 两个变量的数据类型都是int

不提倡这种”一行声明多个变量”风格,逐一声明每一个变量可以提高程序可读性。

可以将变量的声明和初始化放在同一行中

1
2
int  age = 18;    
double e = 2.718281828;

我们来看一个实例,我写的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
* @author RickYinPeng
* @ClassName TestVariable
* @Description 测试变量
* @date 2018/10/26/12:21
*/
public class TestVariable {

private static int a;

public static void main(String[] args) {
int age;
age = 18;
int salary = 50000;

/* 局部变量使用前需要初始化,如果不初始化当你用的时候就会报错,就比如你直接打印它
int yin;
System.out.println(yin);*/

/**
* 但是成员变量可以,你在外面定义了成员变量,但是没有初始化它,但是你打印的时候就不会报错
* JVM会给成员变量初始化值
*/
System.out.println(a);
}
}

总结:

  • 局部变量使用前需要初始化,如果不初始化当你用的时候就会报错,就比如你直接打印它
  • 但是成员变量可以,你在外面定义了成员变量,但是没有初始化它,但是你打印的时候就不会报错,因为JVM会给成员变量初始化值

变量的分类


从整体上可将变量划分为局部变量、成员变量(也称为实例变量)和静态变量。

image

成员变量和静态变量不是目前重点,不要过多纠结理解与否。我们学习面向对象时,再重点讲解成员变量和静态变量

  1. 局部变量(local variable)

    方法或语句块内部定义的变量。生命周期是从声明位置开始到到方法或语句块执行完毕为止。局部变量在使用前必须先声明、初始化(赋初值)再使用。
    示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void test() {
    int i;
    int j = i+5 ; // 编译出错,变量i还未被初始化
    }

    public void test() {
    int i;
    i=10;
    int j = i+5 ; // 编译正确
    }
  2. 成员变量(也叫实例变量 member variable)
    方法外部、类的内部定义的变量。从属于对象,生命周期伴随对象始终。如果不自行初始化,它会自动初始化成该类型的默认初始值。

    image

实例变量的声明

1
2
3
public class Test {
int i;
}

  1. 静态变量(类变量 static variable)

    使用static定义。 从属于类,生命周期伴随类始终,从类加载到卸载。 (注:讲完内存分析后我们再深入!先放一放这个概念!)如果不自行初始化,与成员变量相同会自动初始化成该类型的默认初始值

变量的声明并赋值

1
2
3
4
5
6
7
8
9
10
11
12
13
public class LocalVariableTest {
public static void main(String[ ] args) {
boolean flag = true; // 声明boolean型变量并赋值
char c1, c2; // 声明char型变量
c1 = '\u0041'; // 为char型变量赋值
c2 = 'B'; // 为char型变量赋值
int x; // 声明int型变量
x = 9; //为int型变量赋值
int y = x; // 声明并初始化int型变量
float f = 3.15f; // 声明float型变量并赋值
double d = 3.1415926; //声明double型变量并赋值
}
}

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

int a; //成员变量, 从属于对象; 成员变量会自动被初始化
static int size; //静态变量,从属于类

public static void main(String[] args) {

{
int age; //局部变量,从属于语句块;
age = 18;
}

int salary = 3000; //局部变量,从属于方法

int gao = 13;
System.out.println(gao);

int i;
// int j = i + 5; // 编译出错,变量i还未被初始化

}
}

常量

常量通常指的是一个固定的值,例如:1、2、3、’a’、’b’、true、false、”helloWorld”等。

在Java语言中,主要是利用关键字final来定义一个常量。 常量一旦被初始化后不能再更改其值。

image
声明格式为:

1
final  type  varName = value;

常量的声明及使用

1
2
3
4
5
6
7
8
9
10
11
public class TestConstants {
public static void main(String[] args) {
final double PI = 3.14;
// PI = 3.15; //编译错误,不能再被赋值!
double r = 4;
double area = PI * r * r;
double circle = 2 * PI * r;
System.out.println("area = " + area);
System.out.println("circle = " + circle);
}
}

为了更好的区分和表述,一般将1、2、3、’a’、’b’、true、false、”helloWorld”等称为字面常量,而使用final修饰的PI等称为符号常量

建议:

  • 变量和常量命名规范(规范是程序员的基本准则,不规范会直接损害你的个人形象):
  • 所有变量、方法、类名:见名知意
  • 类成员变量:首字母小写和驼峰原则: monthSalary
  • 局部变量:首字母小写和驼峰原则
  • 常量:大写字母和下划线:MAX_VALUE
  • 类名:首字母大写和驼峰原则: Man, GoodMan
  • 方法名:首字母小写和驼峰原则: run(), runRun()

基本数据类型(primitive data type)

Java是一种强类型语言,每个变量都必须声明其数据类型。 Java的数据类型可分为两大类:基本数据类型(primitive data type)和引用数据类型(reference data type)。

Java中定义了3类8种基本数据类型

  • 数值型- byte、 short、int、 long、float、 double
  • 字符型- char
  • 布尔型-boolean
    image

注意事项

  • 引用数据类型的大小统一为4个字节,记录的是其引用对象的地址!