黑马程序员技术交流社区

标题: 关于构造函数 [打印本页]

作者: 贾文泽    时间: 2013-4-29 03:14
标题: 关于构造函数
一. 先说一下构造函数的访问修饰符问题
     不写不代表不能写,同样,构造函数也有四种访问修饰符,调用默认的构造函数时,是public的,调用自己定义的构造函数[没写访问修饰符]时,是默认的[比public小,比private大]。如果把构造函数修饰为private,那么就不能被创建对象,单例设计模式和工厂设计模式中就会私有化构造函数。

二.重点说一下构造函数中是否存在return语句的问题。
      构造函数中能不能有return语句 和 我们能不能写return语句,我想这是两个问题,老师经常说构造函数中不能写return语句,我们就理解为,构造函数中不会存在return语句,我曾经做一道选择题的时候,有个选项说构造函数中不可以写return语句,我否认了这个选项,但是结果是我错了,经查证经过反编译的构造函数的字节码中最后一条指令确实是return,这个又怎么理解,
  1. <b><font size="4">public Test();
  2.   Code:
  3.    0: aload_0
  4.    1: invokespecial #1; //Method java/lang/Object."<init>":()V
  5.    4: return

  6.   LineNumberTable:
  7.    line 10: 0
  8. </font></b>
复制代码
这个return是返回了一个函数调用,没什么特殊含义。当你在java内写new时,后面除了一条new指令外,还有个 invokespecial调用这个类的构造函数。
return指的是,pop构造函数frame,回到new指令所在的frame。

       注:pop是Stack中的一个方法,作用移除并返回栈[函数被调用时,jvm都会为其分配一个栈区]顶部的元素,跟peek方法区别于peek方法不会移除,只做返回顶部元素操作
所以说,构造函数中是可以存在return语句的,只是我们定义构造函数的时候不可以在里面写return语句。

三. 再说下构造函数的返回值问题
     都晓得构造函数不能写返回值类型,包括void,但是通过调用构造函数确实得到了一个对象,那是不是返回值类型是Object呢? 这是错误的,我们不要认为返回对象是构造函数的功劳,注意构造跟返回不是一回事,别忘了他前面还有个new 呢,new的作用就是 开辟内存空间,分配给对象,并初始化对象,将对象应用返回并赋值给变量。



作者: 海不扬波    时间: 2013-4-29 10:22
支持楼主,分析的很好。
作者: 芦玉明    时间: 2013-4-29 10:31
谢谢楼主,学习了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2