Scala类的构造器与访问器

原创 2015年12月16日 19:59:17

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类中,有一个主构造器,但可以有任意个辅助构造器。并且,辅助构造器有两个特点:

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

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中如何定义类scala中定义类的方式很简单class Point(xc:Int,yc:Int)上面这行代码就定义了一个类 1.首先是关键字class 2.其后是类名 Point 3...
  • bitcarmanlee
  • bitcarmanlee
  • 2016年11月09日 23:52
  • 3142

scala学习笔记06--主从构造器

在Scala中,有两种构造器,主构造器(primary constructor)和从构造器(auxiliary constructor)。 主要点都夹杂在代码注释中,留存。 /* 构造器 */...
  • laiwenqiang
  • laiwenqiang
  • 2014年12月11日 14:53
  • 4300

Scala类的构造器与访问器

转载:http://lib.csdn.net/article/scala/26229 1.构造器 在Scala中,每个类都有一个主构造器。主构造器与类的定义交织在一起,如下...
  • zhangxinrun
  • zhangxinrun
  • 2017年01月20日 19:26
  • 199

关于Scala子类继承父类属性的问题释疑---子类构造器参数不要与父类属性同名

今天和朋友聊到scala继承的时候,发现有一些问题,我
  • zl3450341
  • zl3450341
  • 2014年06月16日 19:21
  • 3061

Scala类的定义,主/辅构造器,以及方法中的变量定义,单例对象,伴生对象,Apply方法调用,应用程序对象

1. 类1.1. 类的定义package cn.toto.scala.day2/** * 在Scala中,类并不用声明为public类型的。 * Scala源文件中可以包含多个类,所有这些类都...
  • toto1297488504
  • toto1297488504
  • 2017年06月29日 13:58
  • 686

JAVA经典继承与父类调用 geter、seter访问器 构造器

  • 2009年07月29日 19:21
  • 1KB
  • 下载

Scala多重继承、多重继承构造器执行顺序及AOP实现

1.构造顺序是从左往右构造的   虽然TTeacher的父类是human 但是不回重复构造   2.匿名类    下面这段代码必须实现teach方法否则不能构造出来 3.如果...
  • u013221860
  • u013221860
  • 2015年07月09日 15:40
  • 194

Scala 之构造器(六)

Scala 有主构造器与辅助构造器之分,辅助构造器可以有多个,用this关键字修饰。 每个辅助构造器都必须调用一个此前已经定义的辅助构造器或主构造器。 主构造器的声明必须得放在类名后面。 packag...
  • u013850277
  • u013850277
  • 2017年12月06日 10:28
  • 14

Scala-隐式转换-私有函数-重载-构造器

Scala-隐式转换-私有函数-重载-构造器
  • u011317245
  • u011317245
  • 2017年02月19日 17:57
  • 166

java类查找(属性、方法、构造器)

  • 2008年06月19日 16:22
  • 11KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Scala类的构造器与访问器
举报原因:
原因补充:

(最多只允许输入30个字)