A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 贾文泽 高级黑马   /  2013-4-29 03:14  /  1104 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一. 先说一下构造函数的访问修饰符问题
     不写不代表不能写,同样,构造函数也有四种访问修饰符,调用默认的构造函数时,是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的作用就是 开辟内存空间,分配给对象,并初始化对象,将对象应用返回并赋值给变量。


2 个回复

倒序浏览
支持楼主,分析的很好。
回复 使用道具 举报
谢谢楼主,学习了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马