- 概念
把数据和对数据的操作进行封装在一起,只能通过被授权的操作才能对数据进行操作;
scala的public属性,底层是private,为此不建议直接将属性设置为private;
有时候为了和java相互调用进行交互,而java框架都是利用反射调用get和set方法,为此scala中在属性上增加@BeabProperty;
- 访问权限
scala中属性和方法默认为public,但是并无public关键字,private只有在类的内部和伴生对象中使用;
protected同类和子类可以访问,同包不能访问;
private修饰的包名增加了包的访问权限,包名其他类可以使用;
package com.byxrs.chapter06
object Test_ClassForAccess {
}
class Person{
private var idCord :String = "123"
protected var name :String = "123"
var sex :String = "female"
private[chapter06] var age :Int = 18
def printlnPersonInfo() ={
println(s"Person: $idCord $name $sex $age")
}
}
package com.byxrs.chapter06
object Test_Access {
def main(args: Array[String]): Unit = {
val person = new Person
//idCard不能访问
//name不能访问,因为protected只能在当前类以及子类中才能访问
println(person.age)
println(person.sex)
person.printlnPersonInfo()
val worker = new Worker
worker.printlnPersonInfo()
}
}
class Worker extends Person{
override def printlnPersonInfo(): Unit = {
println("Worker:")
//idCard不能访问
name = "kitty" //protected同类和子类可以访问,同包不能访问
age = 50
sex = "male"
println(s"Person: $name $sex $age")
}
}
运行结果:
18
female
Person: 123 123 female 18
Worker:
Person: kitty male 50
- 构造器
包含主构造器和辅助构造器 this,主构造器只能有一个,辅助构造器可以有多个。
注:辅助构造器不能创建对象,只能直接或者间接的调用主构造器来创建对象;
构造器可以调用其他的构造器,但是要求被调用的构造器提前声明才能调用;
class 类名(形参列表) { // 主构造器
// 类体
def this(形参列表) { // 辅助构造器
}
def this(形参列表) { //辅助构造器可以有多个...
}
}
//1. 辅助构造器 函数的名称 this, 可以有多个,编译器通过不同参数来区分
- 构造器参数
主构造器参数包含:没用修饰符,var修饰符,val修饰符;
package com.byxrs.chapter06
object Test6_ConstructorParams {
def main(args: Array[String]): Unit = {
val student2 = new Student2
println(s"student2:name=${student2.name},age=${student2.age}")
student2.name = "tom"
student2.age = 18
println(s"student2-1:name=${student2.name},age=${student2.age}")
val student3 = new Student3("kitty", 35)
println(s"student3:name=${student3.name},age=${student3.age}")
val student4 = new Student4("joy", 20)
//报错,student4.name无法通过该方式获取值
// println(s"student4:name=${student4.name},age=${student4.age}")
//解决办法就是在类中写方法
student4.getInfo()
val student5 = new Student5("poty", 30)
println(s"student5:name=${student5.name},age=${student5.age}")
//报错,val不能修改值
// student5.age = 31
val student6 = new Student6("amy", 16, "清华学院")
println(s"student6:name=${student6.name},age=${student6.age},age=${student6.school}")
}
}
//无参构造器,()可省略
class Student2 {
var name: String = _
var age: Int = _
}
//主构造器带参,{ }可省略,scala推荐使用这样的方式。可以完成java三大步骤
// 1.定义参数,2.将参数传入构造器,3.并赋值如this.name = name
class Student3(var name: String, var age: Int)
//主构造器参数无修饰符
class Student4(name: String, age: Int) {
def getInfo(): Unit = {
println(s"student4:name=$name,age=$age")
}
}
//val修饰的参数不能更改,这样的写法不常用
class Student5(val name: String, val age: Int)
class Student6(var name: String, var age: Int) {
var school: String = _
def this(name: String, age: Int, school: String) {
this(name, age)
this.school = school
}
def getInfo(): Unit = {
println(s"student6:name=$name,age=$age,school=$school")
}
}
运行结果:
student2:name=null,age=0
student2-1:name=tom,age=18
student3:name=kitty,age=35
student4:name=joy,age=20
student5:name=poty,age=30
student6:name=amy,age=16,age=清华学院