作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我是 Scala 的新手。我读到 Scala 的 protected
关键字与 Java 中的 protected
不同。当我看到为 Scala 和 java 中的公共(public)类的 protected 方法生成的字节码时,我发现如下:
斯卡拉代码:
package com.test
class Vehicle {
protected def ignite() {
println("Ignition.....")
}
}
当我使用javap
反编译时,显示如下代码:
public class com.test.Vehicle {
public void ignite();
public com.test.Vehicle();
}
还有 flags: ACC_PUBLIC
在 Scala 方法 ignite
的描述符中设置。
等效的 Java 代码:
package com.test;
public class Vehicle {
protected void ignite() {
System.out.println("Ignition.....");
}
}
和反编译代码:
public class com.test.Vehicle {
public com.test.Vehicle();
protected void ignite();
}
还有 flags: ACC_PROTECTED
在 Java 方法 ignite
的描述符中设置。
但它仍然给出了与 JAVA 不同的行为。
JVM是怎么处理这个东西的?
注意:我对 JVM 规范了解不深。
最佳答案
Scala protected
(以及不直接对应于任何 JVM 限定符的其他限定符)根本不由 JVM 处理;它仅由 Scala 编译器强制执行,并且仅适用于 Scala,因此任何其他语言都可以访问此方法(因为就 JVM 而言,它是public
)。
关于java - scala 中的 protected 方法如何在 jvm 上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28815982/
我是一名优秀的程序员,十分优秀!