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. Puppet报错汇总

    报错1: 解决:该报错是由于Puppet agent 的时间和Puppet master的时间不一致导致,可以使用ntp同步一下时间即可解决 报错2: 启动mcollective的时候报错 解决:ge ...

  2. Http 调用netty 服务,服务调用客户端,伪同步响应.ProtoBuf 解决粘包,半包问题.

    实际情况是: 公司需要开发一个接口给新产品使用,需求如下 1.有一款硬件设备,客户用usb接上电脑就可以,但是此设备功能比较单一,所以开发一个服务器程序,辅助此设备业务功能 2.解决方案,使用Sock ...

  3. vue项目打包后一片空白及资源引入的路径报错解决办法

    网上很多说自己的VUE项目通过Webpack打包生成的list文件,放到HBulider打包后,通过手机打开一片空白.这个主要原因是路径的问题. 1.记得改一下config下面的index.js中bu ...

  4. 删除一个cjson导致系统死机

    一个未使用,未分配的cjson指针应该被删除,如果尝试删除一个 未分配,未启用的cjson将导致内存出错,死机.

  5. SMB服务简介

      1.Samba简介 Samba是种自由软件,用来让UNIX系列的操作系统与微软Windows操作系统的SMB/CIFS(Server Message Block/Common Internet F ...

  6. 【单调栈】hdu 6319 杭电多校Problem A. Ascending Rating

    http://acm.hdu.edu.cn/showproblem.php?pid=6319 从后往前更新,维护一个递减单调栈(队列) 最近很多题都是单调栈... #define _CRT_SECUR ...

  7. 【模板】HDU 1541 树状数组

    http://acm.hdu.edu.cn/showproblem.php?pid=1541 题意:给你一堆点,每个点右一个level,为其右下方所有点的数量之和,求各个level包含的点数. 题解: ...

  8. 生成树协议(STP)

    首先了解一下环路问题: 两个交换机将两个局域网同时连接起来的时候,不幸地出现了环路: 这两个交换机还是都能够收到广播包的.交换机 A 一开始是不知道机器 2 在哪个局域网的,所以它会把广播消息放到局域 ...

  9. nvm npm node

    npm init/install 语义版本号分为X.Y.Z三位,分别代表主版本号.次版本号和补丁版本号.当代码变更时,版本号按以下原则更新. 如果只是修复bug,需要更新Z位. 如果是新增了功能,但是 ...

  10. [DPI][suricata] suricata-4.0.3 安装部署

    suricata 很值得借鉴.但是首先还是要安装使用,作为第一步的熟悉. 安装文档:https://redmine.openinfosecfoundation.org/projects/suricat ...