scala学习笔记(三)

1. Scala和Java的互操作性

互操作涉及两个方面,一是Scala访问Java;二是Java访问Scala。我们只是看前者,后者使用的比较少,支持也不完整,也没有多少意义。

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。这些修饰限制为成员的代码的某些区域访问。

2.1private:私有成员只能看到里面包含的成员定义的类或对象,如:

classOuter{classInner{privatedef f(){ println("f")}classInnerMost{
         f()// OK}}(newInner).f()// Error: f is not accessible}
2.2protected: 受保护的成员是从该成员定义的类的子类才能访问

package p {classSuper{protecteddef f(){ println("f")}}classSubextendsSuper{
      f()}classOther{(newSuper).f()// Error: f is not accessible}}
2.3未标示私有或受保护的每一个成员是公开的。不需要明确使用修饰符public。这样的成员可以从任何地方访问

classOuter{classInner{def f(){ println("f")}classInnerMost{
         f()// OK}}(newInner).f()// OK because now f() is public}

2.4保护范围: Scala中的访问修饰符可以增加使用修饰符。形式:private[X]或protected[X]的修饰符意味着访问私有或受保护“达到”X,其中X代表了一些封闭的包,类或单个对象。考虑下面的例子:

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)。

3.对于类的字段,val类型对应有getter方法没有setter方法,var类型既有getter方法又有setter方法,注意scala中没有只写属性,其中这些方法scala一般会自动生成,也可以自己去定义。假如有age字段,系统一般自动生成age()和age_=()方法,即为getter和setter方法,其中age_=()方法,java会翻译为age_$eq(),因为java中方法不允许=出现。

3.scala关键字
Java关键字
Java一共有50个关键字(keywords),其中有2个是保留字,目前还不曾用到:goto和const。true、false和null看起来很像关键字,但实际上只是字面量而已。本文粗略的把true、false和null也看做Java关键字,认为Java一共有53个关键字。下面是大致归类的Java关键字列表:
assert
boolean, byte, short, char, int, long, float, double, void
package, import, class, interface, enum, implements, extends
public, protected, private, abstract, static, final, volatile, transient, synchronized, strictfp, native
try, catch, finally, throw, throws
if, else, do, while, for, switch, case, default, break, continue, return
super, this
new, instanceof
const, goto
true, false, null

Scala关键字
Scala只有39个关键字:
package, import, class, object, trait, extends, with, type, forSome
private, protected, abstract, sealed, final, implicit, lazy, override
try, catch, finally, throw
if, else, match, case, do, while, for, return, yield
def, val, var
this, super
new
true, false, null

4.主构造器和辅助构造器
辅助构造器的名称为this,必须以一个对先前已经定义的其他辅助构造器或主构造器的调用开始,如果一个类没有显示定义主构造器,则自动拥有一个无参的主构造器;
在scala中,每个类都有主构造器,主构造器并不以this方法定义,而是与类定义组织在一起。主构造器的参数直接放置在类名之后,主构造器的参数被编译成字段,其值初始化为构造时传入的参数。主构造器会执行定义类的所有语句。在主构造器中可以使用默认参数来避免过多地使用辅助构造器。如果想让主构造器变为私有,可以类名后面参数之前放入private关键字:如class C private(args){}

5.在scala中,你几乎可以在任何语法结构中内嵌任何语法结构,你可以在函数中定义函数,在类中定义类。

6.与对象与类的定义不同,同一个包可以定义在多个问个文件文档中,不同的包也可以定义在一个文件文档中。
  包和其他作用域一样地支持嵌套,你可以访问上层作用域中的名称;包名是相对路径,不是java的绝对路径,所以容易产生编译错误,解决办法使用_root_.开始的包名,表示使用绝对包名。

你可能感兴趣的:(scala学习笔记(三))