具有默认方法的接口将被初始化,即使重写了此方法,并且根本没有调用该方法。
示例:
public interface I {
int a = foo();
default void test1(){
}
static int foo(){
System.out.println("I initialized");
return 15;
}
}
public class C implements I{
public void test2(){
System.out.print("C initialized");
}
}
public class Test {
public static void main(String[] args) {
C c = new C();
c.test2();
}
}
印刷品:
I initialized
C initialized
这里到底有什么问题?
您已经定义了字段a
;编译器不知道您从未在实现中访问它。它必须运行方法来确定值。
int a = foo(); // <-- must run foo.
static int foo(){
System.out.println("I initialized"); // <-- prints I initialized
return 15;
}
和
a = 15
而test1
与test2
无关,但即使它与foo()
无关,仍需要对其求值以设置a
。
问题内容: 当搜寻通过Java语言规范来回答这个问题),我学到的是 在初始化类之前,必须先初始化其直接超类, 但不初始化由该类实现的接口。 同样,在初始化接口之前,不会初始化接口的超级接口。 出于我自己的好奇心,我尝试了一下,并且未如预期的那样对接口进行了初始化。 该程序打印 但是,如果接口声明了一个方法,则确实会发生初始化。考虑给定的接口 然后上面的相同程序将打印 换句话说,接口的字段已初始化(
在搜索Java语言规范来回答这个问题时,我了解到 在初始化一个类之前,必须初始化它的直接超类,但是该类实现的接口没有初始化。类似地,在初始化接口之前,不会初始化接口的超级接口。 出于我自己的好奇心,我尝试了它,正如预期的那样,接口没有初始化。 这个程序打印 但是,如果接口声明了一个方法,则会发生初始化。考虑<代码>接口类型>代码>接口 然后上面相同的程序会打印 换句话说,初始化接口的字段(详细初始
考虑以下代码 VS2013编译器发出以下警告: 警告C4351:新行为:数组“B::member”的元素将默认初始化1 这里有记载 使用C 11,并应用“默认初始化”的概念,意味着B. part的元素将不会被初始化。 但我认为,成员{}应该执行值初始化,而不是默认初始化。VS2013编译器是否损坏? 8.5美元/6 默认初始化类型为T的对象意味着:-如果T是(可能是cv限定的)类类型(第9条),则
我遇到了这个问题: 下面的输出是什么? 我的想法是: 我的第一直觉告诉我-i=new I(){}?因此,我们不能实例化接口-问题1。 那么我认为公共默认字符串是toString()?重写对象类方法?听起来不太好-问题2 可能的答案: a)10I b) 15I c)由于第11行编译失败 d)由于第15行编译失败 e)由于多个错误导致编译失败 解释完我的想法后,我选择了错误的答案。正确答案是D,我也答
问题内容: 如果未将显式值传递给方法,我想用一些默认值初始化方法的参数-像这样: 我得到了错误: 我该如何解决? 问题答案: 这里常见的习惯用法是将默认值设置为一些哨兵值用于此目的,这是典型值,然后您可以检查该值。 您可能还会看到用于哨兵的实例。 后一个版本的优点是可以传递给函数,但有一些缺点(请参见下面@larsmans的评论)。如果您不认为需要将有意义的参数传递给您的方法,那么我建议您使用它。
问题内容: 众所周知,根据JLS7 p.4.12.5, 每个实例变量均使用默认值初始化。例如(1): 但是我一直认为,这样的类实现(2): 绝对等于示例(1)。我期望,复杂的Java编译器会看到(2)中的所有这些初始化值都是多余的,并忽略了它们。 但是突然对于这两个类,我们有两个不同的字节码。 例如(1): 例如(2): 问题是: 为什么?但这是显而易见的要优化的事情。什么原因? UPD: 我使用