目录
1.类的声明
包含类的对象
包含类的方法
例子:
class HelloWorld {
private var name = "leo"
def sayHello() { print("Hello, " + name) }
def getName = name
}
2.类的对象的封装
(1)类的属性的限定方式:
var:并提供public的getter和setter方法
val:则只会生成getter方法
private:则生成的getter和setter也是private的
private[this]:没有getter,setter方法,只能在类的内部使用属性,与方法隔绝
(2)getter,setter 对象的自动生成
getter,setter的使用: 直接 “ . ” + 属性名称
class Student {
var myName = "leo"
}
例子:
// 调用getter和setter方法,分别叫做 myName 和 myName_ =
val leo = new Student
print(leo.myName)
leo.myName = "leo1"
(3)自定义setter,getter (注意setter方法的调用比较特别 使用 “=” 来进行参数的传递)
class Student {
private var myName = "leo"
def name = "your name is " + myName
def name_=(newValue: String) {
myName = newValue
print("you edit your name!")
}
}
val leo = new Student
print(leo.name) //调用 getter
leo.name = "leo1" // 调用 setter 这种模式儿,相当于调用了 name_ 方法
特点: setter 的声明
setter 的调用
(4)自定义函数,来替代它本身的 setter,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
}
(5)不希望 field 被其他对象访问:(只能当前类的对象使用** 理解)
例子:
class Student {
private[this] var myAge = 0
def age_=(newValue: Int) {
if (newValue > 0) myAge = newValue
else print("illegal age!")
}
def age = myAge
def older(s: Student) = {
myAge > s.myAge
}
报错:
error: value myAges is not a member of Students
myAges > s.myAge —— 报错
(6)生成与java相同风格的 getter , setter
结果: 此时会生成4个方法,name: String、name_=(newValue: String): Unit、getName(): String、setName(newValue: String): Unit
例子:
import scala.reflect.BeanProperty
class Student {
@BeanProperty var name: String = _
}
class Student(@BeanProperty var name: String)
val s = new Student
s.setName("leo")
s.getName()
3.构造函数
(1)辅助构造函数:
本质:对主构造函数的重载
格式:必须第一行调用主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
}
}
(2)主构造函数:
定义方式:主constructor是与类名放在一起的
class Student(val name: String, val age: Int) {
println("your name is " + name + ", your age is " + age)
}
使用默认参数:
class Student(val name: String = "leo", val age: Int = 30) {
println("your name is " + name + ", your age is " + age)
}
(3)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
error: type mismatch (类型不匹配)
结论:scala 中的类型归属划分更加严格
内部类的类型会与父类进行绑定