Scala(1)

来源:互联网 发布:腾讯人工智能开放平台 编辑:程序博客网 时间:2024/06/06 09:29

Classes and Objects

  • 这一章主要讲Scala面向对象的内容:Calss。

  • 1 . Scala中,默认限定符就是public,因此只要需要使用private或者protected才需要显示声明限定符(比Java好多了。。。)

  • 2 . Class中带method的参数是val的,所以不可以在method内部对函数重新赋值。另外,尽管Scala有类型推导系统,函数的参数必须显示声明类型。

  • 3 . 如果要使用参数来实例化一个Class,Scala会帮你自动构建好constructor。比如说:声明一个类,传入两个参数

class Myclass(Index:Int, Name:String)

Scala会自动产生一个具有两个私有整形成员变量的类,对应的名字也是Index和Name。同时,Scala还会产生一个构造函数,接受原来的Index和Name作为参数。

  • 4 . 与Java不同的是,Scala的Class内部并不能定义类似于static的成员。也就是说,声明一个Class后,你必须实例化一个对象,才能使用其中的方法。不过,Scala引入了关键字Object,同样表达了与Java static同样的意思。把static从类移除,进而引入Object这一概念,使得Scala变成pure object-oriented。

  • 5 . 关于Object,声明在Object中field和method不需要实例化就可以直接访问。另外,Object的名字也是一个有趣的地方。如果有一个Class,它的名字和一个Object相同,那么这个类就叫做这个Object的companion class。同样的,这个Object就叫做这个类的companion object。如果,一个Class和一个Object互为companion,那么它们就可以访问对方的私有成员(怎么有点类似于C++的友元。。。)。

  • 6 . 如果一个Object没有对应的companion class,那么这个Object就叫做Standlone objectStandlone object一般可以作为应用程序的入口,即可以在其中声明main方法,接受来自控制台的参数运行;又或者还有一种方法:即继承Application(在2.11.8版本改为了继承App),这样就不需要再声明main方法了。

  • 7 . 为什么可以直接继承Application(App)就可以不需要声明main方法了呢?因为,Application是一个trait,在其中它自己定义了一个main方法,如果自己的Singleton object继承了Applicaiton,那么自然就有main方法了。

  • 8 . 关于声明main方法和直接继承Application:如果直接继承Application,就不能接受来自控制台的参数了,另外因为JVM的原因,继承了Application也很难实现多线程。所以,一般如果应用程序较简单(不需要控制台参数)或者使用单线程,那么就可以继承Application,否则还是建议声明main方法,自己实现。

Basic Type and Operator

  • 这一章主要是讲在面向对象环境下的类型和一些基本的操作

  • 1 . 在Scala中,一些基本类型与Java一致,不过这些基本类型都是使用大写字母开头的,有Byte、Short、Int、Long、Float、Double

  • 2 . Scala中,也有各式各样的literal,包括Integer literal、string literal等,值得注意的一个就是一个Symbo literal了,Symbol literal是对应于预定义的Scala.Symbol class(2.7.2)。事实上,定义一个Symbol literal后,就会调用一个工厂方法Symbol(“xxx”),然后产生一个新的String。例如,在控制台定义如下symbol literal

var s='Symbolstring

可以通过name这个方法得到我们需要的字符串,即Symbolstring

s.name

返回

Symbolstring

除此之外,symbol基本上没有什么其他功能了。之所以会提供symbol,这是因为这样可以像动态语言一样使用一个新的identifier

  • 3 . 因为Scala是pure object-oriented,所以在Scala中,operator实际上是通过method call实现的。比如,1+2实际上是1.+(2)

  • 4 . 在Scala中,有三种类型的operator,分别是infix operator、prefix operator以及postfix operator。infix operator可以接受两个参数,而prefix operator只能接受一个参数。实际上,prefix operator正是调用了传入参数的方法,比如说

-2

实际上是调用了对象2的方法

2.unary_-
  • 5 . 事实上,unary_这样的写法是很特殊的,只有调用+、-、!、~这四个一元prefix operator,Scala才会转换这样的函数调用。比如:
+4

Scala会帮你转换成

4.unary_+

但是,如果你定义自己的函数,如unary_*,是任意的符号,那如果不是+、-、!、~这四个的话。那么,当你使用

*p

Scala是不会帮你转换成p.unary_*,而是调用*的p方法

*.p

这样调用。

  • 6 . postfix operator不接受参数。它只是一个方法。在Scala,如果函数没有side effect,同时又不接受参数,那么就可以省略掉圆点运算符以及括号。这样就可以写成 postfix operator的形式了

  • 7 . 在Java中, ==对于不同类型的值,是有不同的含义的。如,对于primitive type,==相当于比较值,而对于referenced type,==则相当于比较referenced equality,需要比较值的话还需要调用对象的equals方法。但是在Scala中,==都是用于比较值的大小的。而要比较referenced equality,则需要方法eq或者方法ne

0 0
原创粉丝点击