〖JAVE经验〗java类的实例化探究

java类的实例化(instantiation)具有显性的和隐性的区别。

一般编程时,我们锁使用new的方法实例化,这是最简单直接的显性实例化。另外还有三种实例化,分别为反射机制中的newInstance()方法,类的clone()方法和解串行化使用的ObjecInputStream中的getObject()方法。

而隐性的实例化则出现在java程序的整个生命周期中,包括String 、Class ,StringBuffer 或者StringBuilder的实例化。

详细内容如下:

显性的实例化:1.直接使用new关键字创建新的对象。

调用相应的构造函数完成实例化。(类中的非静态成员变量如果有初始化语句,都会被隐式的加入到构造函数中)代码如下:view plain public class Test {

String strA = “xyz”;String strB ;

public Test(String str){ strB = str ;} public static void main(String[]args){ Test t = new Test(“abc”);}

}在eclipse中装了ASM bytecode插件后,观察。class文件中的构造函数对应的字节码如下:view plain INVOKESPECIAL Object.():void L1 LINENUMBER 5 L1 ALOAD 0:this LDC “xyz” PUTFIELD Test.strA :String L2 LINENUMBER 9 L2 ALOAD 0:this ALOAD 1:str PUTFIELD Test.strB :String L3 LINENUMBER 10 L3 RETURN L4 LOCALVARIABLE this Test L0 L4 0 LOCALVARIABLE str String L0 L4 1 MAXSTACK = 2 MAXLOCALS = 2其中L1 ,L2 ,L3,L4为debug锁使用的源代码行号标记,最后两行为方法调用的栈大小申明,LOCALVARIABLE也为方便调试的变量声明,不用理会。

关键在于LDC“xyz”这条指令,明显可以看出,这是用于strA初始化的字符串。

由此我们可以归纳出,在没有调用本类中其他的构造函数的情况下,每次类的构造函数中都会按如下顺序进行:a)隐式(或显性)的调用父类的构造函数,b)然后执行写在构造函数外的成员变量的初始化赋值c)最后再执行构造函数中的命令。

如果是有显性的调用本类其他构造函数(必须是放在构造函数第一步执行),那么对于这个构造函数,处理过程就简单些了:a)调用那个构造函数。

b)执行之后的代码。

view plain public class Test {

String strA = “xyz”;String strB ;

public Test(String str){ this();} public Test(){ strB = “mno”;}

public void print(){ System.out.println(strB);}

public static void main(String[]args){ Test t = new Test(“abc”);t.print();}

}执行结果为view plain mno

更多免费相关学习经验请访问:Tore_m_1206686_21115_1_1.html”>http://www.shangxueba.com/sTore_m_1206686_21115_1_1.html

太过于近,彼此身上隐性的刺又会深深的伤害对方。

〖JAVE经验〗java类的实例化探究

相关文章:

你感兴趣的文章:

标签云: