Java进阶---对象与内存控制(一) (二)

2014-11-24 11:14:46 · 作者: · 浏览: 1
System.out.println("通过noFive变量访问age类变量:" + noFive.age);
System.out.println("通过noFive2变量访问age类变量:" + noFive2.age);
System.out.println("通过NoFive类访问age类变量 :" + NoFive.age);

}
}


2)、实例变量的初始化时机

程序运行中,每次创建Java对象都会为实例变量分配内存空间,并对实例变量执行初始化。在代码中,程序可以在3个地方对实例变量执行初始化:

l 定义实例变量时指定初始值;

l 非静态初始化块中对实例变量指定初始值;

l 构造器中对实例变量指定的初始化。

其中前两种方式比最后一种方式更早执行,但前两种方式的执行顺序与它们在源程序中的排列顺序相同。例如:


[java]
class NoFive{
{
name = “小武灵灵”;
}
String name = “灵灵小武”;
public void output(){System.out.println(name);}
}

class NoFive{
{
name = “小武灵灵”;
}
String name = “灵灵小武”;
public void output(){System.out.println(name);}
}


上面程序output方法输出的name值应该为”灵灵小武”.

3)、类变量的初始化时机

在程序中,JVM对一个Java类只初始化一次,因此Java程序每运行一次,系统只为类变量分配一次内存空间,执行一次初始化。在代码中,程序可以在2个地方对类变量执行初始化:

l 定义类变量时指定初始值;

l 静态初始化块中对类变量指定初始值。

这两种方式的执行顺序与它们在源程序中的排列顺序相同。下面是一个例子:


[java]
public class test01 {
//定义时指定初始值
static String name = "小武";
//通过静态初始化块为id类变量指定初始值
static{
System.out.println("静态初始化块");
id = 6190014;

}
static int id = 41009160;
public static void main(String[] args) {
System.out.println("name类变量的值:" + test01.name);
System.out.println("id类变量的值:" + test01.id);
}
}

public class test01 {
//定义时指定初始值
static String name = "小武";
//通过静态初始化块为id类变量指定初始值
static{
System.out.println("静态初始化块");
id = 6190014;

}
static int id = 41009160;
public static void main(String[] args) {
System.out.println("name类变量的值:" + test01.name);
System.out.println("id类变量的值:" + test01.id);
}
}


上面程序输出结果为“小武”和“41009160”。程序执行的顺序为:系统先为所有类变量分配内存空间,再按源代码中的排列顺序执行静态初始化块中所指定的初始值和定义类变量时所指定的初始值。

下面借用一个典型的例子来更好地理解类变量的初始化过程。首先定义了Price类,该Price类里有一个静态的initPrice变量,用于代表初始价格。每次创建Price实例时,系统会以initPrice为基础,减去当前打折价格(由discount参数代表)即得到该Price的currentPrice变量值。


[java]
class Price{
//类成员是Price实例
final static Price INSTANCE = new Price(2.8);
//再定义一个类变量
static double initPrice = 20;
//定义该Price的currentPrice实例变量
double currentPrice;
public Price(double discount) {
//根据静态变量计算实例变量
currentPrice = initPrice - discount;
}
}

public class test01 {
public static void main(String[] args) {
//通过Price的INSTANCE访问currentPrice实例变量
System.out.println(Price.INSTANCE.currentPrice);
//显示创建Price实例
Price p = new Price(2.8);
//通过显示创建的Price实例访问currentPrice实例变量
System.out.println(p.currentPrice);
}
}

class Price{
//类成员是Price实例
final static Price INSTANCE = new Price(2.8);
//再定义一个类变量
static double initPrice = 20;
//定义该Price的currentPrice实例变量
double currentPrice;
public Price(double discount) {
//根据静态变量计算实例变量
currentPrice = initPrice - discount;
}
}

public class test01 {
public static void main(String[] args) {
//通过Price的INSTANCE访问currentPrice实例变量
System.out.println(Price.INSTANCE.currentPrice);