Scala 学习(3)之「类——基本概念1」

小提示:可以通过 :paste进入 Scala 的多行模式,输入对应的代码块之后,按 ctrl+D退出多行模式,然后再调用刚才输入的函数或者方法进行测试

//定义类,包含 field 以及方法

class HelloWorld {

private var name = "0mifang"

def sayHello() {

print("Hello, " + name)

}

def getName = name

}


//创建类对象,并调用其方法

val helloWorld = new HelloWorld

helloWorld.sayHello()

print(helloWorld.getName)//如果定义方法时不带括号,则调用方法时也可以不带括号

getter与setter方法

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

// 小例子

class Student { var name = "0mifang"}


//调用 getter 和 setter 方法,分别叫做 name 和 name_

val mifang = new Student

print(mifang.name)

mifang.name = "mifang_edit"

自定义getter与setter方法

class Student {

private var myName = "omifang"

def name = "your name is " + myName//自定义getter方法

def name_=(newName: String): Unit = { //自定义setter方法,使其无法修改名字

print("you cannot edit your name!!!")

}

}


val student = new Student

print(student.name)

student.name = "0mifang_edit"

仅暴露field的getter方法

如果你不希望 field 有 setter 方法,则可以定义为 val,但是此时就再也不能更改 field 的值了,如果希望能够仅仅暴露出一个 getter 方法,并且还能通过某些方法更改 field 的值,那么需要综合使用 private 以及自定义 getter 方法,此时,由于 field 是 private 的,所以 setter 和 getter 都是 private,对外界没有暴露,自己可以实现修改 field 值的方法,自己可以覆盖 getter 方法。

class Student {

private var myName = "0mifang"

def name = "your name is " + myName//定义getter方法

def updateName(newName:String): Unit = {//定义方法提醒用户无法修改名字

if(newName == "0mifang") myName = newName

else print("not accept this new name!!")

}

}

private[this]

如果将 field 使用 private 来修饰,那么代表这个 field 是类私有的,在类的方法中,可以直接访问类的其他对象的 private field 。这种情况下,如果不希望 field 被其他对象访问到,那么可以使用private[this],意味着对象私有的 field ,只有本对象可以访问到。

class Student {

private[this] var myAge = 0

def age = myAge//定义getter方法

def age_=(newAge: Int): Unit = {//定义setter方法

if(newAge > 0) myAge = newAge

else print("illegal age!!")

}

def older(s:Student): Unit = {//当使用了parivate[this]之后,这个方法就失去了意义

if (myAge > s.myAge) {

print("I'm older than him...")

}

}

}

Scala 学习(3)之「类——基本概念1」

Java风格的getter和setter方法

如果要让 Scala 自动生成 Java 风格的 getter 和 setter 方法,只要给 field 添加 @BeanProperty 注解即可,此时会生成4个方法:

  • name: String
  • name_ = (newValue: String): Unit
  • getName(): String
  • setName(newValue: String): Unit

import scala.beans.BeanProperty

// 方法一

class Student {

@BeanProperty var name: String = _

}


val s = new Students.setName("0mifang")

s.getName()


// 方法二

class Student(@BeanProperty var name: String)

val s = new Student("0mifang")

s.getName()

主constructor

class Student(val name: String, val age: Int): Unit = {

println("your name is " + name + ", your age is " + age)

}//主 constructor 中还可以通过使用默认参数,来给参数默认的值


class Student(val name: String = "0mifang", val age: Int = 18): Unit = {

println("your name is " + name + ", your age is " + age)

}

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

辅助constructor

辅助 constructor 之间可以互相调用,但是必须第一行调用主 constructor

class Student {

private var name = ""

private var age = 0

def this(name: String) {

this()//调用父类的constructor

this.name = name

}

def this(name: String, age: Int) {

this(name)//调用上面定义的辅助constructor

this.age = age

}

}


欢迎关注,本号将持续分享本人在编程路上的各种见闻。


分享到:


相關文章: