Java的初始化

整理一下基础的东西,可能有错误之处,还请指教

在说实例化和初始化之前,我们首先先来了解一下JVM加载类的机制。

类的加载过程,通俗的说就是开发人员实现的代码在编译之后,生成*.class文件,

然后通过虚拟机(JVM)把它加载到内存里面的过程,就是类的加载机制。

JVM加载类有三部:

1.加载

加载是将类加载到内存里面,即方法区。这个过程是不会执行任何语句。但是这个过程中,非静态变量是不会被加载的。

2.链接

这个过程又分三部:

1)验证:即验证加载的类是否符合JVM的要求

2)准备:为静态变量分配空间,并设置初始值。这里说的初始值是值得类型的初始值,而不是我们赋值的值。例如:

static int i=1;在这个过程中只是给i分配了内存,然后把i赋上了类型的初始值,即现在i=0;

3)解析:将字符调用转成直接调用。

通过上面几步,接下来我们就可以进行初始化了。

3.初始化

在这一步,才算真正的执行Java代码了。

给静态变量赋值,即上面的1,在这赋值给i。

那么现在问题就来了,为什么说这里要是静态变量会赋值呢?那么非静态变量以及它存到哪里去了呢?

在这里个人理解,初始化的过程,伴随着类的实例化。但是静态变量不需要类的实例化。也就是说,如果想初始化一个成员变量,那么我们就应该先实例化这个变量所在的类,即new一个对象,给这个类分配一个内存空间,把变量分配到内存中。然后进行赋值。这是Java虚拟机的规定。

<pre name="code" class="java">package controller;

public class Base {
	 	int a;  
	    static int b=3;  
	    static int c = 1;  
}

 
 
package controller;

public class Test {
	public static void main(String[] args) {
		System.out.println(Base.b);
		Base base=new Base();
		System.out.println(base.a);
	}
}

在上面的代码我们可以看到,对于成员变量我们必须进行new一个对象,也就是分配空间。然后实现初始化。

然后我们又会有个问题?

那么成员变量和局部变量之间的初始化呢

package controller;

public class Test {
	
	int a;
	
	public static void main(String[] args) {
		int b;
		Test test=new Test();
		System.out.println(test.a);
		System.out.println(b);
	}
}
这时候,b是无法被初始化的,程序报错。

这个是因为当我们new的时候,会调用构造函数,然后构造函数将成员变量进行了赋值,但是对于局部变量来说构造函数是无法调用的,因为构造函数本身也是类的一个局部方法。所以当我们直接定义局部变量不进行赋值的话,虚拟机是无法将其初始化的。因此我们必须手动给局部变量进行赋值。

突然感觉还有好多不明白的地方。。。。。。。


猜你喜欢

转载自blog.csdn.net/hbl6016/article/details/52951173