feat:线下课:面向对象_类、对象、访问权限、伴生对象、特质与混入

This commit is contained in:
2026-09-15 11:21:31 +08:00
parent 9fe77af485
commit 9854bd3396
6 changed files with 235 additions and 0 deletions
+45
View File
@@ -0,0 +1,45 @@
package chapter3
object Demo1Class {
def main(args: Array[String]): Unit = {
val xiaoming:Demo_class_person = new Demo_class_person()
xiaoming.greet("小明",18)
// 每次打招呼都传入名字,很奇怪,名字应该是特定对象的特有属性
// xiaoming.greet("小红",18)
xiaoming.run("小明")
println("=================")
val xiaohong = new Demo_class_Person1("小红")
xiaohong.greet(20)
xiaohong.run()
// println(NAME)
// saySomething()
}
}
class Demo_class_person {
def greet(name:String,age:Int):Unit = {
println(s"我的名字叫${name},我今年${age}岁了")
}
def run(name:String):Unit = {
println(s"${name}正在跑步")
}
}
// 构造方法
class Demo_class_Person1(val name:String) {
def greet(age:Int):Unit = {
println(s"我的名字叫${name},我今年${age}岁了")
}
def run():Unit = {
println(s"${name}正在跑步")
}
}
@@ -0,0 +1,46 @@
package chapter3
object Demo2Accessible {
def main(args: Array[String]): Unit = {
val person = new Demo2_accessible_person()
// 如果属性被private修饰,说明这个属性是私有的,被隐藏起来,在类的外部是无法访问的
// println(s"person.idCard = ${person.idCard}")
person.printInfo()
// 如果属性被protected修饰,说明这个属性是被保护的,被隐藏起来,在类的外部是无法访问的
// println(s"person.name = ${person.name}")
println(s"person.sex = ${person.sex}")
println(s"person.age = ${person.age}")
// println(NAME)
// saySomething()
}
}
object Demo2_accessible_person{
def test():Unit = {
val person = new Demo2_accessible_person()
// 虽然是private,但是伴生对象还是可以访问到,可以理解为伴生对象中的访问就是在类的内部
println(s"idCard = ${person.idCard}")
}
}
class Demo2_accessible_person {
private var idCard: String = "123456x"
protected var name: String = "zhangsan"
var sex: String = "male" // 默认就是public
// 权限修饰符后面,可以增加权限开放的范围(java不存在这种方式)
private[chapter3] var age: Int = 18
def printInfo(): Unit = {
println(s"idCard = ${idCard}")
}
}
class Demo2_accessible_person_sub extends Demo2_accessible_person {
override def printInfo(): Unit = {
// 如果属性被private修饰,说明这个属性是私有的,被隐藏起来,在类的子类中也是无法访问的
//println(s"idCard = ${idCard}")
// 如果属性被protected修饰,说明这个属性是被保护的,被隐藏起来,在类的子类中可以访问
println(s"name = ${name}")
println(s"sex = ${sex}")
}
}
@@ -0,0 +1,7 @@
package chapter3
object Demo3Package_1 {
def main(args: Array[String]): Unit = {
println("package test")
}
}
+39
View File
@@ -0,0 +1,39 @@
package chapter3
import scala.beans.BeanProperty
object Demo4Class {
def main(args: Array[String]): Unit = {
val zhangsan:Demo4_class_person = new Demo4_class_person("zhagnsan",18)
zhangsan.printInfo()
val lisi:Demo4_class_person_case = Demo4_class_person_case("lisi",18)
lisi.printInfo()
}
}
class Demo4_class_person(val name:String, var age:Int) {
def printInfo(): Unit = {
println(s"name=$name,age=$age")
}
}
case class Demo4_class_person_case(val name:String, var age:Int) {
def printInfo(): Unit = {
println(s"name=$name,age=$age")
}
}
class Demo4_class_person_property(val name:String) {
@BeanProperty var age:Int = _
def printInfo(): Unit = {
println(s"name=$name,age=$age")
}
}
+33
View File
@@ -0,0 +1,33 @@
package chapter3
object Demo5Trait {
def main(args: Array[String]): Unit = {
val doc:Document = new Document("test.txt")
println(doc.read())
println(doc.read2())
doc.write("test111")
}
}
trait Readable {
def read(): String
def read2():String ={
"默认读到内容为空"
}
}
trait Writable {
def write(data: String): Unit
}
// 读和写
class Document(name: String) extends Readable with Writable {
def read(): String = {
"读出来的内容是 123"
}
def write(data: String): Unit = {
println(s"写入了${data}数据到文件${name}")
}
}
@@ -0,0 +1,65 @@
package chapter3
object Demo6TraitMixin {
def main(args: Array[String]): Unit = {
val myCar = new HybridCar()
myCar.describe()
}
}
// 特质可以包含构造代码(但只能是无参的,3.0后支持带参数),当类混入特质时,这些代码会执行:
trait Vehicle {
println("初始化小车")
def describe(): Unit = {
println("一辆小汽车") // 基础功能
}
}
trait PetrolCar extends Vehicle {
println("增加燃油功能")
override def describe(): Unit = {
println("可以使用燃油驱动") // 燃油车功能
}
}
trait ElectricCar extends Vehicle {
println("增加电力驱动功能")
override def describe(): Unit = {
println("可以使用电力驱动") // 电动车功能
}
}
class HybridCar extends PetrolCar with ElectricCar {
println("混合动力车诞生了")
override def describe(): Unit = {
// super是谁?一定是PetrolCar。 最右优先原则(线性原则)
println(s"====super:")
super.describe()
// 如果向指定PetrolCar呢?
super[PetrolCar].describe()
//或者
//class HybridCar extends ElectricCar with PetrolCar {
println(s"====super end")
println("我是一辆混合动力车,是在燃油车基础上增加了电力驱动的结果") // 混合动力车
}
}
/*
小汽车
/ \
/ \
燃油 电
\ /
\ /
混动
叠加关系:
混动 --> 电动 --> 燃油 --> 车
打印顺序:(初始化顺序)
车 --> 燃油 --> 电动 --> 混动
*/