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...")
		}
	}
}

在这里插入图片描述

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 Student
s.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
	}
}


在这里插入图片描述
欢迎关注,本号将持续分享本人在编程路上的各种见闻。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值