scala安装和初尝试
安装好scala后,配置环境变量,然后开启一个新的scala,并且添加Scala框架支持
然后将scala的目录设置为源目录,这样才会自动编译
代码解析
1.Scala语言是一门完全面向对象的语言.
* 2.Java是一门面向对象的语言, 例如: 基本数据类型 、 static语法 等等.
*
* 3. object: 因为Scala中没有static的语法, 所以在底层执行的时候,通过object模拟java的static语法.
*
* 4. def : define的缩写,用于声明函数(方法)
*
* 5. 方法形参:
* Java => String[] args => 参数类型 参数名 => 我爱上了一个女人,她叫翠花
* Scala => args: Array[String] => 参数名 : 参数类型 => 我爱上了翠花, 她是个女人
* [String] => Scala中的泛型
*
* 6. 方法声明:
* Java => void main() => 返回值类型 方法名
* Scala => main(): Unit => 方法名 : 返回值类型
*
* 7. 无返回值类型:
* Java => void(关键字) => 不是面向对象的
* Scala => Unit(类) => 面向对象 => Unit只有一个值 => ()
*
* 8. = : 赋值 ,Scala中函数也是对象,可以被赋值.
*
* 9. {} : 函数体(方法体)
*
* 10. println("Hello Scala") : Scala会默认导入一些对象. 例如 Predef,println其实是某个对象的方法,这个对象就是Predef,但是可以不写它,所以本质其实是调用了Predef的println方法,所以可以println()等同于Predef.println()
底层实现原理
将scala代码编译之后
再通过反编译工具就可以得到它的字节码文件,然后就可以观察它的底层结构
通过class修饰的类编译后只会产生一个字节码文件
当在类中添加main方法后, 编译后发现就是一个普通的成员方法.
通过object修饰的类编译后会出现两个字节码文件,分别是:
-
类名.class
-
类名$.class
-
光创建空类后类名$.class中就有的东西:
-
1. 当前类型的static变量
-
public static com.atguigu.scala.chapter01.Scala02_object$ MODULE$;
-
2. 静态代码块,创建了当前类的对象
-
public static { new Scala02_object$ };
-
3. 私有构造器, 将当前类的对象赋值给 当前类的静态属性
-
private Scala02_object$()
-
{
-
MODULE$ = this;
-
}
-
当在类中添加main方法后:
-
类名.class => public static void main(String[] paramArrayOfString){
-
Scala02_object$.MODULE$.main(paramArrayOfString);
-
}
-
类名$.class => public void main(String[] args){}
-
当在main方法中添加语句后:
-
所添加的语句出现在了 类名$.class 中的普通 main方法中.
*执行流程: 类名.class -> static main -> 类名 . c l a s s . M O D U L E .class.MODULE .class.MODULE -> 类名$.class.main
也就是说,当我们在object修饰的类中每创建一个方法,都会在类名.class中生成这个方法的静态方法,在类名
.
c
l
a
s
s
中
生
成
这
个
方
法
的
普
通
方
法
,
然
后
类
名
.
c
l
a
s
s
的
静
态
方
法
中
在
通
过
类
名
.class中生成这个方法的普通方法,然后类名.class的静态方法中在通过类名
.class中生成这个方法的普通方法,然后类名.class的静态方法中在通过类名.class的对象来调用类名$.class中的普通方法
这样就实现了完全面向对象