通过javap反编译接口
在 Java 中,接口(interface)中的方法默认都是 public 和 abstract 的,即使在源代码中没有显式地指定这两个修饰符。当你编写:
public interface Person {
void eat();
void sleep();
}
实际上等价于:
public interface Person {
public abstract void eat();
public abstract void sleep();
}
这是因为根据 Java 语言规范,在接口中声明的方法如果没有指定访问修饰符,默认就是 public
,而且接口方法默认是 abstract
(抽象)的。
当你使用 javac
编译器编译源代码时,编译器会将这些隐式的修饰符(public
和 abstract
)应用到方法上,并将其写入生成的字节码文件中。
随后,当你使用 javap
反编译字节码时,javap
会显示出方法的完整签名,包括所有的修饰符。因此,你会看到:
public interface Person {
public abstract void eat();
public abstract void sleep();
}
这就是为什么你在反编译后看到方法前面多了 public abstract
修饰符的原因。
总结:因为接口中的方法默认是 public
和 abstract
,编译器在编译时会将这些修饰符应用到方法上,反编译时就会显示出来。
参考:
Answer: Because in Java, interface methods are implicitly public and abstract—even if not explicitly declared—so the compiler adds these modifiers, and javap displays them when decompiling.