`
Mr.Zhong
  • 浏览: 11771 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java 类的显性实例化

阅读更多

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  

关键在于LDCxyz”这条指令,明显可以看出,这是用于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);

}

}

 

 

分享到:
评论

相关推荐

    Java 接口与继承

    5. 创建子类对象时,会按照一定的顺序进行初始化:首先是默认初始化,然后绑定构造方法参数,接着调用父类构造函数,最后执行实例变量的显性初始化和构造方法的主体代码。 接口在Java中是一种完全抽象的类,它只...

    基于分布式认知对隐性知识显性化的研究.pdf

    通过利用分布式认知理论,研究者可以更深入地探讨隐性知识显性化的本质,以及如何通过各种策略和工具促进隐性知识的显性化过程。 在分布式认知的框架下,隐性知识显性化的过程可能包括以下几个方面:首先,通过社会...

    VC++动态链接库操作,创建隐性和显性链接

    在Lelecode.com提供的实例源码中,你可以找到创建和使用隐性链接及显性链接的示例代码。通过分析这些代码,你可以更好地理解这两种链接方式的工作原理及其在实际项目中的应用。 总之,VC++中的动态链接库操作是一项...

    基于分布式学习研究中医隐性知识显性化转移的创新路径及方法.pdf

    中医隐性知识显性化转移是当前中医药研究与传承领域的一个重要课题。隐性知识是个人或者团体在长时间的实践过程中积累的,不易于被直接传播和表达的知识。与显性知识不同,隐性知识更多地表现为一种个人经验、直觉、...

    一目了然Web软件显性设计之路

    资源名称:一目了然Web软件显性设计之路资源目录:译考序致 谢第1章 显性设计的定义 什么是显性设计 卓越软件的品质 如何傲到显性设计 将品质转化为目标 显性设计框架 了解构建什么 了解什么决定卓越 了解...

    显性与隐形指导对英语语用能力培养作用的对比研究

    在二语习得相关理论指导下,本研究以某高校英语专业三个班学生为研究对象,尝试对比显性和隐形形式教学对英语学习者的善意批评语用能力的培养作用。研究发现:对于课堂外很少使用英语的学生来说,教师可以用教学手段培养...

    关于道德范畴下社会性软件隐性知识显性化研究.docx

    "关于道德范畴下社会性软件隐性知识显性化研究" 本文对道德范畴下的社会性软件的隐性知识进行了现状分析,指出社会性软件在隐性知识显性化的提供上存在严重的问题,造成虚拟世界与现实世界的双重道德标准,并以开源...

    一目了然Web软件显性设计之路.rar

    《一目了然Web软件显性设计之路》这本书详细阐述了这些原则,并通过实例分析和案例研究,帮助设计师掌握显性设计的技巧,从而创造出更加用户友好的Web应用。通过阅读这本书,无论是初学者还是经验丰富的设计师,都能...

    基于数据挖掘的隐性知识显性化及其构建.pdf

    隐性知识和显性知识之间存在着相互转化的四种模式:社会化、外在化、内在化和联合化。这些转化模式构成了个人和组织学习和发展的基础。 在教育领域,教师的话语,特别是第二语言教学中的教师口语语料,承载着教师的...

    隐性知识显性化——信息时代期刊馆员的功能定位.pdf

    特别是隐性知识的显性化,即个人或组织内部那些未被明确表述、难以直接传递的知识转化为可交流、可分享的形式,这一过程在期刊馆员的工作中显得尤为关键。本文将围绕【隐性知识显性化】这一核心概念,探讨信息时代下...

    Dropout的隐性和显性正则化效应.pdf

    Dropout是一种广泛使用的正则化技术,通常需要为许多体系结构获得最先进的技术。这项工作表明,dropout引入了两种截然不同但相互纠缠的正则化效应:由于dropout修改了预期的训练目标而产生的显式效应(在之前的工作中...

    根据指定来路网址的显性跳转代码

    根据指定来路网址的显性跳转代码

    银行业日报:银行隐形风险显性化推动板块估值上升.pdf

    银行业日报:银行隐形风险显性化推动板块估值上升.pdf

    cpar.rar_CPAR java_CPAR算法_cpar_关联规则分类_分类算法

    总的来说,CPAR算法是一种结合关联规则和分类的创新方法,它能够发现数据中非显性的规律,从而提高预测的准确性和解释性。对于希望深入理解数据挖掘和分类算法的IT专业人士来说,学习和掌握CPAR算法是十分有价值的。...

    新人教八年级生物下册基因的显性和隐性PPT学习教案.pptx

    标题中的“基因的显性和隐性”是生物学中的核心概念,尤其在遗传学领域。基因是生物体内控制性状的基本单位,是染色体上的DNA片段。这些DNA片段携带着生物体生长、发育和功能的各种指令。在描述中提到了“新人教八...

    传媒互联网行业:AI显性化元年,应用端多点开花.pdf

    【传媒互联网行业:AI显性化元年,应用端多点开花】 随着人工智能技术的快速发展,特别是ChatGPT等先进自然语言处理工具的推出,传媒互联网行业正经历一个AI显性化的关键时期。ChatGPT,由美国OpenAI公司开发,基于...

    新人教八年级生物下册 基因的显性和隐性PPT学习教案.pptx

    【基因的显性和隐性】是生物学中的基本概念,它涉及到遗传学的基础理论。基因,简单来说,是染色体上具有控制生物性状的DNA片段。这些性状可以是眼睛的颜色、身高、肤色等。在每个生物的体细胞中,染色体都是成对...

    多元显性回归

    统计 计量 回归,通过学习计量经济的多元线性回归,可以很清除明白各种的计量经济模型。

Global site tag (gtag.js) - Google Analytics