【发布时间】:2021-10-06 07:26:06
【问题描述】:
我观察到,编译一个包含default方法定义的接口后,像:
interface Delta {
default void someMethod() {
System.out.println("Hi.");
}
}
在拆解各自的.class文件后(这里只包括对应的sn-p):
javap -v Delta.class
####
{
public void someMethod();
descriptor: ()V
flags: (0x0001) ACC_PUBLIC
Code:
stack=2, locals=1, args_size=1
0: getstatic #1 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #2 // String Hi.
5: invokevirtual #3 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
LineNumberTable:
line 10: 0
line 11: 8
}
default 修饰符不见了。
谁能解释一下 - 为什么?
我正在跑步:
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
注意,我知道,当没有定义修饰符时,所有方法都是隐式的public。所以,我是not asking 为什么 public 修饰符出现在文件的编译版本中。
【问题讨论】:
-
显然是什么 java 版本。可能是
javap中的一个错误 - 因为我在 jdk-16 上并且我确实看到了。 -
@Eugene 好点。这是
openjdk version "11.0.2" 2019-01-15。 -
问题是为什么
javap没有显示default修饰符。修饰符本身是源代码,而不是字节码,因此它不会出现在编译的字节码中(并且该方法未标记为abstract的事实足以知道它具有默认实现)。跨度> -
@kaya3 那么为什么所有其他修饰符都存在于反汇编的修饰符中?如果你能试着帮助我理解我的观点,我将不胜感激,而不是急于证明我的问题有多么错误。
标签: java default-method javap