From 9854bd33964d6c8b7617eb47f26be376b69aef5e Mon Sep 17 00:00:00 2001 From: kennethcheng Date: Tue, 15 Sep 2026 11:21:31 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E7=BA=BF=E4=B8=8B=E8=AF=BE=EF=BC=9A?= =?UTF-8?q?=E9=9D=A2=E5=90=91=E5=AF=B9=E8=B1=A1=5F=E7=B1=BB=E3=80=81?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=E3=80=81=E8=AE=BF=E9=97=AE=E6=9D=83=E9=99=90?= =?UTF-8?q?=E3=80=81=E4=BC=B4=E7=94=9F=E5=AF=B9=E8=B1=A1=E3=80=81=E7=89=B9?= =?UTF-8?q?=E8=B4=A8=E4=B8=8E=E6=B7=B7=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/scala/chapter3/Demo1Class.scala | 45 +++++++++++++ src/main/scala/chapter3/Demo2Accessible.scala | 46 +++++++++++++ src/main/scala/chapter3/Demo3Package_1.scala | 7 ++ src/main/scala/chapter3/Demo4Class.scala | 39 +++++++++++ src/main/scala/chapter3/Demo5Trait.scala | 33 ++++++++++ src/main/scala/chapter3/Demo6TraitMixin.scala | 65 +++++++++++++++++++ 6 files changed, 235 insertions(+) create mode 100644 src/main/scala/chapter3/Demo1Class.scala create mode 100644 src/main/scala/chapter3/Demo2Accessible.scala create mode 100644 src/main/scala/chapter3/Demo3Package_1.scala create mode 100644 src/main/scala/chapter3/Demo4Class.scala create mode 100644 src/main/scala/chapter3/Demo5Trait.scala create mode 100644 src/main/scala/chapter3/Demo6TraitMixin.scala diff --git a/src/main/scala/chapter3/Demo1Class.scala b/src/main/scala/chapter3/Demo1Class.scala new file mode 100644 index 0000000..0c62f22 --- /dev/null +++ b/src/main/scala/chapter3/Demo1Class.scala @@ -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}正在跑步") + + } +} diff --git a/src/main/scala/chapter3/Demo2Accessible.scala b/src/main/scala/chapter3/Demo2Accessible.scala new file mode 100644 index 0000000..3c2894c --- /dev/null +++ b/src/main/scala/chapter3/Demo2Accessible.scala @@ -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}") + } +} \ No newline at end of file diff --git a/src/main/scala/chapter3/Demo3Package_1.scala b/src/main/scala/chapter3/Demo3Package_1.scala new file mode 100644 index 0000000..b6030dd --- /dev/null +++ b/src/main/scala/chapter3/Demo3Package_1.scala @@ -0,0 +1,7 @@ +package chapter3 + +object Demo3Package_1 { + def main(args: Array[String]): Unit = { + println("package test") + } + } diff --git a/src/main/scala/chapter3/Demo4Class.scala b/src/main/scala/chapter3/Demo4Class.scala new file mode 100644 index 0000000..d32389f --- /dev/null +++ b/src/main/scala/chapter3/Demo4Class.scala @@ -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") + } + +} \ No newline at end of file diff --git a/src/main/scala/chapter3/Demo5Trait.scala b/src/main/scala/chapter3/Demo5Trait.scala new file mode 100644 index 0000000..a9599bf --- /dev/null +++ b/src/main/scala/chapter3/Demo5Trait.scala @@ -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}") + } + +} \ No newline at end of file diff --git a/src/main/scala/chapter3/Demo6TraitMixin.scala b/src/main/scala/chapter3/Demo6TraitMixin.scala new file mode 100644 index 0000000..163a389 --- /dev/null +++ b/src/main/scala/chapter3/Demo6TraitMixin.scala @@ -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("我是一辆混合动力车,是在燃油车基础上增加了电力驱动的结果") // 混合动力车 + } +} + +/* + 小汽车 + / \ + / \ + 燃油 电 + \ / + \ / + 混动 + 叠加关系: + 混动 --> 电动 --> 燃油 --> 车 + 打印顺序:(初始化顺序) + 车 --> 燃油 --> 电动 --> 混动 + */ \ No newline at end of file