语言分类
编译型: C、C++、Pascal、Object-C
优点 :编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。
缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件。
解释型 JavaScript、Python、Erlang、PHP、Perl、Ruby
优点:有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。
缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。
JAVA 混合型,先编译字节码 后解释执行
混合型 C# Java Scala
既然编译型和解释型各有缺点就会有人想到把两种类型整合起来,取其精华去其糟粕。就出现了半编译型语言。比如C#,C#在编译的时候不是直接编译成机器码而是中间码,.NET平台提供了中间语言运行库运行中间码,中间语言运行库类似于Java虚拟机。.net在编译成IL代码后,保存在dll中,首次运行时由JIT在编译成机器码缓存在内存中,下次直接执行
scala 和JAVA类似也属于先编译 后解释执行,并且执行字节码也是在JVM
Scala 官网
Scala优点
1 scala 运行在JVM上,意味着他可以和JAVA无缝对接,直接调用JVM的字节码方法类等
2 让类型为你服务 ,不再有复杂的类型,可以var a=3 var a='3' var a ="3" 能够自行推断类型
3 高并发 分布式
4 JAVA中类只能集成一个类 scala 通过traits能多继承
5 switch 在case时 可以穿入一个数字 case是可以判断数字类型为int
6 函数是第一类对象 可以作为参数传给任何其他的东西
scala idea环境搭建
安装插件
安装sdk
添加后 Libraries 中会出现添加的版本sdk
JDK
新建scala工程
新建一个scala类 ,如果没有Scala Class 去检查一下Libraries中是否有scala SDK
package com.csg
//object 更像一个static 类 里面的属性会先执行
object scala01 {
println("1")
private val aa =new scala01()
def main(args: Array[String]): Unit = {
println("5")
aa.test()
}
println("4")
}
class scala01{
var a=6
println("2")
def test ():Unit ={
println(s"a = $a ...")
}
println("3")
}
点击运行按钮,如果没有运行按钮,等右下面的下载进度条更新完才会出现
类型
构造方法
package com.csg
//object 更像一个static 类 里面的属性会先执行
object scala02 {
var a:Int = 7
println("1")
private var scala01 =new scala02("lisi")
def main(args: Array[String]): Unit = {
println("5")
scala01.test()
}
println("4")
}
class scala02(){
//相当于final 不可变
val name1 ="张三"
var a=6
println("2")
def test ():Unit ={
//s 表示字符串衔接 里面可以使用$符号进行变量拼接 类似于shell
println(s"a = $a ...")
//当coject 和class重名,使用名称.属性的时候会使用object的属性 并且object不需要new
println(s"a = ${scala02.a} ...")
}
println("3")
//构造函数使用this 并且必须有参构造必须调用无参构造函数
def this(name:String){
this()
println("8")
}
}
有参数构造方法另一种初始化赋值方式
package com.csg
//object 更像一个static 类 里面的属性会先执行
object scala03 {
var a:Int = 7
println("1")
private var scala01 =new scala03("lisi")
def main(args: Array[String]): Unit = {
println("5")
scala01.test(1)
}
println("4")
}
//类名后面接参数 相当于构造方法 并且name2 默认为val
// 默认的参数传递都是val的,方法中的参数只能是val 不能修改 不能赋值
class scala03( val name2 :String){
//相当于final 不可变
val name1 ="张三"
var a=6
println("2")
def test ( value :Int):Unit ={
// 错误 不能赋值 因为方法参数为val
// value =5
//s 表示字符串衔接 里面可以使用$符号进行变量拼接 类似于shell
println(s"a = $a ...")
//当coject 和class重名,使用名称.属性的时候会使用object的属性 并且object不需要new
println(s"a = ${scala03.a} ...")
println(s"name2 = $name2 ...")
}
println("3")
}
个性化构造
package com.csg
object scala04{
var a:Int = 7
println("1")
private var scala01 =new scala04(1)
def main(args: Array[String]): Unit = {
println("5")
scala01.test(1)
}
println("4")
}
//类名后面接参数 相当于构造方法 并且name2 默认为val
// 默认的参数传递都是val的,方法中的参数只能是val 不能修改 不能赋值
class scala04(val name2 :String){
//相当于final 不可变
val name1 ="张三"
var a=6
println("2")
def test ( value :Int):Unit ={
// 错误 不能赋值 因为方法参数为val
// value =5
//s 表示字符串衔接 里面可以使用$符号进行变量拼接 类似于shell
println(s"a = $a ...")
//当coject 和class重名,使用名称.属性的时候会使用object的属性 并且object不需要new
println(s"a = ${scala04.a} ...")
println(s"name2 = $name2 ...")
}
println("3")
//个性化构造器 必须传入参数给nam2 ,不然name2将没有赋值的机会...
//构造器参数类型不能跟类的参数相同
def this(age :Int){
this("wangwu")
}
}