一. 先说一下构造函数的访问修饰符问题
不写不代表不能写,同样,构造函数也有四种访问修饰符,调用默认的构造函数时,是public的,调用自己定义的构造函数[没写访问修饰符]时,是默认的[比public小,比private大]。如果把构造函数修饰为private,那么就不能被创建对象,单例设计模式和工厂设计模式中就会私有化构造函数。
二.重点说一下构造函数中是否存在return语句的问题。
构造函数中能不能有return语句 和 我们能不能写return语句,我想这是两个问题,老师经常说构造函数中不能写return语句,我们就理解为,构造函数中不会存在return语句,我曾经做一道选择题的时候,有个选项说构造函数中不可以写return语句,我否认了这个选项,但是结果是我错了,经查证经过反编译的构造函数的字节码中最后一条指令确实是return,这个又怎么理解,- <b><font size="4">public Test();
- Code:
- 0: aload_0
- 1: invokespecial #1; //Method java/lang/Object."<init>":()V
- 4: return
- LineNumberTable:
- line 10: 0
- </font></b>
复制代码 这个return是返回了一个函数调用,没什么特殊含义。当你在java内写new时,后面除了一条new指令外,还有个 invokespecial调用这个类的构造函数。
return指的是,pop构造函数frame,回到new指令所在的frame。
注:pop是Stack中的一个方法,作用移除并返回栈[函数被调用时,jvm都会为其分配一个栈区]顶部的元素,跟peek方法区别于peek方法不会移除,只做返回顶部元素操作
所以说,构造函数中是可以存在return语句的,只是我们定义构造函数的时候不可以在里面写return语句。
三. 再说下构造函数的返回值问题
都晓得构造函数不能写返回值类型,包括void,但是通过调用构造函数确实得到了一个对象,那是不是返回值类型是Object呢? 这是错误的,我们不要认为返回对象是构造函数的功劳,注意构造跟返回不是一回事,别忘了他前面还有个new 呢,new的作用就是 开辟内存空间,分配给对象,并初始化对象,将对象应用返回并赋值给变量。
|
|