在这里对Scala实现与Java实现的几个不一样之处作个介绍。html
第一是Scala对HelloWorld的修饰符使用的是object。其实Scala中也有class关键字,那么object关键字和class关键字有什么区别那?简单来讲object关键字定义了一个匿名类,而且建立了该匿名类的单个实例(采用单例模式),该实例名为HelloWorld。因此object中定义的方法自动都是static的。我以为object关键字存在的价值之一就是创建起了面向对象和函数式的桥梁。由于在面向对象的系统中,全部方法都必须存在于类中,而函数式编程中没有类的概念,使用函数无需new类的实例,因此object中的方法都是静态方法,能够直接被调用。进一步解读请到这里。git
第二是Scala中对变量的类型的定义方式是变量名在前,类型在后,中间用冒号相隔。缘由之一是代码更可读。由于咱们更关心变量名,而类型其次,尤为是你拥有一个超级长的类型的状况下(好比 HashMap<Shape, Pair<String, String>>);缘由之二听说是这样的方式在实现Scala类型时技术上要简单些。进一步解读请到这里。程序员
第三是main函数的返回值是Unit,而不是Java中的Void。为何是这样那?我想是由于Scala为了实现本身的类型系统,对于无显式返回值的函数直接使用Void是不合适的。github
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } } object HelloWorld { def main(args: Array[String]): Unit = { println("Hello, World!") } } object HelloWordV2 extends App { println("Hello, World!") }
代码从三行减小到了两行,Scala终于胜出了。那么App是个什么鬼?App是一个trait。trait又是什么鬼?trait是Scala中的一个特殊类型,它与Java中的interface很类似,但比interface强大。HelloWordV2添加了对App的扩展后,就自动成为了一个能够运行的程序,因为App中定义了main方法,因此HelloWorldV2中就无需再定义了,牛逼的地方在于HelloWorldV2的body中的代码都会做为main方法中的代码被执行编程
不知有没注意到其实main方法是有个叫args的参数的,那么新版HelloWorld中如何使用该参数那?直接使用它就行。函数式编程
fava:函数
在使用静态方法的时候须要注意一下几个方面:this
在静态方法里只能直接调用同类中其余的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是由于,对于非静态的方法和变量,须要先建立类的实例对象后才可以使用,而静态方法在使用前不用建立任何对象。(备注:静态变量是属于整个类的变量而不是属于某个对象的)spa
静态方法不能以任何方式引用this和super关键字,由于静态方法在使用前不用建立任何实例对象,当静态方法调用时,this所引用的对象根本没有产生。scala