第一个hello word程序解析
Object作为scala中的一个关键字,相当于java中的public static class 也就是说object中的成员都是静态的,所以我们在这个例子中的main方法是静态的,不需要类的实例就可以直接被虚拟机调用,而这正是作为JVM程序入口的必备的条件。
疑问:object是不是一个对象(此时你肯定是从java的角度考虑的),事实上,object是scala中的静态类,不是对象。
- 从spark的master和worker的源码中我们发现了其入口的main方法是在object中的。
- def是什么,def是scala的关键字,所有用def定义的内容更都是函数或者方法
- 这里的main是方法,因为被def定义且不具有函数特性
- *Main是scala语言中规定的scla的应用程序的入口,一个运行的scala应用程序只能有一个入口
- args: Array[String]其中args是参数名称,array[String]是参数名称,Array[String]表明应用程序运行时候的传入参数集合。
- :Unit 表明main入口方面的类型是unit,也就是说执行main方法后返回的是unit类型,Unit类型相当于java中的void
- =是什么?是表明main方法执行的结果是由谁来赋值的。或者来说main方法的方法体是在等于号的右面。
- 方法体一般用{}来封装,里面可以有很多条语句。
- {}语句块默认情况下最后一条语句的结果类型就是{}的放回类型。
- 跟踪println的源码,发现scala的println的IO操作调用的java的IO操作。
- 键
- 如果方法或者函数的类型或者返回类型是Unit的话,就可以直接把“:Unit=”去掉,其他非Unit类型的值不可去掉。
- 按照当今os的原理,main入口方法都是运行在主线程的,现在OS的运行分为kernel space 和User Space,应用程序是运行在user Space中,应用程序scala所在的进程一般都是透过OS FORk出来,被fork出来的应用程序进程默认会有主线程,而 我们的main方法就是默认在主线程的。
代码块
@requires_authorization
object HelloScala {
def main(args: Array[String]): Unit = {
println("hello scala")
println(args.length)
}
}