互操作涉及两个方面,一是Scala访问Java;二是Java访问Scala。我们只是看前者,后者使用的比较少,支持也不完整,也没有多少意义。
Scala的类继承结构图:
Scala的AnyRef等价于Java的Object。
需要注意的是Nothing和Null,它们是类型的下限。这在其他面向对象的语言里面是没有的。
在Scala里面使用Java是非常顺畅的。因为存在Scala到Java的直接映射。Java的class在Scala里面还是class。Java的interface在Scala里面是trait。Java的静态成员在Scala里面是object。Scala的包包含的使用方法,不管包含Scala包还是Java包,都可以像Java那样使用。
2.scala访问修饰符
包,类或对象的成员可以标记访问修饰符private和protected,如果我们不使用这两种关键字,那么访问将被默认设置为public。这些修饰限制为成员的代码的某些区域访问。
classOuter{classInner{privatedef f(){ println("f")}classInnerMost{ f()// OK}}(newInner).f()// Error: f is not accessible}
package p {classSuper{protecteddef f(){ println("f")}}classSubextendsSuper{ f()}classOther{(newSuper).f()// Error: f is not accessible}}
classOuter{classInner{def f(){ println("f")}classInnerMost{ f()// OK}}(newInner).f()// OK because now f() is public}
package society {package professional {classExecutive{private[professional]var workDetails =nullprivate[society]var friends =nullprivate[this]var secrets =nulldef help(another :Executive){ println(another.workDetails) println(another.secrets)//ERROR}}}}
注意,上面的例子中以下几点:
变量workDetails将可对任何一类封闭包professional范围内。
变量friends 将可对任何一类封闭包society中。
变量secrets 将可只在实例方法隐含的对象(this)。