Scala 类 (四)

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
  }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值