Scala学习(一)——类、对象和变量

Scala学习(一)——类、对象和变量

本站内容版权属于本人。转载须告知本人,写明出处,并在文首提供指向本站对应文章的链接。
本文链接:Scala学习(一)——类、对象和变量
简介

Scala是一种基于JVM的语言,但是兼顾了Java的面向对象特性和函数式编程。因为不像Java那样那么需要兼顾向后兼容性,Scala的活力比Java要高出许多,语言特性也丰富许多。更好的泛型、更方便的回调、更简单的集合操作。

因为函数式编程和以前的面向对象编程以及面向过程编程的思路都很有差异,一步登天是不可能的,所以我决定以Java为基石,从Scala的语法特性学起,以求从语法特性中获得语言特性,再经过练习使用来进一步巩固对Scala的理解。

常量,变量和函数

先看写法:

val定义的是常量,用var定义的是变量。名称在前,类型在后,中间有一个冒号。一般来说Scala中的常量和变量都是在定义时就被初始化了的。Scala编写过程中有一个特点,那就是尽量使用常量。

如果可以猜出类型,那么不需要显式指定类型:

def定义的是函数,之所以放在这里讲,是说函数和常量变量性质很类似,可以看做一个对象:

函数的定义同样是使用了类型在后的写法,参数列表最后的冒号后的类型是返回类型:

基本类型

Scala比Java隔年面向对象,Scala取消了基本类型。常用的整数,浮点数,布尔值也都是类。这里先不需要考虑运行效率和编译成字节码后的实现方式,因为实际上这些类型Scala编译器都会进行优化,将其变成Java的基本类型的。

其他类型

作为一个面向对象语言,类和对象是Java的基本元素。Scala继承了这一特性,下面来对比一下Scala和Java中的类:

概念 Java Scala
class class
接口 interface 可用trait表达
特征 - trait
枚举 enum -
标注 @interface 通过继承Annotation类实现
独立对象 可以通过单例模式实现 object
包对象 - packet object

可以看出,两者大体相同。不过Scala中添加了更多要素,下面大概说明一下这些要素的编写方法。

基本写法:

Scala中没有public修饰符,所有未加修饰符的都是公有。
类可继承其他类:

也可以使用某个特征:

可以使用多个特征:

可以同时使用继承类和特征:

可以设置抽象类,不可被实例化:

可以设置终类,不能再被继承:

总结一下:Scala中的类和Java中的类比较类似,可以单继承其他类,多继承特征(Java中是接口),也可以设置为抽象类或者终类。

特征

特征(Trait)是Scala中的重要概念,和Java中的接口相比,特征的要求相对较低,这给编程带来了较大的自由度,但是与之而来的是一些问题,比如多继承(虽然Java8中default函数的出现使得Java也出现了这种问题)等等。但在本文中,主要讨论写法之间的差异,不会列举出所有可能出现的问题。

基本写法:

继承其他特征:

继承多个特征:

继承类:

继承类和特征:

注意:虽然特征可以从类中继承出来,但是最好不要这样写。因为Scala中一个类只能有一个唯一的父类,包括直接的父类和通过特征获得的间接的父类,从类中继承出特征很容易使得编译不通过。实际使用中特征也只会从特征中继承出来。

对象

和Java一样,使用new可以从类名中实例化出对象来。

Scala还提供了一种直接定义单例对象的方式:

调用时,可以直接使用,也可以通过变量使用,效果是一样的:

总结

Scala包含了和其他面向对象语言相同的基本功能:类、对象和变量,但是理念稍有不同。首先,函数可以看做对象,储存在变量里(函数式);然后,Scala取消了静态,而是使用单例对象(面向对象);最后,使用特征而不是接口使得Scala更加灵活。

Scala学习(一)——类、对象和变量”有2条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据