scala类
定义字段有两个关键字,val和var。val修饰的字段,相当于常量,只有get,没有set;var修饰的字段,既有get,又有set。
伴生对象和伴生类:在同一个scala的类文件中,如果一个class和object名字一样的类,那么class是object的伴生类,object是class的伴生对象。
被private[包名] 修饰的类,只能在该包下可以访问,包外不能访问。被private修饰的字段,只能在本类和伴生对象中访问。被private[this] 修饰的字段,只能在本类中访问,伴生对象中也不能访问。
package clazz
//被private[clazz] 修饰的类,只能在clazz包下访问,包外不能访问
private[clazz] class ClassDemo {
//val 修饰的字段,只有get,没有set
val name: String = "小明"
//var 修饰的字段,既有get,又有set
var age: Int = 20
//被private修饰的字段,只能在本类和伴生对象中访问
private var sex: String = "男"
//被private[this] 修饰的字段,只能在本类中访问,伴生对象不能访问
private[this] var tel: String = "188***"
//提供get和set供外面赋值
def get() = {
this.tel
}
def set(tel: String) = {
if (tel.length == 11) {
this.tel = tel
} else {
println("电话号码错误")
}
}
}
object ClassDemo {
//创建对象
val o1 = new ClassDemo
o1.sex = "女"
}
scala中构造器
分为两种:
1、主构造器:与类名交织在一起,一个类只能定义一个主构造器。
定义格式:class 类名(主构造器参数) { }
主构造器参数会成为类的字段。在主构造器参数中,没有被任何关键字修饰的字段,默认被标注为private[this],只能在本类中访问,其他任何地方都不能访问。
主构造器的代码:不包含在任何方法中的代码
2、辅助构造器:可以定义多个,但是辅助构造器的第一行代码必须是调用主构造器
定义格式:def this( 构造器参数) { }
【注意】:创建对象时,一定是主构造器代码先执行
package clazz
//class ClassDemo_02(var name: String, var age: Int,sex:String),sex字段会被标注为private[this],只能在本类中访问,其他任何地方都不能访问
class ClassDemo_02(var name: String, var age: Int) {
println("这是主构造器的代码")
var sex: String = null
var add: String = null
//定义一个辅助构造器
def this(name: String, age: Int, sex: String) {
//辅助构造器的第一行代码必须是调用主构造器
this(name, age)
this.sex = sex
println("sex=" + sex)
}
//可以定义多个辅助构造器
def this(name: String, age: Int, sex: String, add: String) {
this(name, age, sex)
this.add = add
println("add=" + add)
}
println(s"ClassDemo_02($name,$age,$sex,$add)")
println("主构造器代码先执行!!!")
}
object ClassDemo_02 {
def main(args: Array[String]): Unit = {
val o2 = new ClassDemo_02("小明", 12, "男", "北京")
println("================")
val o3 = new ClassDemo_02("小明", 12)
}
}
运行结果:
这是主构造器的代码
ClassDemo_02(小明,12,null,null)
主构造器代码先执行!!!
sex=男
add=北京
================
这是主构造器的代码
ClassDemo_02(小明,12,null,null)
主构造器代码先执行!!!