Java学习笔记之变量类型

一个变量为我们提供了被命名的存储空间。Java中的每个变量都一个特定的类型,其能够决定变量内存的大小和布局;值的范围可以存储在这个内存中;并且操作集可以应用于该变量。

在使用变量之前,必须先声明该变量。一个变量声明的基本形式如下:

1
data type variable [ = value][, variable [= value] ...] ;

这里,data type是Java数据类型之一,variable是变量名。如果要声明指定类型的多个变量,可以使用逗号分离的列表。

Java中变量的声明和初始化如下:

1
2
3
4
5
int a, b, c;         // Declares three ints, a, b, and c.
int a = 10, b = 10; // Example of initialization
byte B = 22; // initializes a byte type variable B.
double pi = 3.14159; // declares and assigns a value of PI.
char a = 'a'; // the char variable a iis initialized with value 'a'

本节将介绍Java语言中可用的各种变量类型。这里列出了三种变量:

  • 局部变量(local variables)
  • 成员变量(member variables)
    • 实例变量(instance variables)
    • 类/静态变量(class/static variables)

局部变量(Local variables)

  • 局部变量是在方法、构造函数或块中进行声明的。
  • 当程序进入方法、构造函数或块中时,局部变量就会被创建;而一旦程序退出了方法、构造函数或块时,该变量就会被摧毁。
  • 访问修饰符不能用于局部变量。
  • 局部变量只能在声明的方法,构造函数或块中可见。
  • 局部变量是在堆栈层内部实现。
  • 局部变量是没有默认值的,所以在使用之前,必须先声明且初始化赋初值。

如下,age是一个局部变量,其是在pupAge()方法内部定义的,故其作用范围仅限于该方法内。

1
2
3
4
5
6
7
8
9
10
11
12
public class Test{ 
public void pupAge(){
int age = 0;
age = age + 7;
System.out.println("Puppy age is : " + age);
}

public static void main(String args[]){
Test test = new Test();
test.pupAge();
}
}

运行结果:

1
Puppy age is: 7

下面是age没有被初始化,结果就报错了。

1
2
3
4
5
6
7
8
9
10
11
12
public class Test{ 
public void pupAge(){
int age;
age = age + 7;
System.out.println("Puppy age is : " + age);
}

public static void main(String args[]){
Test test = new Test();
test.pupAge();
}
}

运行结果:

1
Test.java:4:variable number might not have been initialized

实例变量(Instance variables)

  • 实例变量是在类中,但在方法、构造函数或块之外声明的。
  • 当空间被分配给堆中的对象时,将为每个实例变量值创建插槽。
  • 当一个对象用new关键字被创建时,其实例变量即被创建,而当对象被摧毁时,其实例变量也将被摧毁。
  • 访问修饰符可用来修饰实例变量。
  • 实例变量对类中所有的方法、构造函数和块都是可见的。通常,建议将这些变量设置为private(访问级别)。然而,子类的可见性可通过这些运用访问修饰符的变量给出。
  • 实例变量有默认值。对于数字,其默认值为0,对于布尔值,其默认值为false,对于对象的引用,其默认值为null。其默认值可在声明期间或构造函数中进行分配。
  • 实例变量可直接通过调用类里面的变量名来访问。然而,在static方法和不同的类中调用时需使用全名,如 ObjectReference.VariableName

例:

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
27
28
29
30
31
import java.io.*;

public class Employee{
// this instance variable is visible for any child class.
public String name;

// salary variable is visible in Employee class only.
private double salary;

// The name variable is assigned in the constructor.
public Employee (String empName){
name = empName;
}

// The salary variable is assigned a value.
public void setSalary(double empSal){
salary = empSal;
}

// This method prints the employee details.
public void printEmp(){
System.out.println("name : " + name );
System.out.println("salary :" + salary);
}

public static void main(String args[]){
Employee empOne = new Employee("Ransika");
empOne.setSalary(1000);
empOne.printEmp();
}
}

运行结果:

1
2
name  : Ransika
salary :1000.0

类/静态变量(Class/static variables)

有些面向对象语言采用类变量(类数据)类方法两个术语,但意思都是一样,都代表着变量和方法只是作为整个类,而不是类的某个特定的对象而存在的。

  • 类变量也称为静态变量,其在类中,但在方法、构造函数或块之外利用static关键字进行声明。
  • 每个类只存在一个类变量的副本,而与被创建的对象个数无关。
  • 静态变量除了被声明为常量,很少使用到。常量是被声明为public/private, final and static的变量。常变量初始化后就不会再改变。
  • 静态变量存储在静态内存中。
  • 静态变量在程序开始执行时被创建,在程序停止时被摧毁。
  • 其可见性跟实例变量类似。然而,大多数静态变量被声明为public,因为它们必须对类用户可见。
  • 其默认值也和实例变量类似。
  • 引用静态变量有两种方法:一、可通过一个对象去定位它,如className.VariableName,二、可通过调用类名ClassName.VariableName进行访问。其静态方法也一样。
  • static方法的一个重要方法就是在不创建任何对象的前提下就可以调用它。
  • 当类变量声明为public static final,其变量名要全部大写;如果静态变量不是publicfinal,其变量名语法与实例变量和局部变量一样。

特别注意:当类变量声明为static final时,必须得赋初始值。这是由final变量的性质所决定的。

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.io.*;

public class Employee{
// salary variable is a private static variable
private static double salary;

// DEPARTMENT is a constant
public static final String DEPARTMENT = "Development ";

public static void main(String args[]){
salary = 1000;
System.out.println(DEPARTMENT + "average salary:" + salary);
}
}

运行结果:

1
Development average salary:1000

注意:如果变量是从外部类进行访问,其常变量应该这样访问:Employee.DEPARTMENT

静态变量与实例变量的区别

静态变量不属于某个实例对象,而是属于类,故能够通过类名来访问,不需要创建一个类的对象来访问该类的静态变量(当然也可以通过一个类的对象来访问静态变量,但是不提倡);而实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能够使用这个实例变量。
每个类只存在一个类变量的副本,而与被创建的对象个数无关,静态变量位于方法区,被类的所有实例共享,其生命周期取决于类的生命周期;而实例变量则是没创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区,其生命周期取决于实例的生命周期。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Test {
static int a;
int b;
public static void main(String[] args) {
Test test1 = new Test();
System.out.println(a);
//System.out.println(b); //It's not OK!
System.out.println(test1.b); //It's OK!

Test test2 = new Test();
a = 1;
test2.b = 1;
System.out.println(a);
System.out.println(test1.b);
System.out.println(test2.b);
}
}
/** output
0
0
1
0
1
*/

注意:如果变量是从外部类进行访问,其常变量应该这样访问:Employee.DEPARTMENT