Chapter2、对象与内存控制(1)初始化、成员变量、类变量的初始化时机

1、实例变量&类变量

Java的变量大体分为成员变量and局部变量。

其中局部变量可以分为 形参、方法内局部变量、代码块中的局部变量。 局部变量作用时间短暂,因此大多数的局部变量都保存在栈的内存中。

类体内定义的变量被称为成员变量(Field)。没有staitc修饰,则成为非静态变量\实例变量;如果有static修饰,则称为静态变量\类变量。换言说,static作用在于将实例成员变为类成员。加了static,成员变为类本身,不加,则是类的实例。

可以这样理解,类变量,在JVM中,每一个类变量都只需要对应一个内存空间与之相对应,而对于实例变量,则是每一个实例变量都要有内存空间与每一个相对应,因此,在实际使用中,实例变量的内存消耗要远远大于类变量的。

有这样一个语法

public class RightDef
{
     int num1=num2+2;
     static int num2=20;
}

注意,这个代码是正确的,因为num2是类变量,而num1为实例变量,在Java中,类变量的初始化是优先于成员变量的。

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

书中有这样的代码:

class Cat{
String name;
int age;
public Cat(String name,int age)
{
System.out.println("执行构造器初始化");
this.name=name;
this.age=age;
}
{
weight=2.0;
System.out.println("执行非静态初始化");
}
double weight=2.3;
public String toString()
{
return("Cat Name:"+this.name+",Age="+this.age+",Weight="+this.weight);
}
}
class Cat2{
String name;
int age;
public Cat2(String name,int age)
{
System.out.println("执行构造器初始化");
this.name=name;
this.age=age;
}
double weight=2.3;
{
weight=2.0;
System.out.println("执行非静态初始化");
}
public String toString()
{
return("Cat Name:"+this.name+",Age="+this.age+",Weight="+this.weight);
}
}
public class P24{
public static void main(String[] args)
{
Cat cat=new Cat("Kitty",1);
System.out.println(cat.toString());
Cat2 cat2=new Cat2("Tom",2);
System.out.println(cat2.toString());
}
}

执行结果为:

执行非静态初始化
执行构造器初始化
Cat Name:Kitty,Age=1,Weight=2.3
执行非静态初始化
执行构造器初始化
Cat Name:Tom,Age=2,Weight=2.0

根据书和这个例子,我们可以得到以下的结论:
1、实例变量在定义变量、构造器函数、非静态初始化中都可以进行,可以根据实际的需要来选择。
2、非静态的初始化区域和定义变量初始化的时候,其作用是等价的,即其效果是完全一样的,而这两部分执行的顺序,则完全依照其在代码中位置的先后顺序决定。
3、非静态的初始化区域\定义变量 其执行会比构造器中对变量的改变要早。

3、类变量的初始化时机
与成员变量类似,可以在定义的时候进行初始化,也可以在静态初始化块中进行初始化,而如果两部分都存在初始化,则器最终的效果也同成员变量初始化类似,都是根据在代码中的位置的先后顺序来决定的。

About: happyhls


发表评论

电子邮件地址不会被公开。 必填项已用*标注