Java 类的显性实例化
Java类的实例化具有显性和隐性的区别,我们编程时一般使用new方法直接实例化,这是最简单直接的显性实例化。另外还有三种实例化,分别为反射机制中的newInstance()方法,类的Clone()方法和解串行化使用的ObjecInputStream中的getObject()方法。
在这里我主要讲一下java类显性实例化及其应注意的问题,隐性实例化的相关内容和问题会在以后补充上。
一、显的性实例化
直接使用new关键字实例化新的对象:
调用相应的构造函数完成实例化。(类中的非静态成员变量如果有初始化语句,都会被隐式的加入到构造函数中),具体如下:
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文件中的构造函数对应的字节码如下:
INVOKESPECIAL Object.<init>() : void
ALOAD 0: this
LDC "xyz"
PUTFIELD Test.strA : String
ALOAD 0: this
ALOAD 1: str
PUTFIELD Test.strB : String
RETURN
关键在于LDC“xyz”这条指令,明显可以看出,这是用于strA初始化的字符串。
由此我们可以归纳出,在没有调用本类中的其他的构造函数的情况下,每次类的构造函数都会按如下的顺序进行:
a)隐式(或显性)的调用构造函数;
b)然后执行写在构造函数外的成员变量的初始化;
c)最后在执行构造函数中的命令。
如果是有显性的调用本类其他构造函数(必须是放在构造函数的第一步执行),那么对于这个构造函数,处理过程就简单些了:
a) 调用这个构造函数;
b) 执行之后的代码。
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();
}
}
执行结果为:
mno
至于为什么一定要将另外一个构造函数放在构造函数的第一步:必须先处理好heap中的变量初始化后才能下一步执行。
二、显性实例化中遇到的问题及解决
以上是对java类中的显性实例化的介绍,下面看看本人在写代码中遇到的问题,进一步认识显性实例化过程中应注意的问题,当然,可能只是涉及问题的某一部分,不足之处请加以谅解。
在该程序中共有三个类,希望通过构造函数初始化的方法,把第一个类中的对象传给第二个类,第二个类再用同样的方法传给第三个类。
具体如下:(代码是模拟的,主要是为了简单明了,不保证可运行)
Public class First{
Public static void main(String []args ){
First first = new First();
first.test1();
}
//该方法实例化了一个对象,通过第二个类的构造函数传至第二个类中
Public void test1(){
String s = “student”;
System.out.println(“第一个类中的s打印值:”+s );
//初始化话第二个类,并通过构造函数传值s
Second second = new Second(s);
}
}
Public class Second{
Private String s;
Three three = new Three(s);
Public Second(String s){
This.s = s;
System.out.println(“第二个类中的s打印值:”+s );
}
}
Public class Three{
Private String s;
Public Three(String s){
this.s = s;
System.out.println(“第三个类中的s打印值:”+s );
}
}
如果运行上面的代码,则会得出下面的输出结果:
“第一个类中的s打印值:”student
“第三个类中的s打印值:”null
“第二个类中的s打印值:”student。
由此可见,测试的输出结果与我们的设计思路相反,第三个类的构造函数运行先于第二个类的构造函数,这是由于在第二个类中,由于显性实例化的缘故,Three three = new Three(s);的初始化在第二个类的构造函数之前,而此时Three的构造函数中传入的值还是空的,有与构造函数还没有执行的缘故。如此,程序虽然通过编译,但是运行时则会出现逻辑错误,而这个错误的排除,由于个人的思维定式,难度也就有所增加了。
那么,该如何去解决这个问题呢,很简单,根据显性实例化的特点,我们只需把作为第二个类中的变量 three的实例化,放到该类中的一个方法中,当需要实例化第三个类的变量,变传值的时候再调用该方法。具体如下:
Public class Second{
Private String s;
Three three;
Public Second(String s){
This.s = s;
System.out.println(“第二个类中的s打印值:”+s );
}
Public void test2(){
Three three = new Three(s);
}
}
分享到:
相关推荐
摘要:VC/C++源码,控件相关,隐性链接,显性链接 VC++动态链接库操作,创建隐性和显性链接的实例源码,实例源码运行截图如上所示。
资源名称:一目了然Web软件显性设计之路资源目录:译考序致 谢第1章 显性设计的定义 什么是显性设计 卓越软件的品质 如何傲到显性设计 将品质转化为目标 显性设计框架 了解构建什么 了解什么决定卓越 了解...
在二语习得相关理论指导下,本研究以某高校英语专业三个班学生为研究对象,尝试对比显性和隐形形式教学对英语学习者的善意批评语用能力的培养作用。研究发现:对于课堂外很少使用英语的学生来说,教师可以用教学手段培养...
基于数据挖掘的隐性知识显性化及其构建.pdf
Dropout是一种广泛使用的正则化技术,通常需要为许多体系结构获得最先进的技术。这项工作表明,dropout引入了两种截然不同但相互纠缠的正则化效应:由于dropout修改了预期的训练目标而产生的显式效应(在之前的工作中...
根据指定来路网址的显性跳转代码
关于道德范畴下社会性软件隐性知识显性化研究.docx
隐性知识显性化——信息时代期刊馆员的功能定位.pdf
银行业日报:银行隐形风险显性化推动板块估值上升.pdf
一目了然Web软件显性设计之路
近年来,在英语语法教学中,语法形式在不同语境中的隐性意义被高度关注,这弥补了以往语法教学只注重形式和其显性意义的不足。但隐性意义的推理和理解离不开显性意义的掌握,因为隐性意义的获得,依赖于显性意义和语境的...
统计 计量 回归,通过学习计量经济的多元线性回归,可以很清除明白各种的计量经济模型。
呈现基本面数据之美:数据走弱显性化,汽车消费存隐患(56页).pdf
一种基于项目的混合显性隐性反馈的协同过滤推荐算法.docx一种基于项目的混合显性隐性反馈的协同过滤推荐算法.docx一种基于项目的混合显性隐性反馈的协同过滤推荐算法.docx一种基于项目的混合显性隐性反馈的协同过滤...
3.10 常用数学工具包——java.lang.Math类 39 3.10.1 数学常量 39 3.10.2 常用数学函数 40 3.11 小结 41 第4章 流程控制——Java世界的航行舵手 42 4.1 if条件语句 42 4.1.1 简略形式 42 4.1.2 完全...
基本金属&贵金属周报:疫情对经济的负向冲击显性化窗口来临,黄金配置价值提升.pdf
新人教八年级生物下册基因的显性和隐性PPT学习教案.pptx
新人教八年级生物下册 基因的显性和隐性PPT学习教案.pptx
房地产行业月国家统计局房地产数据点评:房地产疫情影响显性化,关注数据预期差-37-光大证券-页.pdf