Java的初始化,
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的时候,会调用构造函数,然后构造函数将成员变量进行了赋值,但是对于局部变量来说构造函数是无法调用的,因为构造函数本身也是类的一个局部方法。所以当我们直接定义局部变量不进行赋值的话,虚拟机是无法将其初始化的。因此我们必须手动给局部变量进行赋值。
突然感觉还有好多不明白的地方。。。。。。。
相关文章
- 暂无相关文章
用户点评