请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

<clinit>创建了this吗老师?

图片描述
老师您上课说构造方法是回调方法,真正的this是这个特殊方法调用的,我查阅虚拟机规范上面这样写。

图片描述
我对这句话的理解是,其实就是执行一个静态块,给静态变量赋初值,但是静态块方法不是在类初始化的时候只执行一次吗。如果是它创建了this,一个类可以构造n个象持有n个不同的this那么这个方法也会被调用n次吗?感觉有点不对头,恳请老师赐教

正在回答

1回答

举个例子来说:当我们在 new A() 的时候, JVM就知道我们要创建一个A对象的实例, 那么JVM怎么去创建了,JVM就是去调用这个<clinit>方法,这个都是它内部写好的实现,去完成真正的 对象实例的创建工作,比如:分配内存啊、初始化属性啊 等工作,也就是说,<clinit>方法执行完了,其实实例对象就已经创建好了。 

然后呢,这个时候JVM才会来调用 我们创建这个所谓的构造方法,也就是 A(),本质上这个方法,对于JVM而言,就是一个回调方法,也就是给程序员一个机会,在创建类实例的时候,想做点啥功能的话,就写到这里,如果没有,你不写任何东西,也没有关系,因为对象实例已经创建好了的。

静态块又是另外一个逻辑了,静态块是类装载的时候就运行的,它跟实例对象没有关系,你不要搞混了

0 回复 有任何疑惑可以回复我~
  • 提问者 Panda_io #1
    收到,谢谢老师答疑解惑,我后面去看了一些资料,老师您看这篇文章写得对不对呢https://blog.csdn.net/u013309870/article/details/72975536
    回复 有任何疑惑可以回复我~ 2020-06-30 08:40:34
  • 应该是<init>方法初始化实例对象吧?我也觉得老师课程里说的不对,这篇回答也不对,我的理解是<clinit>方法应该是静态代码块所构成的方法,与对象实例化无关。
    回复 有任何疑惑可以回复我~ 2021-06-03 23:20:19
  • "静态块是类装载的时候就运行的" 对吗?不对吧,静态代码块是在类初始化的时候执行的,而类装载在类初始化之前,两步骤不一定一起执行。
    回复 有任何疑惑可以回复我~ 2021-06-03 23:35:52
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信