32_面向对象_构造器

说明
* 和java一样,scala创建对象时,也会调用构造器方法,并且可以有多个构造器
*
scala的构造器
* 分类
* 主构造器(类体本身) 、 辅助构造器
* 语法
* class 类名(形参列表) {
* // 主构造器
* // 成员
* def this(形参列表){//辅助构造器1
* }
* def this(形参列表){//辅助构造器2
* }
* }
辅助构造器
* 语法
* def this(参数列表) {
* this() //调用主构造器
* 方法体
* }
* 说明
* 1. 方法名称必须为 this,可以有多个,编译器会根据 参数的个数和类型区分 (方法的重载)
* 2. 辅助构造方法不能直接构造对象,必须 调用主构造方法 this()
* 3. 构造器1可以调用 构造器2,被调用的构造器必须提前声明
主构造器
* 主构造器-参数列表
* 语法
* class 类名(参数列表)
* 说明
* 1. 没有修饰符,参数就是局部变量
* 2. var修饰参数,作为类的成员属性,可以修改
* 3. val修饰参数,作为类的成员属性,不可以修改
* */
复制代码
/**
  * @author gaocun
  * @create 2021-10-22 6:49 PM */
object 类_构造器_06 {
  /*
  * 说明
  *     和java一样,scala创建对象时,也会调用构造器方法,并且可以有多个构造器
  *
  * scala的构造器
  *     分类
  *         主构造器(类体本身) 、 辅助构造器
  *     语法
  *         class 类名(形参列表) {
  *             // 主构造器
  *             // 成员
  *             def this(形参列表){//辅助构造器1
  *             }
  *             def this(形参列表){//辅助构造器2
  *             }
  *         }
  *     辅助构造器
  *         语法
  *             def this(参数列表) {
  *                 this() //调用主构造器
  *                 方法体
  *             }
  *         说明
  *             1. 方法名称必须为 this,可以有多个,编译器会根据 参数的个数和类型区分 (方法的重载)
  *             2. 辅助构造方法不能直接构造对象,必须 调用主构造方法 this()
  *             3. 构造器1可以调用 构造器2,被调用的构造器必须提前声明
  *     主构造器
  *         主构造器-参数列表
  *            语法
  *                 class 类名(参数列表)
  *            说明
  *                1. 没有修饰符,参数就是局部变量
  *                2. var修饰参数,作为类的成员属性,可以修改
  *                3. val修饰参数,作为类的成员属性,不可以修改
  * */
}

package Outer {

  // 主构造器 (无参)
  class OneClass {
    // 成员
    var id: Int = _
    var name: String = _
    println("OneClass - 主构造器 调用了")

    // 辅助构造器1
    def this(id: Int) {
      this() // 调用 主构造器
      this.id = id
      println("OneClass - 辅助构造器1 调用了")
    }

    // 辅助构造器2
    def this(name: String) {
      this() // 调用 主构造器
      this.name = name
      println("OneClass - 辅助构造器2 调用了")
    }

    // toString方法
    def tostring() = {
      printf("OneClass id : %d  name : %s\n", this.id, this.name)
    }

  }

  // 主构造器 (带参数 无修饰符)
  class TwoClass(id: Int, name: String) {
    printf("TwoClass- 主构造器 - id :%d name :%s\n", id, name)

    // show
    def show = printf("TwoClass - id :%d name :%s\n", id, name)
  }

  // 主构造器 (带参数 有修饰符)
  class ThreeClass(var id: Int, var name: String) {
    printf("TwoClass- 主构造器 - id :%d name :%s\n", id, name)

    // show
    def show = printf("TwoClass - id :%d name :%s\n", id, name)
  }


  // 测试类
  object test {
    def main(args: Array[String]): Unit = {
      // 调用主构造器
      var obj1 = new OneClass()
      obj1.tostring

      // 调用主构造器 + 辅助构造器1
      var obj2 = new OneClass(10)
      obj2.tostring

      // 调用主构造器 + 辅助构造器2
      var obj3 = new OneClass("大王")
      obj3.tostring

      printf("==========测试 主构造器1==============\n")
      var tobj1 = new TwoClass(10, "大王")
      tobj1.show
      //println(tobj1.id)

      printf("==========测试 主构造器2==============\n")
      var thobj1 = new ThreeClass(10, "大王")
      thobj1.show
      println(thobj1.id)
      println(thobj1.name)


    }

    println("test - 主构造器 调用了")

  }


}
复制代码

 

posted @   学而不思则罔!  阅读(30)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
点击右上角即可分享
微信分享提示