和Java或C++一样,Scala可以有任意多的构造器。

不过Scala类有一个构造器比其他所有构造器都更为重要,它就是主构造器。

除了主构造器之外,类还可以有任意多的辅助构造器。

主构造器

在Scala中,每个类都有主构造器。主构造器并不以this方法定义,而是与类定义交织在一起。

交织在一起怎么理解呢?

就是说你定义好了类,就自动定义好了主构造器,并不用再额外定义了。

主构造器的参数列表放到了类名的后面(我们也可以直接叫它类参数列表)

当我们定义一个类class Person(val pname: String, page: Int){ ... } 的时候

这里自动创建的主构造器的参数列表是  (pname: String, page: Int)

我们定义在主构造器参数列表的参数,在编译的时候会编译成类的字段。

主构造器的方法体就是整个类体

实例化一个类时,类体(主构造函数)中所有可行的部分都会被执行,不管是函数调用还是表达式等等。

只是对于类的字段和方法声明而言是没有什么可执行的,它们只是声明而已。

当主构造器定义的时候,主构造器会将类定义{}里的所有语句执行一次。

示例

  1. class Fruit(n: String, w: Int) {
  2. val name = n
  3. val weight = w
  4. println("This is a " + n);
  5. println("Weight = " + w);
  6. }

  

如果接下来定义一个Fruit对象

  1. val apple = new Fruit("Apple", 10);

则会在屏幕上打印:

  This is a Apple

  Weight = 10

现在你是不是有疑问,参数在类的参数列表中定义和在类的方法体中定义又有什么不同呢?

其实本质没有任何的不同。因为在类参数列表中定义的参数会被编译成类的字段。

这就像是:在函数的参数列表中声明的参数和方法体中声明的变量本质上没有任何不同一样!

辅助构造器

辅助构造器同Java或C++的构造器十分相似,只有两处不同。

 ■ 辅助构造器的名称为this。在Java或C++中,构造器的名称和类名相同,当你修改类名时就不那么方便了

 ■ 每一个辅助构造器都必须以一个对先前已定义的其他辅助构造器或主构造器的调用开始

  当我们调用第一个辅助构造器的时候,必须要先调用主构造器。

  第二个辅助构造器可以调用第一个辅助构造器或者主构造器,依次类推。

  因此主构造器是类的唯一入口点。

示例:

  1. class Person { //没有任何类的参数,主构造器为()
  2.   private var name=""
  3.   private var age=0
  4.   def this(name: String){ //一个辅助构造器
  5.    this(); // 调用主构造器
  6.    this.name=name
  7.  }
  8.  def this (name: Stringage: Int) { // 另一个辅助构造器
  9.    this (name) //调用前一个辅助构造器
  10.    this.age=age
  11.   }
    }

和Java、C++一一样,类如果没有显式定义主构造器则自动拥有一个无参的主构造器即可。你可以以三种方式构建对象:

  1. val p1 = new Person //主构造器
  2. val p2 = new Person"Fred"//第一个辅助构造器
  3. val p3 = new Person ("Fred",42) //第二个辅助构造器

【scala】构造器的更多相关文章

  1. 浅析 Scala 构造器

    2019-04-15 关键字:Scala 主构造器.Scala 辅助构造器.Scala 构造器的区别 本篇文章系笔者根据当前所掌握知识对 Scala 构造器的一些心得总结,不保证文章所述内容的绝对.完 ...

  2. scala构造器实战

    父类 abstract class Event(val name:String) { var time:Long var content:String } 子类 private[spark] clas ...

  3. Scala编程--函数式对象

    本章的重点在于定义函数式对象,也就是说,没有任何可变状态的对象的类.作为运行的例子,我们将创造若干把分数作为不可变对象建模的类的变体.在这过程中,我们会展示给你Scala面向对象编程的更多方面:类参数 ...

  4. 6. Scala面向对象编程(基础部分)

    6.1 基本介绍 6.1.1 Scala语言是面向对象的 1) Java时面向对象的编程语言,由于历史原因,Java中海存在着非面向对象的内容:基本类型,null,静态方法等 2) Scala语言来自 ...

  5. Scala - 快速学习06 - 面向对象

    1- 类 1.1- 简介:类.方法及对象 类是用来创建对象的蓝图. Scala文件中包含的多个类之间,都是彼此可见的,不需要声明为public. 创建对象 定义好类以后,就可以使用new关键字来创建对 ...

  6. 【大数据】Scala学习笔记

    第 1 章 scala的概述1 1.1 学习sdala的原因 1 1.2 Scala语言诞生小故事 1 1.3 Scala 和 Java  以及 jvm 的关系分析图 2 1.4 Scala语言的特点 ...

  7. Scala总结

    Scala总结 ===概述 scala是一门以Java虚拟机(JVM)为目标运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言. scala是纯粹的面向对象的语言.java虽然是面 ...

  8. Scala学习八——继承

    一.本章要点 extends,final关键字和Java一样 重写方法时必须使用override 只有主构造器可以调用超类的构造器 可以重写字段 二.扩展类 Scala扩展类和Java一样(使用ext ...

  9. Scala类和对象

    1.面向对象 Scala的类与java.C++的一些比起来更简洁,速度更快 对象:使用object关键字修饰的 类:使用class关键字修饰的new Person()实例对象 new类:类的实例(对象 ...

  10. Scala 面向对象(一):类与对象基础(一)

    1 如何定义类 [修饰符] class 类名 { 类体 } 定义类的注意事项 1)scala语法中,类并不声明为public,所有这些类都具有公有可见性(即默认就是public), 2)一个Scala ...

随机推荐

  1. (转)专项:Android 内存泄露实践分析

    今天看到一篇关于Android 内存泄露实践分析的文章,感觉不错,讲的还算详细,mark到这里. 原文发表于:Testerhome: 作者:ycwdaaaa ;  原文链接:https://teste ...

  2. 001-前端系列-react系列

    一.概述 原文地址:http://www.ruanyifeng.com/blog/2016/09/react-technology-stack.html 二.摘要 ES6 语法:教程 [可以了解] B ...

  3. 0408-服务注册与发现-Eureka常用配置

    一.概述 参看地址:https://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring-cloud.html#_appendix ...

  4. matlab循环保存dat文件

    将数据保存为dat文件 这里有两种方法,第一种是: save filename dataname; 这种方法书写简单,但是功能也很简单.这里的filename就是死的filenam,即filename ...

  5. Hbase 学习笔记2----概念

    说在前面,本文部分内容来源于社区官网经过适度翻译,部分根据经验总结,部分是抄袭网络博文,(不一一列举引用,在此致歉)一并列在一起,本文的目的,希望能总结出一些有用的,应该注意到的东西,基本思路是先提出 ...

  6. STL sort “invalid operator <”

    跟踪了下,是比较函数(下面的_Pred)的问题: template<class _Pr, class _Ty1, class _Ty2> inline bool _Debug_lt_pre ...

  7. Python一些常用模块

    阅读目录 一: collections模块 二: time,datetime模块 三: random模块 四: os模块 五: sys模块 六: json,pickle 七: re正则模块 八:re模 ...

  8. LeetCode:比较含退格字符串【844】

    LeetCode:比较含退格字符串[844] 题目描述 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表退格字符. 示例 1: 输入:S = ...

  9. FTP 服务器性能 测试点

    测试FTP 服务器性能测试点: 1. ftp软件性能 2. ftp服务器硬件处理性能(IO/CPU/ROM) 3. ftp服务器网络吞吐性能 (NET IO) 有针对性的测试 达到的效果会比较好. 建 ...

  10. Android平台Camera实时滤镜实现方法探讨(三)--通过Shader实现YUV转换RBG

    http://blog.csdn.net/oshunz/article/details/50055057 文章例如该链接通过将YUV分成三个纹理,在shader中取出并且经过公式变换,转换成RGB.我 ...