JAVA对象与内存控制
1.1 实例变量和类变量
成员变量和局部变量:
局部变量分为三大类:
1)形参:在方法签名中定义的局部变量,由方法调用者为其赋值,随方法的结束而消亡。
2)方法内的局部变量:在方法内定义的局部变量,随方法的结束而消亡。
3)代码块内的局部变量:在代码块内定义的局部变量,随代码块的结束而消亡。
局部变量的作用时间很短,它们都是被存在方法的栈内存中。
1.2实例变量的初始化时机
对于实例变量而言,它属于java对象本身,每次程序创建Java对象时都需要为实例变量分配内存空间,并执行初始化。从程序运行角度来看,每次创建Java对象都会为实例变量分配内存空间,并对实例变量执行初始化。
从语法角度看,程序可以在3个地方对实例变量执行初始化:
1) 定义实例变量时指定初始值
2) 非静态初始化块中对实例变量指定初始值
3) 构造器中对实例变量指定初始值
这三中方式中,第一种和第二种比第三种更早执行
代码:
1 public class ObjTest { 2 public static void main(String[] args) { 3 Cat cat = new Cat("ketty", 2); 4 System.out.println(cat); 5 Cat c2 = new Cat("hello", 3); 6 System.out.println(c2); 7 } 8 } 9 10 class Cat { 11 //定义name、age两个属性 12 String name; 13 int age; 14 15 //使用构造器初始化name、age两个变量 16 public Cat(String name,int age){ 17 System.out.println("执行构造器"); 18 this.name = name; 19 this.age = age; 20 } 21 22 { 23 System.out.println("执行非静态初始化块"); 24 weight = 2.0; 25 } 26 //定义时指定初始值 27 double weight = 2.3; 28 29 @Override 30 public String toString() { 31 return "Cat [name=" + name + ", age=" + age + ", weight=" + weight 32 + "]"; 33 } 34 }
输入结果:
1 执行非静态初始化块 2 执行构造器 3 Cat [name=ketty, age=2, weight=2.3] 4 执行非静态初始化块 5 执行构造器 6 Cat [name=hello, age=3, weight=2.3]
1.3 类变量的初始化时机
从程序运行的角度来看,JVM对一个Java类只初始化一次,因此Java程序每运行一次,系统只为类变量分配一次内存空间,执行一次初始化。
从语法角度来看,程序可以在2个地方对类变量执行初始化:
1.定义类变量时指定初始值
2.静态初始化块中对类变量指定初始值
代码:
1 public class StaticInitTest { 2 //定义count类变量,定义时指定初始值 3 static int count = 2; 4 5 //通过静态初始化块为name类变量指定初始值 6 static{ 7 System.out.println("StaticInitTest的静态初始化块"); 8 name = "Java编程"; 9 } 10 11 static String name = "疯狂Java讲义"; 12 13 public static void main(String[] args) { 14 //访问该类的两个类变量, 15 System.out.println("count类变量的值" + StaticInitTest.count); 16 System.out.println("name类变量的值" + StaticInitTest.name); 17 } 18 }
输出:
1 StaticInitTest的静态初始化块 2 count类变量的值2 3 name类变量的值疯狂Java讲义