语法概述
Scala 是一门集成了面向对象编程和函数式编程的语言,建立在Java之上,简单来说,就是对Java核心类的高度封装,scala文件编译后也是class格式,运行在JVM中。Scala是ECMA6的前生,所以在语法上两者高度的相似,都是面向对象和函数式编程的高度结合体,而java8中出现的lambda虽然也是函数式编程的一个完美解决方案,但它的面向函数和面向对象还是完全分离的,它并不能像Scala一样将方法转换为函数,不能将对象转换为函数,而Scala实现了方法、对象、函数之间的无缝切换及融合。接下来我们梳理一下ECMA6、Java、Scala这三种语法之间在各个核心领域有什么样的区别和联系
数据类型
- scala
scala中的数据类型是对Java语法数据类型的封装,包括了 byte short int long float double char boolean string Unit Null Nothing Any AnyRef - java
byte short int long float double char boolean - es6
string number boolean array object Null Undefined
作用域
-
scala
- private:只能在当前类中的函数中调用
- protected:能在当前类中的函数和当前类的子类中调用
- default/public:任何地方都可以访问到
-
java
- Private:只能在当前类中的方法中调用
- default:能在当前类中的方法和同一个包下的类中调用
- Protected:能在当前类中的方法和同一个包下的类及其的子类中调用
- Public:任何地方都可以访问到
-
es6
- var:能在当前函数及同级嵌套函数中使用
- let:能在当前函数不包括同级嵌套函数中使用
静态域
Scala将静态域和实例域彻底分离,静态变量和函数全部存放到object中,而在java中每一个对象都有自己的静态域,当然这个区别只在语义上存在,JVM中不受影响
类的类型
-
scala
- trait:类似于abstract,但子类有方法体的函数不可被重写,只能重写无方法体的函数
- object:所有的属性和函数都在静态域中
- class:和Java语法中的class一样,可通过extends、with关键字继承trait或class
-
java
- class:所有的方法都要有方法体
- interface:java8之前除Object中的方法外,所有的方法都不可有方法体,java8之后加了lambda的编译机制,允许写一个有方法体的主方法
- abstract:方法体可有可没有
-
es6
- class:class的声明方式在es6之后加入,等同于function
- function:是最原始的对象声明方式,在es6中函数即对象,对象即函数
变量声明
- scala
只有var、val两种声明标识,前者为变量,后者为常量 - java
有基本数据类型和对象名两种声明方式,当用基本数据类型声明时(如Integer),需要注意自动装箱陷阱 - es6
有var、const、let三种声明方式,var、let用来控制变量作用域,const为常量,不可更改