Q1 var,val和def三个关键字之间的区别?
var是变量声明关键字,类似于Java中的变量,变量值可以更改,但是变量类型不能更改。
val常量声明关键字。
def 关键字用于创建方法(注意方法和函数的区别)
还有一个lazy val(惰性val)声明,意思是当需要计算时才使用,避免重复计算
代码示例:
var x = 3 // x是Int类型
x = 4 //
x = "error" // 类型变化,编译器报错'error: type mismatch'
val y = 3
y = 4 //常量值不可更改,报错 'error: reassignment to val'
def fun(name: String) = "Hey! My name is: " + name
fun("Scala") // "Hey! My name is: Scala"
//注意scala中函数式编程一切都是表达式
lazy val x = {
println("computing x")
3
}
val y = {
println("computing y")
10
}
x+x //
y+y // x 没有计算, 打印结果"computing y"
Q2 trait(特质)和abstract class(抽象类)的区别?
(1)一个类只能集成一个抽象类,但是可以通过with关键字继承多个特质;
(2)抽象类有带参数的构造函数,特质不行(如 trait t(i:Int){} ,这种声明是错误的)
Q3 object和class的区别?
object是类的单例对象,开发人员无需用new关键字实例化。如果对象的名称和类名相同,这个对象就是伴生对象(深入了解请参考问题Q7)
代码示例
//声明一个类
class MyClass(number: Int, text: String) {
def classMethod() = println(text)
}
//声明一个对象
object MyObject{
def objectMethod()=println("object")
}
new MyClass(3,"text").classMethod() //打印结果test,需要实例化类
Myclass.classMethod() //无法直接调用类的方法
MyObject.objectMethod() //打印结果object,对象可以直接调用方法
Q4 case class (样本类)是什么?
样本类是一种不可变且可分解类的语法糖,这个语法糖的意思大概是在构建时,自动实现一些功能。样本类具有以下特性:
(1)自动添加与类名一致的构造函数(这个就是前面提到的伴生对象,通过apply方法实现),即构造对象时,不需要new;
(2)样本类中的参数默认添加val关键字,即参数不能修改;
(3)默认实现了toString,equals,hashcode,copy等方法;
(4)样本类可以通过==比较两个对象,并且不在构造方法中定