講述Scala中的面向對象相關知識點
一、特征
- 封裝:屬性和方法封裝在類中
- 繼承:父類和子類的一個關系
- 多态:父類引用指向子類對象
二、類的定義和使用
類是對象的抽象,而對象是類的具體執行個體。類是抽象的,不占用記憶體,而對象是具體的,占用存儲空間
/**
* @author Gjing
**/
class Person {
// 定義屬性,Scala會自動幫var類型的屬性生成get、set,val類型的屬性生成get
var name = ""
val age = 10
// 可通過下劃線作為一個占位符,使用占位符時就不允許使用val了
var idCard: String = _
def eat(): Unit = {
println(name + "吃飯。。。")
}
}
object Test {
def main(args: Array[String]): Unit = {
val person = new Person()
person.name = "張三"
person.idCard = "1234"
person.eat()
println(person.idCard)
}
}
三、主構造器與附屬構造器
/**
* @author Gjing
**/
class Men(name: String, age: Int) {
// 定義屬性
var userName: String = name
var userAge: Int = age
var idCard: String = ""
// 附屬構造器
def this(name: String, age: Int, idCard: String) {
this(name, age)
this.idCard = idCard
}
}
四、繼承
/**
* @author Gjing
**/
class Son(name: String, age: Int, val city: String) extends Men(name, age) {
}
object Test2 {
def main(args: Array[String]): Unit = {
val son = new Son("張三", 11, "廈門")
println(son.city)
println(son.userAge)
println(son.userName)
}
}
五、重寫
重寫一個非抽象方法必須使用override修飾符;在子類中重寫超類的抽象方法時,你不需要使用override關鍵字
/**
* @author Gjing
**/
class Son(name: String, age: Int, val city: String) extends Men(name, age) {
override def toString: String = s"Son($name,$age,$city)"
}
六、抽象類
/**
* @author Gjing
**/
abstract class Food {
def name():Unit
}
class Apple extends Food {
def name(): Unit = {
print("Apple")
}
}
七、伴生類和伴生對象
如果有一個class和一個同名的object,那麼就稱這個object是class的伴生對象,class是object的伴生類
/**
* @author Gjing
**/
class ApplyTest {
def apply(): Unit = {
println("Executor class apply...")
}
}
object ApplyTest {
// 最佳實踐,在object的apply方法去new class
def apply(): ApplyTest = {
println("Executor object apply...")
new ApplyTest()
}
}
object Test3 {
def main(args: Array[String]): Unit = {
// 直接通過類名加括号 是調用object中的apply方法
val test = ApplyTest()
// 對象加括号,是調用class中的apply方法
test()
}
}