讲述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()
}
}