Scala学习 2 Scala面向对象

本文深入探讨Scala中的面向对象编程,包括类与对象的基本概念、构造器使用、抽象类及接口应用、Option类解析等内容,并通过实例代码进行详细说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

object Scala_study3 {
  def main(args: Array[String]): Unit = {

    /*
    * 2.1 Scala面对对象详解
    *
    * 2.1.1 Scalaclassobject初介紹
    * scalaclass的定义与java类似,区别是在Scala,类名不是必须和文件名相同,且一个文件中可以定义多个class.
    * Scala中的class不存在静态成员,Java中的静态成员由Scala中的object对象替代,
    * object对象名与class名相同时称objectclass[伴生对象]
    * */

    //2-1 Scala类的定义实战
    class HiScala{
      private val name:String = "zhangsan"
      def sayName(): Unit ={
        println(name)
      }
      def getName = name
    }

    val hiScala = new HiScala
    hiScala.sayName()
    println(hiScala.getName)


    //2-2 object定义实战
    object Person{
      println("构造函数调用一次")
      val age = 10
      def getAge = age
    }
    Person.getAge
    Person.getAge

    //2-3 继承

    abstract class Animal{
      def eat = {
        println("Eat food !!!")
      }
      def run
    }

    class Cat extends Animal{
      override def eat: Unit = {
        println("Eat mouse!!!")
      }

      override def run: Unit = {
        println("cat is running...")
      }

    }

    class Dog extends Animal{
      override def run: Unit = {
        println("dog is running")
      }
    }

    val c = new Cat
    c.eat
    c.run
    val d = new Dog
    d.eat
    d.run
  }

  /*
  * Eat mouse!!!
    cat is running...
    Eat food !!!
    dog is running
  * */

  //2-4 子类不能重写父类中被final修饰的方法和属性

  /*
  * 2.1.2 主构造器和辅助构造器
  * */

  //2-5 Scala默认构造器在类上
  class Person1{

  }//默认无参构造器

  class Person2(name:String){
    println(name)
  }//默认带一个字符串参数的构造器

  //2-6 构造器重载(辅助构造器)
  class Person3(name:String){
    println(name)
    def this(name:String,age:Int)
    {
      this(name)
      println(name + ":" + age)
    }
    def this(name:String,age:Int,sex:String)
    {
      this(name,age)
      println(name + ":" + age + ":" + sex)
    }
  }

  //2-7 构造器重载(多参数默认构造器)
  class Student1(name:String,age:Int,sex:String){
    println(name + ":" + age + ":" + sex)
  }
  val s = new Student1("chenjie",23,"male")


  /*
  * 2.1.3 类的字段和方法彻底精通
  * */
  class Person4{
    var name : String = "zhangsan"
    var age = 30
    val sex = "famale"
    def seyHi = println("Hi!!!")
    def increase(age:Int):Int = this.age + age
  }

  val p = new Person4
  println(p.name)
  println(p.sex)
  p.name = "lisi"


  //2-9 复写setter
  class Person5{
    private var myName = "Flink"
    def name = this.myName
    def name_=(newName:String){//等号两边不能有空格
      myName = newName
      println("hi:" + myName)
    }
  }

  //2-10 自定义setter
  class Person6{
    private var myName = "Flink"
    def name = this.myName
    def update(newName:String): Unit ={
      myName = newName
    }
  }


  //2-11 private[this]实战,用此修饰的字段或方法只能被当前对象访问,当前对象的其他实例无法访问.




  /*
  * 2.1.4 抽象类 接口的实战详解
  * */

  abstract class Person7(name:String){
    println(this.name)
    private var age = 20
    val sex : String = "male" //抽象类中的字段不能用abstract修饰
  }

  //Scala的特质相当于Java中的接口,不过特质中可以有实现的方法
  //Scala中实现特质被成为混入,混入的第一个特质用关键字extends,混入更多的用with

  trait Person8{
    val name : String
    val age = 30
    def eat(str:String): Unit ={
      println(str)
    }
  }

  trait Worker{
    val age = 25
    def work: Unit ={
      println("Working....")
    }
  }

  class Student2 extends Worker with Person8{
    val name : String = "zhangsan"
    override val age: Int = 15  //两个特质中的相同字段发生冲突时必须重写该字段
  }



  /*
  * 2.1.5 Scala Option类详解
  * Scala中的Option[T]可以是一些[T]或者None对象,它代表一个缺失值
  * 例如hashMapget方法,可能找到则返回值,可能找不到则返回null,这就是一个Option
  * */

  /*
  * 2.1.6 objetc的提取器
  * objetc中提供了apply方法,作用是在创建对象时不直接用new,而是直接用对象加参数,这时调用类伴生对象的apply方法
  * */
  var arr1 = Array(1,2,3)
  arr1 = Array.apply(1,2,3)


  //2-18 提取器

  object ExtractorTest{
    def apply(user:String,domain:String)={
      user + "@" + domain
    }

    def unapply(str: String): Option[(String,String)] = {
      val parts = str.split("@")
      if(parts.length == 2){
        Some(parts(0),parts(1))
      }
      else
        {
          None
        }
    }
  }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值