第三课 类和属性

来源:互联网 发布:蜜桃影院源码免费 编辑:程序博客网 时间:2024/06/16 02:18

scala 的主构造函数包括:

构造函数参数

类内部被调的方法

在类内部执行的表达式和语句


class Person(var firstName: String, var lastName: String) {  //构造函数一部分  println("the constructor begin")  private val HOME = System.getProperty("user.home")  var age = 0  override def toString: String = s"$firstName $lastName is $age old"  def printHOME(): Unit ={    println(s"HOME = $HOME")  }  def printFullName(): Unit ={    println(this)  }  //构造函数一部分  printHOME()  printFullName()  println("still in the constructor")}object Person extends App {  val p = new Person("hello", "world")}

  • 控制构造函数的可见性

在scala中构造函数的参数可见性被该字段是否被定义为val和var或者没有val,var的情况下是否被private关键字修饰所控制。

1. 如果一个字段被声明为var,scala为其生成getter和setter方法

2. 如果一个字段是val,scala为其生成getter方法

3. 如果一个字段没有val和var,scala不会为其生成getter和setter方法

4. val和var字段可以被private关键字修饰,防止生成getter和setter方法


var字段

class Person(var name: String) {}object Person extends App{  val p = new Person("wl")  //setter  p.name = "aa"  //getter  println(p.name)}

val字段

class Person(val name: String) {}object Person extends App{  val p = new Person("wl")  //setter//  p.name = "aa" 报错  //getter  println(p.name)}

没有var和val字段

class Person(name: String) {}object Person extends App{  val p = new Person("wl")  //setter//  p.name = "aa" 报错  //getter//  println(p.name) 报错}

给var和val加上private修饰

class Person(private var name: String) {  def getName() = {    this.name  }}object Person1 extends App{  val p = new Person("wl")  //setter//  p.name = "aa"  //getter//  println(p.name)  println(p.getName())}





  • case 类构造函数参数默认val

case class Person(name: String) 

  val p = new Person("wl")  //setter//  p.name = "aa"  //getter
 //name默认为val的,有getter方法
println(p.name)
  • 定义辅助构造函数
定义多个辅助构造函数,让用户通过不同方式创建对象实例
//primary constructorclass Pizza(var crustSize: Int, var crustType: String) {  def this(crustSize: Int) = {    this(crustSize, Pizza.DEFAULT_CRUST_TYPE)  }  def this(crustType: String) = {    this(Pizza.DEFAULT_CRUST_SIZE, crustType)  }  def this()={    this(Pizza.DEFAULT_CRUST_SIZE, Pizza.DEFAULT_CRUST_TYPE)  }
override def toString: String = s"Pizza crustSize: $crustSize, crustType: $crustType"
}object Pizza { val DEFAULT_CRUST_SIZE = 12 val DEFAULT_CRUST_TYPE = "THIN" def main(args: Array[String]): Unit = { val p1 = new Pizza() val p2 = new Pizza(12) val p3 = new Pizza("ll") val p4 = new Pizza(23, "aa")
    println(p1 +", "+p2 + ", "+ p3+", "+p4)
}}

  • 为case类生成辅助构造函数
case class Person(var name: String, var age:Int) {  def getName() = {    this.name  }}object Person {  def apply() = {    new Person("no name", 0)  }  def apply(name: String) = {    new Person(name, 0)  }
}
object CaseClassTest extends App{  val p = Person()  println(p.name + " : " + p.age)}

  • 定义私有主构造函数
为了使用单例,需要建私有主
class Brain private {  override def toString: String = "this is a brain"}object Brain {  val brain = new Brain  def getInstance = brain}object SingletonTest extends App {  val bran = Brain.getInstance  println(bran)}
在伴生对象中任意方法将会变成该对象的静态方法
  • 设置构造函数参数的默认值
class Socket(val timeOut: Int = 10000, val linger: Int = 2000) {}object Socket extends App {  val s = new Socket()  println(s.timeOut)  val s1 = new Socket(5000)  println(s1.timeOut)  val s2 = new Socket(timeOut = 2000)  println(s2.timeOut)  val s3 = new Socket(linger = 200)  println(s3.timeOut+":"+s3.linger)}

  • 覆写默认的getter和setter方法
  • 将代码块或函数赋值给字段
case class Person(var username: String, var password: String) {  var age = 0  var firstname = ""  var lastname = ""  var address = None: Option[Address]}case class Address(city: String, state: String, zip: String)
  • 在继承类时处理构造函数参数

基类构造函数参数定义var或val,当定义一个子类时不要用var,val声明类间公用字段。在子类中用var或val定义新的构造函数参数。
case class Address(city: String, state: String, zip: String)class Person(var name: String, var address: Address){}class Emplyee(name: String, address: Address, var age:Int) extends Person(name , address){}

  • 调用父类构造函数
class Animal(var name: String, var age: Int){  def this(name: String){    this(name, 0)  }}class Dog(name: String) extends Animal(name){}class Dog1(name: String) extends Animal(name, 0){}