【发布时间】:2015-05-03 04:05:16
【问题描述】:
我是 Scala 新手。我读到 Scala 的 protected 关键字与 Java 中的 protected 不同。当我在 Scala 和 java 中看到为公共类的受保护方法生成的字节码时,我发现以下内容:
Scala 代码:
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 中的“受保护”是什么意思?
-
Java 保护方法可以在其他包和子类中访问,而 Scala 保护方法只能在子类中访问。
-
@Mitesh 你应该让你的评论成为答案。