java和scala的区别和联系

scala语言来源于java,scala以java的虚拟机(JVM)为运行环境,scala源码(.scala)会编译成.class文件。

两种语言之间有很多相似的地方,在一些语法上有些明显区别主要如下:

1 beak和continue

语言 break continue
Scala 函数式分格 If else 或循环守卫
Java 关键字,break 关键字:continue

2 函数返回值形式

语言 返回格式
Scala 返回第一种形式: :返回值类型 =
返回第二种形式: = (返回类型自动推导) 返回第三种形式: (不写任何) 注意:没有写return ,默认最后一行为返回值;如果写了return,函数的返回值类型就不省略;在使用递归编程时,必须返回的数据类型
Java 第一种 :有返回值,必须写返回值类型
第二种:无返回值,添加void

3 异常

语言 异常处理方法
Scala Try-catch{case-case}-finally的方式处理异常
java Try-catch-catch-finally的方式处理异常

4 面向对象

语言 区别
Scala 一切皆为对象
java 由于历史原因,java中的基本类型、null、静态方法等不是对象
Scala java
成员变量/属性 必须显示初始化 可以不初始化
构造器 主构造器为类名,
辅助构造器this,辅助构造器必须在第一行显式调用主构造器,也可以间接。
和类名必须一样
Bean属性 在scala中添加@BeanProperty字段时会自动生成setXX和getXX,便于java互操作 setXX和getXX方法

5 包

Scala java
Import语句 可以出现在任何地方 只能在文件顶部

6 面向对象编程特征之一封装、继承、多态

Scala java
封装方法 自动提供了setter/getter方法
注意:如果属性声明为private,则setter/getter也是private, 不添加时,默认为public
需要手动添加
继承extends 重写方法需要添加override修饰符,调用超类的方法需使用关键字super 直接重写
子类的构造器 在子类中每个辅助构造器必须先调用构造器(也可以时间接)
注意:只有主构造器才能调用父类的构造器
会隐式调用构造器
也显示调用,(需自己添加)
覆写字段 子类可以改写父类的字段, Java中只有方法的重写,没有字段的重写
抽象类 Abstract标记的类,方法不用标记abatract, Java
接口 Scala使用特质trait来代替接口的概念,使用关键字extends继承,
多个特质之间使用with连接 注意:scala中在创建对象时,可以混入特质,
使用关键字implemts继承,
Java在创建对象时不能混入接口。

7 集合

Scala集合 Java集合
集合种类 主要包括序列Seq、集Set 、映射Map,还可以分为可变和不可变两种类型 主要有Set、List和Map三个体系

scala特有的概念

1 过程:

将函数的返回类型为Unit的函数称之为过程。

2 惰性函数:

当函数返回值被声明为lazy时,函数的执行将被推迟,直到初次使用时,该函数才会执行,这种函数称之为惰性函数,和java中的懒加载类似。

注意:lazy不能修饰 var

3 伴生对象

scala中没有静态的操作,为了能和java语言交互(java中有静态的概念),就产生了一种特殊的对象来模拟类对象,称为半生对象,这个给对象的内容可以放置在她的半生对象中申明和调用。

class 类名 为伴生类,将非静态内容写到该类

object 类名 为伴生对象,将静态内容写到该类

注意:伴生对象和伴生类应在同一源码文件中,

4 apply方法:

实现该方法,可以不加new 实现类名(参数)的方式构建对象实例;

5 特质

可理解为接口,

6 叠加特质

在创建对象时,同时混入多个特质,称之为叠加特质。此时特质声明顺序为从左到右,方法执行我为从右到左。

例如

val mytriat = new Mytrait with DB4 wiith File4

注:如果混入该特征的类,已经继承了另一个类A类,则要求A类是特质超类的子类,否则就会出现了多继承现象,发生错误。

例如:

 trait LoggedWxception extends Exception{}//zhengque
 class CC{}
class UnhappyException extends CC with LoggedWxception{}
//发生错误,原因CC不是Exception的子类

7 富接口

即该特质中既有抽象方法,又有非抽象方法。

8 自身类型

主要是为了解决特质循环依赖的问题,同时可以确保特质在不扩展某个类的情况下,依然可以做到限制该特质类的类型。

9 隐式函数

是以implicit关键字声明的带有单个参数的函数,这种函数会自动应用,将值从一种类型转换为另一种类型,隐式函数可以有多个,但应用时,会只是用一个,可以解决优雅的数据类型转换问题。

10 模式匹配

模式匹配类似于java中的switch语法,但是很强大,

其:采用match关键字声明,每个分支采用case关键字,但需要匹配时会从第一个分支开始,如果匹配成功则执行代码,如果所有case匹配不成功,那么会执行case_分支,类似于java中的default。

注意:如果case_没写,那么会抛出matchError。

模式中的变量:

如果在case关键字后跟变量,那么match前表达式的值会赋值给那个变量。

常见的匹配情况:数组的匹配、元组的匹配、列表的匹配、对象的匹配(对象提取器unapply),变量声明中的模式、for表达式中的模式;

11 样例类:

用case关键字声明的类,自动生成toString、qualas、hashCode和copy方法类似一个模板。

case class Dollar(value:Double) extends Amount//样例类

12 偏函数

使用PartialFunction【Any,Int】定义,表示偏函数接收的参数类型是Any,返回类型是Int,执行函数时,先执行isDefinedAt()如果为true,就会执行apply,否则过滤掉这个元素,继续遍历下一个元素。

13 并发编程模型Akka

akka模型是异步、非阻塞、高性能的事件驱动编程模型。

工作机制:

(1) ActorySystem创建Actor

(2) ActorRef:为Actor的代理或引用,消息是借助ActorRef来发送的。

(3) 消息发送到Dispatcher Message(消息分发器),它得到消息后会对消息进行分发到对应Actor的MailBox.

(4) Actor可以通过reveive方法来获取消息,然后处理。

你可能感兴趣的:(java)