一文看懂scala和java的区别

电子说

1.3w人已加入

描述

  Scala简介

  Scala是一种有趣的语言。它一方面吸收继承了多种语言中的优秀特性,一方面又没有抛弃Java这个强大的平台,它运行在Java虚拟机(JavaVirtualMachine)之上,轻松实现和丰富的Java类库互联互通。它既支持面向对象的编程方式,又支持函数式编程。它写出的程序像动态语言一样简洁,但事实上它确是严格意义上的静态语言。Scala就像一位武林中的集大成者,将过去几十年计算机语言发展历史中的精萃集于一身,化繁为简,为程序员们提供了一种新的选择。

  Java简介

  Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。

  Java具有简单性、面向对象、分布式、健壮性、安全性、平***立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。

  Java的工作原理

scala

  由四方面组成:

  (1)Java编程语言

  (2)Java类文件格式

  (3)Java虚拟机

  (4)Java应用程序接口

  当编辑并运行一个Java程序时,需要同时涉及到这四种方面。使用文字编辑软件(例如记事本、写字板、UltraEdit等)或集成开发环境(Eclipse、MyEclipse等)在Java源文件中定义不同的类[22],通过调用类(这些类实现了JavaAPI)中的方法来访问资源系统,把源文件编译生成一种二进制中间码,存储在class文件中,然后再通过运行与操作系统平台环境相对应的Java虚拟机来运行class文件,执行编译产生的字节码,调用class文件中实现的方法来满足程序的JavaAPI调用。

  scala和java的区别

  1、对字符串的支持

  scala采用三个双引号“”“支持换行字符串,Java需要采用“+”进行字符串的连接。

  2、方法返回值

  scala的return是可选的,方法调用会自动返回最后求值的表达式。如果scala使用了return则需要显示指定方法的返回值

  Java需要显示的采用return进行值的返回。

  3、类和方法修饰符的默认值

  scala默认是public,java默认是protected.

  4、默认导入的类

  scala默认导入java.lang包、scala包、scala.Predef类。

  java默认导入java.lang包

  5、接口

  scala不支持接口interface,采用trait(类似于Java中的抽象类)。

  java支持接口

  6、类成员和单例对象

  scala语言机制上支持单例对象和伴生对象,伴生类。伴生类和伴生对象需要在一个类文件中使用,在使用伴生对象时,系统隐式地调用apply生成一个伴生实例的对象。

  java由类成员,单例对象需要自己实现。

  7、方法参数

  scala支持以函数作为参数,格式为deferror(msg:=》String)表示msg是输入参数,输出参数为String的函数。

  java不支持。

  scala相对于java存在的优势

  相比较与Java,在下觉得Scala最主要的有以下两点优势:

  FP泛型支持

  如果用多了Spring中大量的template接口,你就会觉得FP其实还是蛮好用的。

  而这仅仅是FP好处的冰山一角。

  函数其实就是一个input-》output(scala也是这么表示一个函数的),没有任何副作用,与状态无关,由于这种特性,所以函数式的编程范式在分布式领域有很多好处

  对于函数式编程,我的知识实在是皮毛,但可以这么说,FP相对与OO有哪些优势,Scala对于Java差不多就有哪些优势。

  正因为FP有如此多的优势,所以Java8才引入了FP.从某种程度上来说,Java认可了Scala的做法。

  类型系统支持

  如果说Java是一种类型安全的语言,那么毫无疑问,Scala的类型更加安全,从某种程度上说,Scala的类型是图灵完备的,而Java不是。我的一位好朋友在这方面研究的比较深(http://hongjiang.info/scala/),而我对与Scala的类型系统的理解,也还是皮毛。

  正是以上这两点大优势,造成了Scala比Java更加安全,同时又具备灵活性,想象力。

  其他语言层面上的优势

  在Java中,你是否有时很想继承多个AbstractClass呢?对不起,Java只支持单继承

  在Scala中,你可以进行mixin(Java8也开始引入defaultmethod了呢)

  在Java中,想要一个singleton?要么在staticblock中做,要么利用Enum的单例特性完成,或者其他更纠结的方法。

  在Scala中,只要声明为object,即为单例。

  在Java中,想要延迟加载一个单例?doublecheck吧

  在Scala中,只要在object中将变量修饰为lazy即可

  在Java中,想要对集合进行一些操作?使用一层一层的for循环吧

  在Scala中,使用collection的一些集合操作,即可获得如写SQL般的享受。

  在Java中,在并发中想对Future进行回调?对不起,Future不是Listenable(无法支持回调),除非你使用额外的工具(如guava,spring)

  在Scala中,本来就主张异步编程,future和promise的配合让人非常愉快。

  在Java中,要透明扩展一个第三方库的类怎么办?包装,再加一层。

  在Scala中,有强大的implicit机制让你更优雅的做到这一点,同时还能保证类型安全(比起Ruby的monkeypatch,要安全得多)

  Scala的表达力很强,相同功能的代码,用Java和Scala的行数不可同日而语。

  这些单单是语言层面上的优势,除此之外,Scala还能无缝结合Java

  尽管罗列了如此多的好处,但Scala有如下劣势:

  语法复杂,学习曲线非常高

  国内Scala程序员很难找(目前Scala的影响力也在缓慢扩大,比如Scala社区中的明星Spark的流行也在慢慢拉动Scala的流行,如同rails之于ruby)

  社区,生态还比较小,Scala风格的库还非常少(但可以和Java很容易的斜街很多时候弥补了这一点)

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分