理解Java-类与变量

Java程序初始化顺序

Java语言中当实例化对象时,对象所在的类的所有成员变量首先要进行实例化, 只有当所有类成员实例化后,才会调用对象所在类的构造函数创建对象.
Java程序的初始化一般遵循3个原则(优先级依次递减):

  • 1). 静态对象(变量)优先于非静态对象(变量)初始化.

  • 2). 分类优先于子类进行初始化.

  • 3). 按照成员变量的定义顺序进行初始化.即使变量定义散布于方法定义之中, 他们依然在任何方法(包括构造函数)被调用之前先初始化.

程序示例

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
class B {

static {
System.out.println("B with static ");
}

{
System.out.println("B with code block");
}

public B(){
System.out.println("B with construct");
}

}

class A extends B {

static {
System.out.println("A with static");
}

{
System.out.println("A with code block");
}

public A(){
System.out.println("A with construct");
}
}

场景1用例:

1
2
3
4
5
6
7
8
public class Test {

public static void main(String[] args) {
new B();
System.out.println("------");
new B();
}
}

场景1输出:

1
2
3
4
5
6
B with static 
B with code block
B with construct
------
B with code block
B with construct

场景2用例:

1
2
3
4
5
6
public class Test {

public static void main(String[] args) {
new A();
}
}

场景2输出:

1
2
3
4
5
6
B with static 
A with static
B with code block
B with construct
A with code block
A with construct

场景3用例:

1
2
3
4
5
6
7
8
public class Test {

public static void main(String[] args) {
new A();
System.out.println("------");
new A();
}
}

场景3输出:

1
2
3
4
5
6
7
8
9
10
11
B with static 
A with static
B with code block
B with construct
A with code block
A with construct
------
B with code block
B with construct
A with code block
A with construct

Java语言的变量类型

在Java语言中,变量的类型只要有3种: 成员变量、静态变量和局部变量.

成员变量

类成员变量的作用范围与类的实例化对象的作用范围相同, 当类被实例化时, 成员变量就会在内存中分配空间并初始化,直到这个被实例化对象的生命周期结束时成员变量的生命周期才结束.
类成员变量作用域有4种,访问权限范围由大到小依次为: public > protected > default > private.

  • public: 表明该成员变量或方法对所有类或对象都是可见的,所有类或对象都可以直接访问.

  • protected: 表明该成员变量或方法对自己及其子类是可见的,除此之外的其他类或对象都没有访问权限.

  • default: 表明该成员变量或方法只有自己和与其位于同一包内的类可见, 若父类与子类位于不同的包内,则无访问权限.

  • private: 表明该成员变量或方法是私有的,只有当前类对其具有访问权限,除此之外 的其他类或者对象都没有访问权限.

注意: 这些修饰符只能修饰成员变量,不能用来修饰局部变量, private与protected不能用来修饰类(只有 public、 abstract或 final 能用来修饰类).

静态变量

被static修饰的成员变量称为静态变量或全局变量,与成员变量不同的是,静态变量不依赖于特定的实例,而是被所有实例所共享; 也就是说: 只要一个类被加载, JVM就会给类的静态变量分配存储空间. 因此就可以通过类名和变量名来访问静态变量.

局部变量

局部变量的作用域与可见性为它所在的花括号内.