Scala学习笔记(3)—— Scala面向对象

版权声明:本文为博主原创文章,未经博主允许不得转载。 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
* 这个 objectclass 的伴生对象,classobject 的伴生类
* */
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
* 这个 objectclass 的伴生对象,classobject 的伴生类
* */
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...")
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u012292754/article/details/85137667