每天进步一点点,好记性不如烂笔头

导航

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讲义

 

posted on 2017-05-24 22:38  yujiwei  阅读(189)  评论(0编辑  收藏  举报