Scala-构造函数
/*
scala的构造函数分为主构造函数和辅助构造函数。
一、主构造函数
在Scala中,每个类都有主构造函数,和类的定义交织在一起。
一个Scala类的主构造函数包括:1、构造函数的参数;2、类体中调用的方法;3、在类体中执行的语句和表达式。
如果类名之后没有参数,则该类具备一个无参主构造函数,这样一个构造函数仅仅是简单地执行类体中的所有语句。
二、辅助构造函数
1.辅助构造函数的名称为this,这主要是考虑到在C++和Java中,构造函数名与类名同名,当更改类名时需要同时修改构造函数名,因此使用this为构造函数名使程序可靠性更强;
2.每一个辅助构造函数都必须以一个对先前已定义的其他辅助构造函数或主构造函数的调用开始
三、Scala提供一个主构造函数和任意多个辅助构造函数
1.如果不指定主构造函数,编译器将创建一个主构造函数的构造函数,所有类的主体的声明都被视为构造函数的一部分。它也被称为默认构造函数。
2.如果代码只有一个构造函数,则可以不需要定义明确的构造函数。它有助于优化代码,可以创建具有零个或多个参数的主构造函数。
3.必须要从辅助构造函数内部调用主构造函数。this关键字用于从其他构造函数调用构造函数。当调用其他构造函数时,要将其放在构造函数中的第一行。
4.在scala中,可以重载构造函数。
四、主构造函数的参数(类参数)
1.在主构造函数的参数列表中声明的参数和在类体中声明的变量本质上没有任何不同;
2.如果只有var/val修饰,则字段总是对外可见的,即默认是public的
3.如果连var/val也没有,则字段对外不可见,同时内部只读,不可改写,即默认是:private val
4.上一条不适用于case class,case class的类参数在不指定val/var修饰时,会自动编译为public val,即对外只读,如果需要case class的字段外部可写,可以显式地指定var关键字!
五、类字段的getter/setter
1.对于var修饰的参数:外部可读/可改写 (实际上是:编译器为该类参数(字段)自动生成了getter和setter)
2.对于val修饰的参数:外部可读/不可改写(实际上是:编译器为该类参数(字段)只生成了getter没有生成setter)
3.对于private var修饰的参数:内部可读/可改写 (编译器不会为私有类参数(字段)自动生成getter和setter)
4.对于private val修饰的参数:内部可读/不可改写 (编译器不会为该类参数(字段)自动生成getter和setter)
*/
/**
* 重写 :可以重写成员变量和成员方法(重写字段或者方法)
* 子类继承父类
*/ class Person(val name : String,var age : Int) {
println("The primarry constructor of Person")
val school = "BJU" def sleep = "8 hours" override def toString = "I am a person !" }
/**
* woker 继承自person ,name,age,salary是woker的成员变量
* 子类必须把父类的主构造器中的参数都填充满(和java不同:继承时采用 super使用父类的成员)
*/
class Worker(name : String ,age : Int ,val salary :Long ) extends Person(name,age){ println("This is the subClass of person,primary constructor of woker") override val school = "Spark" // 复写字段或者是方法都要进行 添加重写 override def toString = "I am a worker !" + super.sleep
} object Person {
def main(args: Array[String]): Unit = {
//构建时 先构建父类
val w = new Worker("spark",5,100000) println("School :" +w.school )
println(w.toString())
}
}
Scala-构造函数的更多相关文章
- Scala——构造函数
Scala的构造函数分为主构造函数和辅助构造函数. 辅助构造函数 辅助构造函数比较容易理解,它们同C++和Java的构造函数十分类似,只有两处不同: 1.辅助构造函数的名称为this,这主要是考虑到在 ...
- scala中的面向对象定义类,构造函数,继承
我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面 ...
- scala入门教程:scala中的面向对象定义类,构造函数,继承
我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面 ...
- Scala函数式对象-有理数
有理数类的表示 实现规范:支持有理数的加减乘除,并支持有理数的规范表示 1.定义Rational 首先,考虑用户如何使用这个类,我们已经决定使用“Immutable”方式来使用Rational对象,我 ...
- Spark记录-Scala类和对象
本章将介绍如何在Scala编程中使用类和对象.类是对象的蓝图(或叫模板).定义一个类后,可以使用关键字new来创建一个类的对象. 通过对象可以使用定义的类的所有功能. 下面的图通过一个包含成员变量(n ...
- Scala学习随笔——深入类和对象
函数化对象(又称方程化对象)指的是所定义的类或对象不包含任何可以修改的状态. 本篇随笔就是着重记录函数化对象.定义了一个有理数类定义的几个不同版本,以介绍 Scala 类定义的几个特性:类参数和构造函 ...
- Spark-2.4.0源码:sparkContext
在看sparkContext之前,先回顾一下Scala的语法.Scala构造函数分主构造和辅构造函数,辅构造函数是关键字def+this定义的,而类中不在方法体也不在辅构造函数中的代码就是主构造函数, ...
- Scala 中 构造函数,重载函数的执行顺序
在调试scala在线开发教程(http://www.imobilebbs.com/wordpress/archives/4911)的过程中看到了以下代码,但是这段代码无论怎么调试都无法成功. abst ...
- scala多个构造函数的定义方法
直接上代码: package com.test.scalaw.test.demo /** * scala定义多个构造函数, * 另外,Scala中有只有一个主要构造函数,其他都是辅助构造函数.而且需要 ...
- scala学习手记12 - 字段、方法和构造函数
在上一节创建了一个scala类,如果没有更多的方法,scala类的定义还可以更简单一些,看一下下面这个CreditCard类的定义: class CreditCard(val number: Int, ...
随机推荐
- mysql 安装版
安装 1.MySQL的安装类型选择: 在“Choose Setup Type”对话框有“Typical”默认安装类型:“complete"完全安装类型:Custom自定义安装类型. 我们选择 ...
- 通过ES6实现的Ajax类
个人学习用途而已,仅供参考. class Ajax { constructor(xhr) { xhr = window.XMLHttpRequest ? new XMLHttpRequest() : ...
- error MSB3552: Resource file "**/*.resx" cannot be found. [/ConsoleApp1.csproj]
问题场景: 练习在docker下操作netcore,镜像为centos7,安装完netcore sdk 2.2后,执行操作: dotnet new consoledotnet run 出现报错: /u ...
- 转:java 委托
委托模式是软件设计模式中的一项基本技巧.在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理.委托模式是一项基本技巧,许多其他的模式,如状态模式.策略模式.访问者模式 ...
- Windows程序设计(Charles Petzold)HELLOWIN程序实现
/*-------------------------------------------------------------- HELLOWIN.C--DisPlays "Hello, W ...
- C++11新特性之十:enable_shared_from_this
enable_shared_from_this是一个模板类,定义于头文件<memory>,其原型为: template< class T > class enable_shar ...
- Git学习文档——文件状态git status
1.已经跟踪的文件有三种状态 已跟踪的文件,即被纳入版本控制的文件,又分为未修改(unmodified).已修改(modified).已暂存(staged)三种状态. 如图: 当在工作目录中新加入一个 ...
- 如何用代码而非事件触发PBO
通常我们通过抛出事件触发PBO,但若没有事件发生时,我们其实也可以用代码强制发出命令. 写法如下: CL_GUI_CFW=>SET_NEW_OK_CODE( NEW_CODE = <uco ...
- Django输入 中文参数保存异常解决方法
WEB页面输入中文后保存,出现异常 cmd.exe打印如下信息: UnicodeEncodeError: 'ascii' codec can't encode characters in po ...
- 使用Message
Message按照定义解释就是topic内容的数据类型, 也称之为topic的格式标准. 1.结构与类型 基本的msg包括bool. int8. int16. int32. int64(以及uint) ...