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 object。Standlone 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。
- Scala(1)
- scala-1
- 初学Scala(1): Scala实现Hash Join
- scala编程--1为什么选择scala
- Scala学习笔记1
- Scala模式(1)
- Scala编程指南(1)
- Scala安装(win8.1)
- scala书写规范1
- scala(1)
- scala(1)函数
- 实战Scala & Spark (1)
- scala 语法 基础1
- BigDream-Scala(1)
- scala学习(1)
- Scala学习笔记(1)
- scala入门1
- scala 学习笔记1
- HDU2544最短路(最短路径)
- 移动端上拉下拉刷新组件
- mysql递归查询,mysql中从子类ID查询所有父类(做无限分类经常用到)
- 2016年只做投入少收益高的投资
- Spring MVC 解读——@Autowired、@Controller、@Service从原理层面来分析
- Scala(1)
- ccv下测试fddb数据库
- struts2中struts.xml配置文件详解
- RSA 加密
- 解决wince与主机webservice的连接和访问问题?webservice的IIS发布问题?
- 简单正则(复习)
- 通过RelativeLayout.LayoutParams.addRule()方法在代码中设置RelativeLayout相关属性
- 设置UIImagePickerController的statusBar颜色
- linux 中socket的TCP/IP通信