Scala学习笔记--第7章 类(一)

7.1 类的定义

在Scala中,类并不声明为public。Scala源文件中可以包含多个类,所有这些类都具有public可见性。使用Scala类需要做的就是构造对象,并按照通常的方式来调用方法。

class Student {
   var name = “”;// 初始化为空字符串
   var age = 0; // 初始化0
   def doSomething() {
      age += 1
   }
}

class Teacher {
   var name = “”;
   var level = “”;  //级别
}

初始化类:var stu = new Student,当然也可以写成var stu = new Student(),有没有括号,都是看个人习惯,两条语句所起到的作用是一样的,都是new了一个Student对象。同理,在调用无参的方法时,也可以使用()号,也可以不用。stu.doSomething与stu.doSomething()都是一个意思。不过在Scala编程习惯中,改变对象状态的方法调用时后面就加上()符号,如果只是取值的话,就不用加()符号,这样显得更简洁。

7.2 getter和setter 方法

在Java中,为了类属性的安全,一般都是将类的属性声明为private,然后在提供public的getter、setter方法。Scala中也是有getter和setter方法的,只是语法形式与Java的不一样而已。例如:

object StudentTest {
  def main(args : Array[String]) : Unit = {
    var stu = new Student
    stu.name = "张三"
    stu.score = 100
    println(stu.name + ":" + stu.score)
  }  
  
  class Student {
    var name = ""
    var score = 0
  }
}

Student类两个属性name和score,默认情况下,name和score属性不是公有的,但是在创建了一个Student实例后,stu.name = ”张三” 实际上是调用了Student类的 _name 方法,这个就是Student类的setter方法,而getter方法实际上就是 name 方法,所以println(stu.name)就可以打印出名字,按照Java的思想来理解,可能会认为name属性默认声明了为public,但实际上不是的。

如果你不想提供setter方法怎么办?在Scala中,如果不想提供setter方法,那么声明属性的时候,用val来代替var即可,试试将Student类的name属性的声明改成val,那么在代码stu.name = “张三” 那行,编译器就会报错:


当然,你也可以将name用private来修饰,这样的情况,默认的getter和setter方法也是private的,这样name属性的getter和setter方法都会报错:


那怎么给name属性赋值和取值?可以重写getter和setter方法:

object StudentTest {
  def main(args : Array[String]) : Unit = {
    var stu = new Student
    stu.name = "张三"
    stu.score = 100
    println(stu.name + ":" + stu.score)
  }  
  
  class Student {
      private var privateName = ""
      var score = 0
      // setter方法
      def name = privateName
      // getter方法
      def name_= (newName:String){
        privateName = newName
      }
  }  
}

7.3 Bean属性

Scala的getter和setter方法,是与在Java不同的,如果想按照Java那样定义getter和setter方法,可以将该属性标注为@BeanProperty,这样就会自动生成getXXX和setXXX方法,例如:

import scala.beans.BeanProperty

object StudentTest {
  def main(args : Array[String]) : Unit = {
    var stu = new Student
    stu.name = "张三"
    stu.score = 100
    println(stu.name + ":" + stu.score)
    
    // 类似java的getter和setter方法
    stu.setAddress("白云区")
    println(stu.name + ":" + stu.score + " 地址:" + stu.getAddress())
  }  
  
  class Student {
      private var privateName = ""
      var score = 0
      @BeanProperty
      var address = ""
      
      // setter方法
      def name = privateName
      // getter方法
      def name_= (newName:String){
        privateName = newName
      }
  }  
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值