栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

哪个先运行?实例变量或超级构造函数的默认值?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

哪个先运行?实例变量或超级构造函数的默认值?

初始化序列在JLS
12.5中
指定:

  1. 首先,为新对象分配内存
  2. 然后,将对象中的所有实例变量(包括在此类及其所有超类中定义的实例变量)初始化为其默认值。
  3. 最后,调用构造函数。

规范的相关部分是:

如果没有足够的空间为该对象分配内存,则该类实例的创建将突然完成,并显示OutOfMemoryError。
否则,新对象中的所有实例变量(包括在超类中声明的实例变量)都将初始化为其默认值(第4.12.5节)。

在返回对新创建对象的引用作为结果之前,使用以下过程 处理指示的构造函数 以初始化新对象:

这是永远不要

final
从构造函数调用非方法的原因之一:该方法可能会被子类覆盖,在这种情况下,该方法将在子类有机会设置该方法可能需要的状态之前被调用。考虑以下示例:

public class Super {  private final int superValue;  protected Super() {    superValue = getSuperValue();  }  protected int getSuperValue() {    return 1;  }  @Override  public String toString() {    return Integer.toString(superValue);  }}public class Sub extends Super {  private final int superValueOverride;  public Sub(int value) {    this.superValueOverride = value;  }  @Override  protected int getSuperValue() {    return superValueOverride;  }  public static void main(String[] args) {    Super s = new Sub(2);    System.out.println(s);  }}

看起来

s.superValue
应该是2,对不对?毕竟,要
Sub
重写
getSuperValue()
以返回的值
superValueOverride
,该值被初始化为2。但是,该方法在的任何
Sub
字段初始化之前(而不是其默认值)被调用,因此
s.superValue
实际上是0(默认值
superValueOverride
)。

这是更奇怪的,因为

superValueOverride
final
,但它似乎改变了它的价值!
Super
调用时为0
getSuperValue()
,只有在
Super
构造函数完成后才为其分配最终值2(或传递给构造函数的任何值)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/404379.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号