Scala主构造器和辅助构造器 忘是亡心i 2023-01-13 14:59 226阅读 0赞 类比下 Java构造器 Java构造器 基本语法 [修饰符] 方法名(参数列表) { 构造方法体 } 细节说明 1)在 Java 中一个类可以定义多个不同的构造方法(构造器),构造方法重载 2)如果程序员没有定义构造方法,系统会自动给类生成一个默认无参构造方法(也叫默认构造器) 3)一旦定义了自己的构造方法(构造器),默认的构造方法就覆盖了,就不能再使用默认的无参构造方法,除非显示的定义一下 4)子类的构造器默认会调用父类的空参构造器 5)如果子类显式的使用super()调用父类的有参构造器则不会再去调用父类的空参构造器 案例 public class JavaDemo { public static void main(String[] args) { //细节说明4 new Student(); //调用了父类的空参构造器 new Student("zhangsan", 170.0); //调用了父类的空参构造器 //细节说明5 new Student("lisi", 18, 175.0); //调用了父类的带参构造器 } } class Person { String name; int age; public Person() { System.out.println("调用了父类的空参构造器"); } public Person(String name, int age) { this.name = name; this.age = age; System.out.println("调用了父类的带参构造器"); } } class Student extends Person { double height; public Student() { } public Student(String name, int age, double height) { super(name, age); this.height = height; } public Student(String name, double height) { this.name = name; this.height = height; } } Scala构造器 介绍 1)和 Java 一样,Scala构造对象也需要调用构造方法,并且可以有任意多个构造方法(即 scala 中构造器也支持重载) 2)Scala 类的构造器包括:主构造器和辅助构造器 3)Scala中辅助构造器 必须使用this, 调用 主构造器 或者上个 辅助构造器,即 第一个 辅助构造器 用this 调用主构造器, 第二个辅助构造器 使用this 调用第一个辅助构造器。 eg: ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h6cDY2Ng_size_16_color_FFFFFF_t_70][] 所以,第二个 辅助构造器 会先调用第一个辅助构造器,第一个辅助构造器又调用 主构造器, 所以会先执行 主构造器 然后 第一个辅助构造器 依次往后执行 Scala构造器基本语法 class 类名(形参列表) { //主构造器 // 类体 def this(形参列表) { //辅助构造器 } def this(形参列表) { //辅助构造器可以有多个,编译器通过不同参数来区分 } } 细节说明 1)Scala 构造器作用是完成对新对象的初始化,构造器没有返回值 2)主构造器的声明直接放置于类名之后 3)主构造器会执行类定义中的所有语句,这里可以体会到 Scala 的函数式编程和面向对象编程融合在一起,即:构造器也是方法(函数),传递参数和使用方法和前面的函数部分内容没有区别 4)如果主构造器无参数,小括号可省略,构建对象时调用的构造方法的小括号也可以省略 5)辅助构造器名称为 this(这个和 Java是不一样的),多个辅助构造器通过不同参数列表进行区分,在底层就是构造器重载。辅助构造器,必须在第一行显式调用主构造器(可以是直接,也可以是间接) 6)如果想让主构造器变成私有的,可以在 () 之前加上 private,这样用户只能通过辅助构造器来构造对象了,示例:class Person private() \{\} 7)辅助构造器的声明不能和主构造器的声明一致,会发生错误(即构造器名重复) 8)子类的主构造器默认会调用父类的空参构造器,这就会直接或间接的调用父类的主构造器 案例 .scala代码: object ScalaConstructor { def main(args: Array[String]): Unit = { //1. 使用主构造器 val person1 = new Person1("Tom", 18) println(person1.toString) //执行了主构造器的其他语句:age=28 //输出:name=Tom, age=28 println("**************************") //2. 使用辅助构造器 val person2 = new Person1("Tom") println(person2.toString) //执行了主构造器的其他语句:age=20 //输出:name=Tom, age=20 } } //主构造器:初始化对象的age属性和name属性 class Person1(inName: String, inAge: Int) { var name: String = inName var age: Int = inAge age += 10 println("执行了主构造器的其他语句:" + "age=" + age) //重写toString,便于输出对象的信息 override def toString: String = { "name=" + this.name + ", age=" + this.age } //辅助构造器:初始化对象的name属性 def this(name: String) { //辅助构造器,必须在第一行显式调用主构造器(可以是直接,也可以是间接) this("jack", 10) //如果主构造器是空参构造器,则可以写成this或this() this.name = name //对name重新赋值 } def this() { this("jack", 10) } } Person1的反编译代码: //可以看出scala主构造器和辅助构造器在底层都是java中的构造器,并没有主次之分 public class Person1 { private String name; private int age; public String name() { return this.name; } public void name_$eq(String x$1) { this.name = x$1; } public int age() { return this.age; } public void age_$eq(int x$1) { this.age = x$1; } public String toString() { return (new StringBuilder()).append("name=").append(name()).append(", age=").append(BoxesRunTime.boxToInteger(age())).toString(); } public Person1(String name) { this("jack", 10); name_$eq(name); } public Person1() { this("jack", 10); } public Person1(String inName, int inAge) { this.name = inName; this.age = inAge; age_$eq(age() + 10); Predef$.MODULE$.println((new StringBuilder()).append(").append(BoxesRunTime.boxToInteger(age())).toString()); } } Scala构造器参数的修饰符 说明 1)Scala 类的主构造器的形参未用任何修饰符修饰,那么这个参数是局部变量 2)如果参数使用 val 关键字声明,那么 Scala 会将参数作为类的私有的只读属性使用 3)如果参数使用 var 关键字声明,那么 Scala 会将参数作为类的成员属性使用,并会提供属性对应的 xxx()\[类似 getter\] / xxx\_$eq()\[类似 setter\]方法,即这时的成员属性是私有的,但是可读写 案例 .scala代码: object ScalaConstructor1 { def main(args: Array[String]): Unit = { val worker1 = new Worker1("zhangsan") //println(worker1.inName) //不能访问inName, 会报错 val worker2 = new Worker2("lisi") println(worker2.inName) //可以访问inName, lisi val worker3 = new Worker3("wangwu") println(worker3.inName) //可以访问inName, wangwu worker3.inName = "zhaoliu" //可以修改inName, println(worker3.inName) //zhaoliu println(worker3.name) //wangwu } } //1. 如果主构造器是Worker(inName: String),那么inName就是一个局部变量 class Worker1(inName: String) { var name = inName } //2. 如果主构造器是Worker2(val inName: String) ,那么inName就是Worker2的一个private的只读属性 class Worker2(val inName: String) { var name = inName } // 如果主构造器是Worker3(var inName: String),那么inName就是Worker3的一个private的可读写的属性 class Worker3(var inName: String) { var name = inName } Worker1的反编译代码: //inName变成Worker1构造器的局部变量,不能访问 public class Worker1 { private String name; public String name() { return this.name; } public void name_$eq(String x$1) { this.name = x$1; } public Worker1(String inName) { this.name = inName; } } Worker2的反编译代码: //inName变成Worker2的私有不可变的属性,提供了 public String inName() {} 方法来访问 public class Worker2 { private final String inName; private String name; public String inName() { return this.inName; } public Worker2(String inName) { this.name = inName; } public String name() { return this.name; } public void name_$eq(String x$1) { this.name = x$1; } } Worker3的反编译代码: //inName变成Worker2的私有属性,提供了 public String inName() {} 方法来访问和 public void inName_$eq(String x$1) {} 来修改 public class Worker3 { private String inName; public String inName() { return this.inName; } public void inName_$eq(String x$1) { this.inName = x$1; } private String name = inName(); public String name() { return this.name; } public void name_$eq(String x$1) { this.name = x$1; } public Worker3(String inName) {} } [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h6cDY2Ng_size_16_color_FFFFFF_t_70]: /images/20221022/989784c3cb824fe8b7eec8fac21029b8.png
相关 Java构造方法(构造器) 目录 1.什么是构造方法? 2.构造方法的使用 -------------------- 1.什么是构造方法? 构造方法(也称构造器 constructor):是 电玩女神/ 2023年10月14日 11:19/ 0 赞/ 39 阅读
相关 Scala主构造方法和辅助构造方法 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ub 刺骨的言语ヽ痛彻心扉/ 2023年10月07日 03:43/ 0 赞/ 56 阅读
相关 Scala主构造器和辅助构造器 类比下 Java构造器 Java构造器 基本语法 [修饰符] 方法名(参数列表) { 构造方法体 } 细节说明 1)在 Java 中一个 忘是亡心i/ 2023年01月13日 14:59/ 0 赞/ 227 阅读
相关 Scala系列12:Scala主构造器与辅助构造器使用详解与演示 0.类的构造器 跟Java一样,当我们创建类对象的时候,会自动调用类的构造器。之前我们创建类对象没有显示调用构造器,那是因为之前使用的都是默认构造器,此 Dear 丶/ 2022年12月03日 13:09/ 0 赞/ 215 阅读
相关 Scala类的构造器与访问器 1.构造器 在Scala中,每个类都有一个主构造器。主构造器与类的定义交织在一起,如下: class Person ( private var 红太狼/ 2022年08月18日 11:56/ 0 赞/ 233 阅读
相关 构造器 构造器的作用:创建对象 构造器格式:访问修饰符 类名(参数列表) \{ \} 为什么不写返回类型呢?因为本身构造器的作用就是返回一个对象,不允许更改其返 小灰灰/ 2022年06月04日 04:47/ 0 赞/ 242 阅读
相关 Scala中的类和构造器 Scala中的类 摘要 网络上很多资料讲得不清不楚的,有些甚至是片面的错误的,看语言应该是直接用翻译器将英文翻译成中文。所以依照着网上的一些说法和自己的实验重新将一 桃扇骨/ 2022年06月01日 09:38/ 0 赞/ 237 阅读
相关 Scala类的概述、类的定义、主构造器、辅助构造器 09 1. Scala类的定义 在Scala中,类并不声明为public类型,Scala源文件中可以包含多个类,所以这些类都具有共有可见性 用val修饰的变量是可读 客官°小女子只卖身不卖艺/ 2022年02月02日 03:39/ 0 赞/ 420 阅读
相关 scala构造器 [2019独角兽企业重金招聘Python工程师标准>>> ][2019_Python_] ![hot3.png][] object ConstructorTest \{ 墨蓝/ 2022年01月14日 01:21/ 0 赞/ 314 阅读
还没有评论,来说两句吧...