Scala主构造器和辅助构造器

注:1.本文主要参考自《快学Scala》2.使用jd-gui反编译

  Scala的构造方法跟Scala很相似,也可以有任意多的构造器。在Scala中构造器分为主构造器和辅助构造器

在Scala中可以包括一个主构造器和任意多个辅助构造器

主构造器

在Scala中,每个类都有主构造器。而且主构造器的定义是跟类定义交织在一起的。

主构造器的参数是直接放置在类名后面的,如下:

class Person(val name:String,val age:Int) {
   //your code
}

主构造器还会执行类语句(不属于任何方法的语句)

class Person(val name:String,val age:Int) {
  println("hello") //该语句属于主构造器
}

主构造器让人感到疑惑的地方主要在于:构造器参数使用不同的形式传递,生成的class文件也是不同的,我们随便列举几种

形式1-val类参数:(在这种形式中,类参数会作为class文件的字段,并且会生成scala形式的getter)

class Person4(val name:String) {

}

生成的class文件如下:

public class Person4
{
  private final String name;

  public String name()
  {
    return this.name;
  }

  public Person4(String name) {}
}

形式2-var参数:(该形式的类参数会作为class文件的字段出现,并且会生成scala形式的getter和setter)

class Person4(var name:String) {

}

生成的class文件如下:

public class Person4
{
  private String name;

  public Person4(String name) {}

  public void name_$eq(String x$1)
  {
    this.name = x$1;
  }

  public String name()
  {
    return this.name;
  }
}

形式3-普通方法参数

1.如果类参数没有在类方法中用到,该类参数相当于只用于类的主构造函数。

class Person4(name:String) {

}

该形式生成的class文件如下

public class Person4
{
  public Person4(String name) {}
}

2.如果类参数在类方法中有用到的话,相当于private[this],即相当于对象私有

class Person4(name:String) {
   def sayHi(){
     println(name)
   }
}

生成的class文件如下

public class Person4
{
  private final String name;

  public void sayHi()
  {
    Predef..MODULE$.println(this.name);
  }

  public Person4(String name) {}
}

 

主构造器参数还可以是private var、private val形式,这些都比较简单,跟val、var相似,只是get或者set也是private的而已

读者可以自己验证。

 

辅助构造器

在scala中,辅助构造器的名字必须是this(相比于java中,当类名字改变的时候,就不必在修改构造函数的名字了),而且每个辅助构造器都必须以

主构造函数或者先前定义的辅助构造器开始定义,否则编译不通过。

class Person4(name:String) {

  var age:Int = 0
  var city:String = ""

  def this(name:String,age:Int,city:String){
    this(name)
    this.age = age
  }

}
时间: 2024-10-28 10:56:53

Scala主构造器和辅助构造器的相关文章

008-Scala主构造器、私有构造器、构造器重载实战详解

008-Scala主构造器.私有构造器.构造器重载实战详解 Scala主构造器实战 无参数的主构造器 分析 1.name 需要赋初值,一般通过占位符来代表空值 2.private 声明私有的age 生成的getter/setter方法也是私有的;不加则私有的age生成公有的getter/setter方法 3.private[this] 表示是只属于当前的实例本身,别人无法通过实例访问,也就是说再实例化对象也不可以访问此属性 4.def定义辅助构造器(重载构造器),其他的重载构造器必须调用主构造器

实例构造器和类型构造器

实例构造器,新建对象时,设置对象的初始状态,平时接触的比较多,就不多说了. 类型构造器(静态构造器,类构造器),用来设置类型的初始状态.类型默认没有定义类型构造器,如果定义,也只能定义一个.此外,类型构造器没有参数,代码示例如下: internal sealed class SomeRefType { static SomeRefType() { // SomeRefType被首次访问时,执行这里的代码 } } 类型构造器的定义类似于无参的实例构造器,区别在于必须将其标记为static.此外,类

类型构造器与实例构造器

比较实例构造器和类型构造器的区别,类型构造器必须是static,并且不允许定义访问修饰符,类型构造器只能被执行一次.: class mybaseclass { public mybaseclass() { Console.WriteLine("基类实例构造器"); } static mybaseclass()//类型构造器不允许出现访问修饰符 { Console.WriteLine("基类类型构造器"); } public void test()//这里如果是pri

获取构造器并使用构造器创建对象

package Reflect; import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException; class Student{ int age; String name; public Student() { System.out.println("调用无参构造器创建对象"); } public Student(int age,String name) { this.age

请问什么是便利构造器(快速构造器)

今天在查找的时候,发现这个比较浅显易懂,记录下,下面的是人家的回复 http://bbs.itheima.com/thread-112451-1-1.html 1.便利构造器是一种快速创建对象的方式.它本质上是把初始化方法做了一次封装,方便外界使用 2.便利构造器是一个类方法(以+开头) 类似于Java中的构造方法, 指的是在init的时候,同时给属性变量赋值的方法 比如 @interface Person : NSObject{ int _age; NSString *_name; } - (

子类构造器与父类构造器

子类不能继承父类的构造器(构造方法或者构造函数),但是父类的构造器带有参数的,则必须在子类的构造器中显式地通过super关键字调用父类的构造器并配以适当的参数列表. 如果父类有无参构造器,则在子类的构造器中用super调用父类构造器不是必须的,如果没有使用super关键字,系统会自动调用父类的无参构造器. class SuperClass { private int n; SuperClass(){ System.out.println("SuperClass()"); } Super

主码流 辅助码流说明

说明: 仅支持以下能力的设备才具有相对应的功能. 主码流 以流媒体选中的协议连接,在 主码流配置 下进行视频的监视或关闭.一般用于存储和监视. 辅码流1 以流媒体选中的协议连接,在 辅码流1配置 下进行视频的监视或关闭.在网络带宽不足时,用于代替主码流进行网络监视. 辅码流2 以流媒体选中的协议连接,在 辅码流2配置 下进行视频的监视或关闭.在网络带宽不足时,用于代替主码流进行网络监视. 流媒体协议 选择视频监视协议,支持TCP.UDP和组播. 视频窗口功能选项 区域聚焦 - 点击该按钮,使用鼠

浅析 Scala 构造器

2019-04-15 关键字:Scala 主构造器.Scala 辅助构造器.Scala 构造器的区别 本篇文章系笔者根据当前所掌握知识对 Scala 构造器的一些心得总结,不保证文章所述内容的绝对.完全正确性. 同 Java 一样,Scala 中的类的实例化过程也是从 构造器 开始的.只不过 Scala 中的构造器有两种 1. 主构造器: 2. 辅助构造器. 我们可以使用任一种构造器来实例化我们的类.不过,就本质上来说,主构造器 才是真正将我们的类实例化的构造器.下面我们就来简单探讨一下 Sca

scala习题精选100道

1.**[primary]**关于和Scala进行交互的基本方式REPL说法错误的是? C A.R 读取(read)B.E 求值(evaluate)C.P 解析(Parse)D.L 循环(Loop) 2.**[primary]**不属于Scala7种数值类型的是? D A.CharB.IntC.FloatD.LongLong 3.**[primary]**如果需要使用scala库中的sqrt函数,如sqrt(2),下列引用包的方式错误的是? B A.import scala.math._B.im