1.定义类:

class HelloWorld {
  private var name = "leo"
  def sayHello() { print("Hello, " + name) }  
  def getName = name
}

创建类的对象,调用其方法:
val helloWorld = new HelloWorld
helloWorld.sayHello() //也可以不加括号
print(helloWorld.getName) // 定义方法时不带括号,则调用方法时也不能带括号

2.getter与setter
a. 定义不带private的var field,此时scala生成的面向JVM的类时,会定义为private的name字段,并提供public的getter和setter方法
b. 而如果使用private修饰field,则生成的getter和setter也是private的
c. 如果定义val field,则只会生成getter方法
d. 如果不希望生成setter和getter方法,则将field声明为private[this]
例:

class Student {
  var name = "leo"
}

// 调用getter和setter方法,分别叫做name和name_ =
val leo = new Student
print(leo.name)
leo.name = "leo1" //会调用name_=这个setter方法,注意=左右不能有空格

3.自定义getter与setter
如果只是希望拥有简单的getter和setter方法,那么就按照scala提供的语法规则,根据需求为field选择合适的修饰符就好:var、val、private、private[this]。
但是如果希望能够自己对getter与setter进行控制,则可以自定义getter与setter方法。
例:

class Student {
  private var myName = "leo"
  def name = "your name is " + myName   //自定义getter
  def name_=(newValue: String)  {      //自定义setter
    print("you cannot edit your name!!!")
  }
}
//调用
val leo = new Student
print(leo.name)
leo.name = "leo1"  //会调用setter方法,name_=
  1. 仅暴露field的getter方法
    如果不希望field有setter方法,则可以定义为val,但是此时就再也不能更改field的值了,因为val变量不能被更改。
    如果希望能够仅仅暴露出一个getter方法,并且还能通过某些方法更改field的值,那么需要综合使用private以及自定义getter方法。
    field是private的,则setter和getter都是private,对外界没有暴露;自己可以实现修改field值的方法;自己可以覆盖getter方法对外界暴露。
class Student {
  private var myName = "leo"

  def updateName(newName: String) { 
    if(newName == "leo1") myName = newName 
    else print("not accept this new name!!!")
  }

  def name = "your name is " + myName   //自定义getter,对外暴露
}

5.private[this]
隔离级别最高,对象私有。
如果将field使用private来修饰,那么代表这个field是类私有的,在类的方法中,可以直接访问类的其他对象的private field。
如果不希望field被其他对象访问到,那么可以使用private[this],意味着对象私有的field,只有本对象内可以访问到。
6.辅助constructor
Scala中,可以给类定义多个辅助constructor,类似于java中的构造函数重载。
辅助constructor之间可以互相调用,而且必须第一行调用主constructor。

class Student {
  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
  }
}
  1. 主constructor
    Scala中,主constructor是与类名放在一起的,与java不同。而且类中,没有定义在任何方法或者是代码块之中的代码,就是主constructor的代码。
class Student(val name: String, val age: Int) {
  println("your name is " + name + ", your age is " + age)
}

主constructor中还可以通过使用默认参数,来给参数默认的值,如下:

class Student(val name: String = "leo", val age: Int = 30) {
  println("your name is " + name + ", your age is " + age)
}

如果主constrcutor传入的参数什么修饰都没有,比如name: String,那么如果类内部的方法使用到了这个变量,则它会被声明为private[this] name;否则,就只能被constructor代码使用而已,不会被声明为类的field。

  1. 内部类
    Scala中,同样可以在类中定义内部类;但是与java不同的是,每个外部类的对象的内部类,都是不同的类。
import scala.collection.mutable.ArrayBuffer
class Class {
  class Student(val name: String) {}
  val students = new ArrayBuffer[Student]
  def getStudent(name: String) =  {
    new Student(name)
  }
}

val c1 = new Class
val s1 = c1.getStudent("leo")
c1.students += s1

val c2 = new Class
val s2 = c2.getStudent("leo")
c1.students += s2 //此处会报type mismatch,因为s2是c2.Student类型

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容

  • Overview 类在面向对象编程中是一个最基本的概念。类是对象的模板,用于产生具有相同结构的对象。一个类通常由属...
    bookislife阅读 923评论 0 0
  • Kotlin 类和对象类定义Kotlin 类可以包含:构造函数和初始化代码块、函数、属性、内部类、对象声明。Kot...
    Green_Apple阅读 361评论 0 0
  • 1 我们的生活是怎样的?诗与远方,诗意般的栖居,是一种望梅止渴的奢望,确切地说,是在吃穿住用的层面上奔命。 参加工...
    晴鹤1阅读 310评论 1 5
  • 村长不见啦!美羊羊在羊村实验室门口叫道!此时已经是傍晚时分了。喜羊羊他们听到叫喊声立刻跑了过来。大家各自说出自己的...
    文坛小生阅读 776评论 7 3