【scala】构造器
和Java或C++一样,Scala可以有任意多的构造器。
不过Scala类有一个构造器比其他所有构造器都更为重要,它就是主构造器。
除了主构造器之外,类还可以有任意多的辅助构造器。
主构造器
在Scala中,每个类都有主构造器。主构造器并不以this方法定义,而是与类定义交织在一起。
交织在一起怎么理解呢?
就是说你定义好了类,就自动定义好了主构造器,并不用再额外定义了。
主构造器的参数列表放到了类名的后面(我们也可以直接叫它类参数列表)
当我们定义一个类class Person(val pname: String, page: Int){ ... } 的时候
这里自动创建的主构造器的参数列表是 (pname: String, page: Int)
我们定义在主构造器参数列表的参数,在编译的时候会编译成类的字段。
主构造器的方法体就是整个类体
实例化一个类时,类体(主构造函数)中所有可行的部分都会被执行,不管是函数调用还是表达式等等。
只是对于类的字段和方法声明而言是没有什么可执行的,它们只是声明而已。
当主构造器定义的时候,主构造器会将类定义{}里的所有语句执行一次。
示例
class Fruit(n: String, w: Int) {
val name = n;
val weight = w;
println("This is a " + n);
println("Weight = " + w);
}
如果接下来定义一个Fruit对象
val apple = new Fruit("Apple", 10);
则会在屏幕上打印:
This is a Apple
Weight = 10
现在你是不是有疑问,参数在类的参数列表中定义和在类的方法体中定义又有什么不同呢?
其实本质没有任何的不同。因为在类参数列表中定义的参数会被编译成类的字段。
这就像是:在函数的参数列表中声明的参数和方法体中声明的变量本质上没有任何不同一样!
辅助构造器
辅助构造器同Java或C++的构造器十分相似,只有两处不同。
■ 辅助构造器的名称为this。在Java或C++中,构造器的名称和类名相同,当你修改类名时就不那么方便了
■ 每一个辅助构造器都必须以一个对先前已定义的其他辅助构造器或主构造器的调用开始
当我们调用第一个辅助构造器的时候,必须要先调用主构造器。
第二个辅助构造器可以调用第一个辅助构造器或者主构造器,依次类推。
因此主构造器是类的唯一入口点。
示例:
class Person { //没有任何类的参数,主构造器为()
private var name="" ;
private var age=0 ;
def this(name: String){ //一个辅助构造器
this(); // 调用主构造器
this.name=name ;
}
def this (name: String,age: Int) { // 另一个辅助构造器
this (name) ;//调用前一个辅助构造器
this.age=age ;
}
}
和Java、C++一一样,类如果没有显式定义主构造器则自动拥有一个无参的主构造器即可。你可以以三种方式构建对象:
val p1 = new Person //主构造器
val p2 = new Person("Fred")//第一个辅助构造器
val p3 = new Person ("Fred",42) //第二个辅助构造器
【scala】构造器的更多相关文章
- 浅析 Scala 构造器
2019-04-15 关键字:Scala 主构造器.Scala 辅助构造器.Scala 构造器的区别 本篇文章系笔者根据当前所掌握知识对 Scala 构造器的一些心得总结,不保证文章所述内容的绝对.完 ...
- scala构造器实战
父类 abstract class Event(val name:String) { var time:Long var content:String } 子类 private[spark] clas ...
- Scala编程--函数式对象
本章的重点在于定义函数式对象,也就是说,没有任何可变状态的对象的类.作为运行的例子,我们将创造若干把分数作为不可变对象建模的类的变体.在这过程中,我们会展示给你Scala面向对象编程的更多方面:类参数 ...
- 6. Scala面向对象编程(基础部分)
6.1 基本介绍 6.1.1 Scala语言是面向对象的 1) Java时面向对象的编程语言,由于历史原因,Java中海存在着非面向对象的内容:基本类型,null,静态方法等 2) Scala语言来自 ...
- Scala - 快速学习06 - 面向对象
1- 类 1.1- 简介:类.方法及对象 类是用来创建对象的蓝图. Scala文件中包含的多个类之间,都是彼此可见的,不需要声明为public. 创建对象 定义好类以后,就可以使用new关键字来创建对 ...
- 【大数据】Scala学习笔记
第 1 章 scala的概述1 1.1 学习sdala的原因 1 1.2 Scala语言诞生小故事 1 1.3 Scala 和 Java 以及 jvm 的关系分析图 2 1.4 Scala语言的特点 ...
- Scala总结
Scala总结 ===概述 scala是一门以Java虚拟机(JVM)为目标运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言. scala是纯粹的面向对象的语言.java虽然是面 ...
- Scala学习八——继承
一.本章要点 extends,final关键字和Java一样 重写方法时必须使用override 只有主构造器可以调用超类的构造器 可以重写字段 二.扩展类 Scala扩展类和Java一样(使用ext ...
- Scala类和对象
1.面向对象 Scala的类与java.C++的一些比起来更简洁,速度更快 对象:使用object关键字修饰的 类:使用class关键字修饰的new Person()实例对象 new类:类的实例(对象 ...
- Scala 面向对象(一):类与对象基础(一)
1 如何定义类 [修饰符] class 类名 { 类体 } 定义类的注意事项 1)scala语法中,类并不声明为public,所有这些类都具有公有可见性(即默认就是public), 2)一个Scala ...
随机推荐
- 【我的Android进阶之旅】如何快速寻找Android第三方开源库在Jcenter上的最新版本
问题描述 解决方法 先了解compile comsquareupokhttpokhttp240的意义 了解Jcenter和Maven jcenter Maven Central 理解jcenter和M ...
- 我的Android进阶之旅------>android中一些特殊字符(如:←↑→↓等箭头符号)的Unicode码值
在项目中,有时候在一些控件(如Button.TextView)中要添加一些符号,如下图所示: 这个时候可以使用图片的方式来显示,不过这些可以直接使用Un ...
- GSM/GPRS/3G/4G
1.状态机机制的gprs拨号 像GPRS/3G模块之类的应用,需要连接,登陆,初始化等步骤完成后才能传输数据,而这些步骤又比较耗时. 所以用 状态机 + 超时 的机制来实现比较合理. 如下代码片段来描 ...
- MySQL读写分离之amoeba
MySQL读写分离之amoeba主从复制的搭建环境参考:http://www.cnblogs.com/fansik/p/5270334.htmlamoeba依赖于jdk环境:jdk环境搭建参考:htt ...
- python2函数
1.函数的定义 函数的定义形式如下: def <name>(arg1,arg2...argN): <statements> 函数的名字必须以字母开头,可以包括下划线.函数的目的 ...
- [翻译]Feedback on the Go Challenge solutions
第一次Go Challenge比赛,中国区只有3人参赛. 赛后收到邮件,是一个审阅者的反馈,“Feedback on the Go Challenge solutions”,摘录如下: 保持简单粗暴 ...
- Python框架之Tornado(请求阶段)
上图是tornado程序启动以及接收到客户端请求后的整个过程,对于整个过程可以分为两大部分: 启动程序阶段,又称为待请求阶段(上图1.2所有系列和3.0) 接收并处理客户端请求阶段(上图3系列) 简而 ...
- udev和mdev hotplug事件
关于udev和mdev之间的区别与联系我发现自己现在还没有把它完整的给区分开来和联系起来. 设备文件系统有devfs,mdev,udev mdev是udev的简化版本,是busybox中所带的程序,最 ...
- Docker_remote_api未授权访问漏洞
docker remote api主要的目的是取代命令行界面, docker client和docker daemon通过unix domain socket进行通信. 默认情况下,只有本机的roo ...
- React Native之Fetch简单封装、获取网络状态
1.Fetch的使用 fetch的使用非常简单,只需传入请求的url fetch('https://facebook.github.io/react-native/movies.json'); 当然是 ...