scala笔记(三)

原创 2016年05月30日 21:22:06

1.Scala和Java的互操作性
互操作涉及两个方面,一是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。这些修饰限制为成员的代码的某些区域访问。
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.开始的包名,表示使用绝对包名。

版权声明:本文为博主原创文章,未经博主允许不得转载。

《MFC游戏开发》笔记三 游戏贴图与透明特效的实现

本系列文章由七十一雾央编写,转载请注明出处。 http://blog.csdn.net/u011371356/article/details/9313239 作者:七十一雾央 新浪微博:h...
  • lsybryant
  • lsybryant
  • 2014年09月08日 13:46
  • 1253

Scala的学习笔记_第一天

以一次接触Scala,记下的部分笔记,内容还会持续的更新,学习.
  • Abandon_Sun
  • Abandon_Sun
  • 2017年07月25日 21:41
  • 207

scala学习笔记

Scala笔记 因为有个项目(网游服务器)用到了scala,第一次接触感觉这门语言非常犀利,所以把做项目的过程中积累的这个语言相关的知识点整理下做个笔记。内容不分先后顺序,前后基本没有逻辑,就是简...
  • a071800
  • a071800
  • 2015年08月04日 17:31
  • 1057

scala 三个用引号

http://blog.csdn.net/expt/article/details/7823853
  • u012307002
  • u012307002
  • 2017年01月21日 16:13
  • 1535

三栏布局学习笔记

三栏布局总结三栏布局一般指的是左右侧固定宽度,中间自适应宽度的布局。首先想到的是最简单的也最容易实现的绝对定位布局。绝对定位布局基本思路:左右侧使用绝对定位固定,中间元素使用margin和两侧隔开距离...
  • w157z0372x5580
  • w157z0372x5580
  • 2017年11月18日 12:22
  • 69

Scala学习笔记8 - 集合

===集合       scala的集合(collection)库分为可变(mutable)类型与不可变(immutable)类型。以Set为例,特质scala.collection.immutabl...
  • guohecang
  • guohecang
  • 2016年08月04日 11:54
  • 429

scala学习笔记:各种奇怪的写法

Unit函数的定义: def foo()={println("hi")} 等号可以省略: def foo(){println("hi")} update方法: x(y) = z 相当于: ...
  • bluejoe2000
  • bluejoe2000
  • 2015年02月26日 22:01
  • 1112

scala以冒号结尾的操作符是左结合的

结合性决定了当有一系列同一优先级的操作符时,它们的求值顺序。在Scala中,绝大部分的操作符都是左结合(从左到右)的,除了:1. 以冒号:结尾的操作符;2. 赋值操作符。而且,在右结合时,二元操作符的...
  • hxpjava1
  • hxpjava1
  • 2017年01月06日 21:47
  • 713

scala中String的单引号和三引号的区别?

例如下代码,如果要换行,必须在代码中添加换行符\n\rval s1:String = "456 sldjf\n\r slkfjl lskjfls "如果换成三引号,可以在代码中直接回车val s2:...
  • u010916338
  • u010916338
  • 2017年08月25日 18:14
  • 580

Scala中的语言特性是如何实现的(3) -- Trait

我的新博客地址:http://cuipengfei.me/blog/2013/10/13/scala-trait/ 我在Coursera上跟了一门叫做Functional Progr...
  • cuipengfei1
  • cuipengfei1
  • 2013年12月21日 13:09
  • 3764
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:scala笔记(三)
举报原因:
原因补充:

(最多只允许输入30个字)