1.构造器

在Scala中,每个类都有一个主构造器。主构造器与类的定义交织在一起,如下:

class Person (
private var _name: String,
private var _age: Int)

主构造器会执行类定义中的所有语句。如下,println语句是主构造器的一部分,当类被实例化时,println语句会立即执行。

class Person private(
private var _name: String,
private var _age: Int){ println("This class is Person")
}

通过把private修饰符添加在类参数列表的前边把主构造器隐藏起来。如:

class Person private(
private var _name: String,
private var _age: Int)

这样客户代码将不能调用Person类的主构造器,如果需要设置主构造器中的参数,有两种方案:一是添加辅助构造器,二是用伴生对象的apply工厂方法。
辅助构造器
在Scala类中,有一个主构造器,但可以有任意个辅助构造器。并且,辅助构造器有两个特点:

辅助构造器的名称是this;
每个辅助构造器都必须以一个对先前已定义的其他辅助构造器或主构造器的调用开始。
辅助构造器如下定义:

def this(age: Int) = this("xx", age)

伴生对象的apply工厂方法
在存放这个类的同一个源文件中,定义它的伴生对象。伴生对象与类具有相同的访问权限,因此,即使Person类的构造器是私有的,对象Person的apply方法也可以创建新的Person对象。如:

object Person{
def apply[T](name: String, age: Int) = new Person(name, age)
}

注意:辅助构造器只能访问主构造里定义的变量,而不能访问类里定义的变量。
2.访问器
和Java一样,Scala也有setter和getter访问器。在Scala里,对象的每个非私有的var类型成员变量都隐含定义了setter和getter方法。但是setter和getter方法的命名方式并没有沿袭Java的约定。在Scala中,var变量x的getter方法命名为“y”,setter方法命名为“y_=”(一般情况下,为了代码的可读性,y和x是一样的)。如:

class Person {

  private var _name: String = _
private[this] var _age: Int = _
//类里定义的变量,不能用构造器初始化。
private var _address: String = _ //getter
def name: String = _name
//setter
def name_= (name: String): Unit = {
_name = name
} //getter
def age: Int = _age
//setter
def age_= (age: Int): Unit = {
_age = age
}
}

另外,setter和getter访问器不仅可以访问类里面定义的var变量,而且还可以访问主构造器里的var变量,而且getter方法既可以访问var变量,也可以访问val变量(因为val变量不可变,所以没有setter)。如:

class Person private(
private var _name: String,
private var _age: Int){ //类里定义的变量,不能用构造器初始化。
private var _address: String = _ def this(age: Int) = this("xx", age) //getter
def name: String = _name
//setter
def name_= (name: String): Unit = {
_name = name
} //getter
def age: Int = _age
//setter
def age_= (age: Int): Unit = {
_age = age
} //getter
def address: String = _address
//setter
def address_= (address: String): Unit = {
_address = address
}
}

注意:getter和setter方法获取了原var变量的可见性。如var变量定义为public,则其getter和setter也是public;var变量定义为protected,则其getter和setter也是protected。

Scala类的构造器与访问器的更多相关文章

  1. Scala类与对象

    类简介 简介 类是对象的蓝图.一旦你定义了类,就可以用关键字new根据类的蓝图创建对象.在类的定义里,可以放置字段和方法,这些被笼统地称为成员.对于字段,不管是val还是var定义的,都是指向对象的变 ...

  2. Scala基础:类和构造器

    类 package com.zy.scala.cls /** * 在 Scala 中,类并不用声明为 public 类型的. * Scala 源文件中可以包含多个类,所有这些类都具有共有可见性. */ ...

  3. accessor mothod mutator mothod 更改器方法 访问器方法 类的方法可以访问类的任何一个对象的私有域!

    LocalDate.plusDate String.toUpperCase GregorianCalendar.add import java.time.*; public class Calenda ...

  4. 第2节 Scala中面向对象编程:1、类的定义;2、类的构造器;3、object和伴生对象;4、apply和main方法

    6.    类.对象.继承.特质 Scala的类与Java.C++的类比起来更简洁,学完之后你会更爱Scala!!! 6.1.   类 6.1.1.    类的定义 package cn.itcast ...

  5. WorldWind源码剖析系列:地形访问器类TerrainAccessor

    地形访问器类TerrainAccessor 地形访问器类TerrainAccessor提供了对地形(高程)Terrain (elevation)访问的各种接口interface,是NltTerrain ...

  6. 24 JavaScript对象访问器&JavaScript对象构造器

    ES5引入了Getter和Setter Getter和Setter允许定义对象访问器 JavaScript Getter(get关键字):获取对象属性 <script> var perso ...

  7. JavaScript对象的两类属性(数据属性与访问器属性)

    对JavaScript来说,属性并非只是简单的名称和值,JavaScript用一组特征(attribute)来描述属性 (property). 第一类属性数据属性具有四个特征. value:就是属性的 ...

  8. Scala 类和对象

    Scala class: Scala 源文件中可以有很多类(class),这些类默认都是Public的,public是Scala的默认访问级别.在Scala中,声明一个未用priavate修饰的字段 ...

  9. Spark记录-Scala类和对象

    本章将介绍如何在Scala编程中使用类和对象.类是对象的蓝图(或叫模板).定义一个类后,可以使用关键字new来创建一个类的对象. 通过对象可以使用定义的类的所有功能. 下面的图通过一个包含成员变量(n ...

随机推荐

  1. TIScript 代码Demo

    var filelist = null; function alert(msg) { view.msgbox(null,msg); } self.on("click", " ...

  2. 10.24CRM完成

    2018-10-24 16:16:59 已经完成了crm项目: 项目做完了,这几天可以安静整理Django啦!!!把博客整理一下! 然后再过几天针就可以回学校啦!! 今天程序员节  节日快乐!hell ...

  3. Android定时执行和停止某任务

    一.定义全局变量 int runCount = 0;// 全局变量,用于判断是否是第一次执行 Handler handlerCount = new Handler(); 二.创建Runnable Ru ...

  4. node-sass 安装

    设置 export ELECTRON_MIRROR="https://npm.taobao.org/mirrors/electron/" export SASS_BINARY_SI ...

  5. day11 十一、函数对象,名称空间,作用域,和闭包

    一.函数对象 1.函数对象:函数名存放的就是函数的地址,所以函数名也是对象,称之为函数对象 a = 10 print(a,id(a)) def fn(): num = 10 print('fn fuc ...

  6. 怎么关闭win10防火墙

    reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender" /v "Disable ...

  7. C#网页采集数据的几种方式(WebClient、WebBrowser和HttpWebRequest/HttpWebResponse)

    一.通过WebClient获取网页内容 这是一种很简单的获取方式,当然,其它的获取方法也很简单.在这里首先要说明的是,如果为了实际项目的效率考虑,需要考虑在函数中分配一个内存区域.大概写法如下 //M ...

  8. SQL中的Continue和Break

    x 在Sql Server中,sql语句包含While循环的时候,肯定都或多或少的用到Continue和Break... 下面撸了一个小Demo , Begin ),@Index) Begin Pri ...

  9. Hive之变量和属性

    首先看一下hive cli工具对于变量的定义规定的几项功能: $ bin/hive -h usage: hive -d,--define <key=value>          Vari ...

  10. [Day2]变量、数据类型转换以及运算符

    1.变量 变量是内存中装载数据的小盒子,你只能用它来存取数据 2.计算机存储单元 (1)计算机存储设备的最小信息单元叫“位(bit)”,“比特位” (2)8个比特位表示一个数据,是计算机的最小存储单元 ...