构造器被谁调用?

Lucare 2014-11-24 08:50:41
如题,以前看资料了解过对象创建过程,说什么先调用静态变量或静态代码块,非静态变量和代码块,然后调用构造函数。但是在Thinking in Java中说构造器是编译器调用的,那么后面运行时分配内存,赋初值,怎么又会调用构造器,表示不理解。谁能讲下在new一个对象时编译器做了什么。
...全文
510 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
树成 2014-12-03
  • 打赏
  • 举报
回复
你会这么理解,不是那本书写错了,就是你看错了,要么就是你理解错了。
Lucare 2014-12-01
  • 打赏
  • 举报
回复
看清问题作答撒。上面的分析多是一种抽象化的分析,但是编译器怎么会调用构造器。
JPF1024 2014-12-01
  • 打赏
  • 举报
回复
<深入Java虚拟机>去看类加载机制就明白了
fomeiherz 2014-11-30
  • 打赏
  • 举报
回复
new关键字创建对象:



1)为对象分配内存空间,将对象的实例变量自动初始化为其变量类型的默认值
2)如果实例变量在声明时被显示初始化,那就把初始化值赋给实例变量
3)调用构造方法,显示初始值
4)返回对象的引用(把指针给对象名)
Lucare 2014-11-24
  • 打赏
  • 举报
回复
难道要沉的节奏》??????
Lucare 2014-11-24
  • 打赏
  • 举报
回复
引用 2 楼 kk_124 的回复:
[quote=引用 1 楼 u013283727 的回复:] 自己先顶一个。然后说下我的理解: 所有的变量初始化最终都会在构造器内进行,而且是按上面说的顺序进行,构造器里面的赋值代码最后执行,但是仅仅是赋值而已,为了让运行时分配内存变得有条理,通常我们打印的输出只能说明他们的先后顺序,但是他们的初始化却早已在编译期埋下伏笔。不过运行时才真正调用了构造器啊,前面(编译期)只能说是个排版吧。
你的理解有点那么意思,但是真正的过程可不是这么简单,单说构造器可能不能完全理解,这个要从类加载到对象初始化细说,由于都是概念性东西,楼主可以去搜一下“类加载步骤”入手。[/quote] 好的,这东西有点复杂。我还是慢慢了解。
普凡 2014-11-24
  • 打赏
  • 举报
回复
引用 1 楼 u013283727 的回复:
自己先顶一个。然后说下我的理解: 所有的变量初始化最终都会在构造器内进行,而且是按上面说的顺序进行,构造器里面的赋值代码最后执行,但是仅仅是赋值而已,为了让运行时分配内存变得有条理,通常我们打印的输出只能说明他们的先后顺序,但是他们的初始化却早已在编译期埋下伏笔。不过运行时才真正调用了构造器啊,前面(编译期)只能说是个排版吧。
你的理解有点那么意思,但是真正的过程可不是这么简单,单说构造器可能不能完全理解,这个要从类加载到对象初始化细说,由于都是概念性东西,楼主可以去搜一下“类加载步骤”入手。
csdn_1314 2014-11-24
  • 打赏
  • 举报
回复
这不是 自己写的构造, 是编译器添加的构造, 初始化变量默认值如
 int i=6; 先int i=0 在 i=6
Lucare 2014-11-24
  • 打赏
  • 举报
回复
引用 5 楼 sum_rain 的回复:
谈谈个人的理解。我觉得编译器干的事就是语法检查,然后把java文件编译成jvm可执行的字节码文件。然后当程序被运行时,步骤是这样的,字节码(字节码也是按一定规则拆分存放的,如常量池,访问标识,接口,方法域等)会被加载到内存(像类的全限定名,类型,常量池等会被存到方法区),然后执行程序时jvm会先启动main线程,接着就是一行行执行程序,当执行到new时,会在队中开辟一个对象空间,默认初始值为空或者0等(要看数据类型,如int 就是初始化为0),然后执行构造函数,构造函数会将参数传到对象的堆空间,给里面的实例域赋初值。
我也觉得差不多这样,那么书中所说编译器调用构造器干嘛。
Lucare 2014-11-24
  • 打赏
  • 举报
回复
自己先顶一个。然后说下我的理解: 所有的变量初始化最终都会在构造器内进行,而且是按上面说的顺序进行,构造器里面的赋值代码最后执行,但是仅仅是赋值而已,为了让运行时分配内存变得有条理,通常我们打印的输出只能说明他们的先后顺序,但是他们的初始化却早已在编译期埋下伏笔。不过运行时才真正调用了构造器啊,前面(编译期)只能说是个排版吧。
AceShot 2014-11-24
  • 打赏
  • 举报
回复
谈谈个人的理解。我觉得编译器干的事就是语法检查,然后把java文件编译成jvm可执行的字节码文件。然后当程序被运行时,步骤是这样的,字节码(字节码也是按一定规则拆分存放的,如常量池,访问标识,接口,方法域等)会被加载到内存(像类的全限定名,类型,常量池等会被存到方法区),然后执行程序时jvm会先启动main线程,接着就是一行行执行程序,当执行到new时,会在队中开辟一个对象空间,默认初始值为空或者0等(要看数据类型,如int 就是初始化为0),然后执行构造函数,构造函数会将参数传到对象的堆空间,给里面的实例域赋初值。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧