版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012292754/article/details/85137667
1 面向对象特点
- 封装:属性、方法封装到类中;
- 继承
- 多态:父类引用指向子类对象,开发框架的基石
package com.scalatest.scala.oop
object SimpleObjectApp {
def main(args: Array[String]): Unit = {
val person = new People()
person.name = "Mike"
println(person.name + "-" + person.age)
println("eat:" + person.eat)
person.play("Beijing")
person.printInfo()
}
}
class People {
//定义属性
var name: String = _
val age: Int = 20
//只能在 class 内部访问
private [this] val gender = "male"
def printInfo(): Unit ={
println("gender: " + gender)
}
def eat(): String = {
name + " eating.."
}
def play(loc: String): Unit = {
println(name + " is at " + loc)
}
}
1.1 占位符 _
2 Scala 构造器
package com.scalatest.scala.oop
object ConstructorApp {
def main(args: Array[String]): Unit = {
val person = new Person("Mike", 20)
}
}
//主构造器
class Person(val name: String, val age: Int) {
println(" enter Person constructor ..")
val school = "AAA"
var gender: String = _
//附属构造器
def this(name: String, age: Int, gender: String) {
this(name,age)// 附属构造器的第一行必须调用主构造器或者其他附属构造器
this.gender = gender
}
println(" leave Person constructor ..")
}
3 继承
子类继承父类的时候,如果父类有的属性,不用写 val,var
,如果是子类所特有的,要加,否则在外面访问不到。
package com.scalatest.scala.oop
object ConstructorApp {
def main(args: Array[String]): Unit = {
//val person = new Person("Mike", 20)
val student = new Student("John", 24, "Math")
println(student.name + "-" + student.major)
}
}
//主构造器
class Person(val name: String, val age: Int) {
println(" enter Person constructor ..")
val school = "AAA"
var gender: String = _
//附属构造器
def this(name: String, age: Int, gender: String) {
this(name, age) // 附属构造器的第一行必须调用主构造器或者其他附属构造器
this.gender = gender
}
println(" leave Person constructor ..")
}
class Student(name: String, age: Int, var major: String) extends Person(name, age) {
println(" enter Student constructor ..")
println(" leave Student constructor ..")
}
4 重写
package com.scalatest.scala.oop
object ConstructorApp {
def main(args: Array[String]): Unit = {
//val person = new Person("Mike", 20)
val student = new Student("John", 24, "Math")
println(student.name + "-" + student.major)
println(student)
}
}
//主构造器
class Person(val name: String, val age: Int) {
println(" enter Person constructor ..")
val school = "AAA"
var gender: String = _
//附属构造器
def this(name: String, age: Int, gender: String) {
this(name, age) // 附属构造器的第一行必须调用主构造器或者其他附属构造器
this.gender = gender
}
println(" leave Person constructor ..")
}
class Student(name: String, age: Int, var major: String) extends Person(name, age) {
println(" enter Student constructor ..")
override val school = "SSS"
override def toString: String = "Person: override def toString " + school
println(" leave Student constructor ..")
}
5 抽象类
package com.scalatest.scala.oop
object AbstractApp {
def main(args: Array[String]): Unit = {
val student = new Student2()
println(student.name)
student.speak
}
}
/*
* 类的一个或者多个方法没有完整的实现
* */
abstract class Person2 {
def speak
val name: String
val age: Int
}
class Student2 extends Person2 {
override def speak: Unit = {
println("speak")
}
override val name: String = "Mike"
override val age: Int = 18
}
6 伴生类和伴生对象
package com.scalatest.scala.oop
object ApplyApp {
}
/*
* 伴生类和伴生对象
* 如果有一个 class,还有一个与 class同名的 object
* 这个 object 是 class 的伴生对象,class 是 object 的伴生类
* */
class ApplyTest{
}
object ApplyTest{
}
6.1 apply
方法
类名()
⇒ 调用 Object.apply对象()
=> 调用 Class.apply
package com.scalatest.scala.oop
object ApplyApp {
def main(args: Array[String]): Unit = {
// for (i <- 1 to 10) {
// ApplyTest.incr
// }
//
// println(ApplyTest.count) // 10,说明 object 本身就是一个单例对象
/*
* 这里不需要 new,new的操作已经在 Object 中 apply中
* */
val b = ApplyTest(); // => Object.apply
println("========================================")
val c = new ApplyTest()
println(c)
c()
}
}
/*
* 伴生类和伴生对象
* 如果有一个 class,还有一个与 class同名的 object
* 这个 object 是 class 的伴生对象,class 是 object 的伴生类
* */
class ApplyTest {
def apply()={
println("class ApplyTest apply...")
}
}
object ApplyTest {
println("Object ApplyTest enter...")
var count = 0
def incr = {
count = count + 1
}
/*
* 最佳实践:在 Object 的apply 方法中 new Class
* */
def apply()={
println("Object ApplyTest apply...")
// 在 object 中的 apply 中 new class
new ApplyTest
}
println("Object ApplyTest leave...")
}