Scala class
类是对象的模板,对于一个类中包含了属性和方法;scala 的类和Java的类很相似,所有的类
- 类中的字段自动带getter 和 setter 方法
- 你可以用定制的 getter/setter 方法替换掉字段的定义,而不用修改使用类的客户端(统一访问原则)
- 用@BeanProperty注解来生成JavaBeans的get/set方法
- 每个类都有一个主要的构造器,这个构造器和类定义“交织”在一起。它的参数直接成为类的字段。主构造器执行类体中的所有语句
- 辅助构造器是可选的。他们都叫做this
类的定义
在Scala中,类不能定义为
public
Scala源文件可以包含多个类,所以的这些类都具有公开可见性。
package classes
/**
* 创建一个User类
* 类中的属性都需要有默认值
* 翻编译后有get/set方法
*/
class User {
var name: String = _
var age: Int = _
val school: String = "五道口职业技术学院"
private var pwd: String = "pwdpwd"
override def toString = s"User($name, $age, $school, $pwd)"
}
// 或
class User
类的使用
对象.属性名就可以获取值,实际上是调用了属性() 方法,()可以省略不写
一般情况下推荐 取值时候 对象.属性名 改值的时候使用对象.属性名()
package classes
object TestUser {
def main(args: Array[String]): Unit = {
var user = new User()
user.age = 18
user.name = "张三"
// println(user.pwd) //Error 被private 修饰后的属性get/set方法会被私有
println(user.name)
println(user)
}
}
原理剖析
使用jd-gui-1.6.5.jar工具反编译查看
win10下双击无法运行参考
- Scala的属性读写本质上是方法的操作,class文件中自动创建出了以属性名命名的get、set方法
- Scala中的var或者val声明修饰的 属性都是私有成员
- 属性=_ 自动赋予初始值
- val修饰的成员 只有getter方法,而没有Setter方法(反编译后可以看到属性被final 常量 一旦赋值不可改变)
- var 修饰的成员自动提供Getter /Setter 方法
- private 访问修饰符修饰var /val时,Geter/Setter 方法自动变为私有方法,仅限本类使用
@BeanProperty
自动生成Java和Scala风格的Getter/Setter方法,兼容Java系统
package classes
import scala.beans.BeanProperty
class Person {
@BeanProperty var name: String = _
@BeanProperty var age: Int = _
}
//---------------------------------------------------------------
package classes
object PersonTest {
def main(args: Array[String]): Unit = {
val person = new Person
person.setName("zs")
println(person.getName)
person.name = "ls"
println(person.name)
}
}
手动覆盖getter/setter方法
了解即可
package classes
class Dog {
var color: String = _
// 手动覆盖scala风格的getter/setter方法
// getter方法
// getter方法 ----> def 区分成员名() = 成员值
def getColor() = color
// setter方法 ----> def 区分成员名_(形参) {成员值 = 形参值}
def setColor_(newColor: String) = color = newColor
}
//-------------------------------------------------------------
package classes
object DogTest {
def main(args: Array[String]): Unit = {
val dog = new Dog
dog.setColor_("black")
println(dog.getColor)
}
}
类的方法
定义
和函数声明一致
package classes
class Car {
var owner: String = _
// 方法定义
def sayHi(): String = "Hello:" + owner
// 方法重载(形参个数、顺序、类型)
def sayHi(str: String): String = str + ":" + owner
// def sayHi(str: String, age: Long): String = str + ":" + owner
// def sayHi(age: Long, str: String): String = str + ":" + owner
// 方法覆盖
override def toString: String = this.owner + "\t"
}
辅助构造器
类似于Java重载的构造方法
注意:
- scala的一个类中,可以有一个主构造器和若干个辅助构造器
- 辅助构造器声明时,方法名使用
this
作为关键字- 辅助构造器的代码块中,第一行必须以调用一个主构造器或者辅助构造器作为开始
package classes
class Animal {
var name: String = _
// 默认 提供无参的主构造器
var age: Int = _
// 声明辅助构造器
def this(name: String) {
this()
this.name = name
}
def this(name: String, age: Int) {
this(name)
this.age = age
}
}
//------------------------------------------------------------
package classes
object AnimalTest {
def main(args: Array[String]): Unit = {
// 调用无参的主构造器
val a1 = new Animal
val a2 = new Animal("dog")
val a3 = new Animal("dog",5)
println(a1)
println(a2)
println(a3)
}
}
主构造器
说明:
- scala默认提供一个无参的主构造器,也可以自定义主构造器
- scala主构造器范围是整个类
{// 主构造器的内容}
- 手动指定了主构造器,则不会提供无参的主构造器
package classes
// 主构造器: 在类名后直接写主构造器的参数列表
class Fish(var name: String, var age: Int) {
println("init")
// 声明属性 不会立即执行
var sex: Boolean = _
var color:String = _
def this(color:String){
this("鲫鱼",1)
this.color = color
}
// 声明方法
def sayHi() = {}
println("end")
}
//------------------------------------------------------
package classes
object FishTest {
def main(args: Array[String]): Unit = {
// 使用
val fish1 = new Fish("金鱼",1)
val fish2 = new Fish("金鱼",1)
var fish3 = new Fish("red")
}
}
主构造器参数列表的变化
- 如果没有var或者val修饰,color不会作为类的成员,只会出现在构造方法中
- 只有在这个类中方法使用到color成员时,color才会作为类的成员
- 作为类的私有常量,仅仅只能在类的内部使用
package classes
class Panda(
var name: String,
val sex: Boolean,
private var age: Int,
color: String) { // 如果没有var或者val修饰,color不会作为类的成员,只会出现在构造方法中
// 只有在这个类中方法使用到color成员时,color才会作为类的成员
// 作为类的私有常量,仅仅只能在类的内部使用
def sayHi() = {
"我的颜色是:" + color
}
}