我找不到任何关于这个具体案例的具体SO帖子,所以我想问一下我认为是/否的问题。
以下是JLS§12.4.2(Java SE 8),清单6-7:
我的问题是:这是否意味着子类的final static变量在超类的静态初始化之前初始化(假设final static作为其声明的一部分初始化)?
答案是可能是这样的。关键部分是一个不变的单词含义。
考虑这段代码
class Foo {
public static final int FOO_VALUE = 1000;
static {
System.err.println("FOO Bar.BAR_VALUE=" + Bar.BAR_VALUE);
}
}
class Bar extends Foo {
public static final int BAR_VALUE = 2000;
static {
System.err.println("BAR Foo.FOO_VALUE=" + Foo.FOO_VALUE);
}
}
该程序的输出将为
FOO Bar.BAR_VALUE=2000
BAR Foo.FOO_VALUE=1000
在这种情况下,静态最终变量在静态初始化之前初始化。FOO_值和BAR_值都是常数,因此javac可以内联该字段。
但是你可以通过假装最终变量不是常量来欺骗编译器
class Foo {
public static final int FOO_VALUE = Integer.valueOf(1000).intValue();
static {
System.err.println("FOO " + Bar.BAR_VALUE);
}
}
class Bar extends Foo {
public static final int BAR_VALUE = Integer.valueOf(2000).intValue();
static {
System.err.println("BAR " + Foo.FOO_VALUE);
}
}
输出将是
FOO Bar.BAR_VALUE=0
BAR Foo.FOO_VALUE=1000
因此,静态初始化器在静态final条之前完成。BAR_值已初始化。
我有一份抽象的课堂报告: 我需要强制所有子类填充此 surrogateId 属性。(如果子类未填充属性,则会出现编译错误) 我尝试使用 final 关键字来强制我在构造函数中引入此属性的值,但我必须手动生成构造函数而不是使用 Lombok,很多样板代码。有没有办法在不手动生成结构的情况下实现相同的期望。
问题内容: SuperClass object = new SubClass(); 为什么使用超类实例化上面的子类对象?因为我学会实例化对象的唯一方法是: 我正在学习Java。 问题答案: 您可能有一个仅接受实例的方法。由于 是 ,您可以使用的实例并将其视为。 使用接口时,会使用相同的行为: 这就是多态的美。它允许您更改类内部的实现,而无需破坏其余代码。
问题内容: 我正在尝试创建UIBezierPath的子类,以添加一些对我有用的属性。 编辑:我需要这个,因为在我的代码中我写 并导致编译错误: “必须调用超类’UIBezierPath’的指定初始化程序” 我试图在子类中添加该初始化器,但似乎不起作用。 你能帮我吗? 问题答案: 注意 :此问题已在iOS 9中得以解决,在该版本中,API已被重写为存在,其他所有(方便初始化程序)也是如此。 问题 简
我试图理解@bolov对删除默认构造函数问题的第一个公认答案。对象仍然可以创建......有时[1] 似乎我发现了一个错误,所以它搞乱了整个解释。 @bolov解释了为什么这段代码能够在c 11中成功编译: 场景A 以及为什么这段代码无法在c 11中编译: 场景C 他说,重点是第一个foo是聚合,第二个foo不是聚合。 然后他给出了cppreference的摘录: T类型对象的列表初始化的影响是:
问题内容: 在Python中,请考虑以下代码: 如何在子类中初始化?我正在关注Python教程,但没有涵盖。当我在Google上搜索时,发现了不止一种方法。处理此问题的标准方法是什么? 问题答案: Python(直到第3版)支持“旧式”和新式类。新样式类派生自您使用的类,并通过调用它们的基类,例如 因为python了解旧样式和新样式的类,所以有不同的方法可以调用基本方法,这就是为什么您找到了多种方
类初始化规则规定:如果由于访问静态字段而触发类初始化,则只初始化声明了静态字段的类,即使静态字段被子类、子接口的类型或接口的实现类引用,也不会触发超类或子类的初始化。然后在下面的代码中,只应打印“初始化超类”。 } 当我运行这个时,输出: