Scala入门系列之四--类成员的可见性(private)以及用value和value_=进行读取和修改

传送门
Scala入门系列之一--使用命令行往文件输入数据并读取数据
Scala入门系列之二--数组、元组、列表、集合数据类型简述
Scala入门系列之三--类和方法的创建以及命令行执行scala文件
Scala入门系列之四--类成员的可见性(private)以及用value和value_=进行读取和修改
Scala入门系列之五--主构造器和辅助构造器
Scala入门系列之六--伴生对象和伴生类
Scala入门系列之七--scala中的继承
Scala入门系列之八--scala中的特质(trait),也称接口
Scala入门系列之九--模式匹配两大法宝(match语句和case类)
Scala入门系列之十--包
Scala入门系列之十一--函数式编程基础
Scala入门系列之十二--高阶函数
Scala入门系列之十三--针对容器的操作(遍历/映射/过滤/规约操作)
Scala入门系列之十四--使用IDEA编写Scala代码并Maven打包提交集群运行
传送门

一、用命令行执行scala文件

1)在TestCounterJVM.scala中输入以下代码

class Counter{
  private var value = 0
  def increment():Unit = { value += 1 }
  def current():Int = { value }
}
object MyCounter{
  def main(args:Array[String]){
    val myCounter = new Counter
    myCounter.increment()
    println(myCounter.current)
  }
}

1.1)编译和执行

scalac TestCounterJVM.scala
scala -classpath . Mycounter //MyCounter是包含main方法的对象名称,这里不能使用文件名称TestCounterJVM

上面命令执行后,会在屏幕输出“1”

2)对scala方法的基础使用(如果上面还没看懂的请继续看这两个例子)

  • 现在我们对之前的类定义继续改进一下,让方法中带有参数。我们可以修改一下TestCounterJVM.scala文件
class Counter{
  private var value = 0
  def increment(step:Int):Unit = { value += step }
  def current():Int = { value }
}
object MyCounter{
  def main(args:Array[String]){
    val myCounter = new Counter
    myCounter.increment(5)  //这里设置步长为5,每次增加5
    println(myCounter.current)
  }
}

上面命令执行后,会在屏幕输出“5”

  • 继续修改TestCounterJVM.scala文件
class Counter{
  var value = 0  //注意这里没有private修饰符,从而让这个变量对外部都可见
  def increment(step:Int):Unit = { value += step }
  def current():Int = { value }
}
object MyCounter{
  def main(args:Array[String]){
    val myCounter = new Counter
    println(myCounter.value)   //不是用getxxx获取字段的值
    myCounter.value = 3 //不是用setxxx设置字段的值  
    myCounter.increment(1) //这里设置步长为1,每次增加1
    println(myCounter.current)
  }
}

上面命令执行后,会在屏幕输出两行结果,第一行是0,第二行是4

二、类成员的可见性

1)value和value_=读取和修改private定义的变量

  • 我们先把value字段声明为private,看看会出现什么效果,继续修改TestCounterJVM.scala文件
class Counter{
  private var value = 0  //私有字段
  def increment(step:Int):Unit = { value += step }
  def current():Int = { value }
}
object MyCounter{
  def main(args:Array[String]){
    val myCounter = new Counter
    println(myCounter.value)   //不是用getxxx获取字段的值
    myCounter.value = 3 //不是用setxxx设置字段的值  
    myCounter.increment(1) //这里设置步长为1,每次增加1
    println(myCounter.current)
  }
}

现在我们去用scalac命令编译上面的代码,就会报错。因为,value字段前面用了修饰符private,已成为私有字段,外部是无法访问的。

2)解决方法如下图

  • 为了避免直接暴露public字段,建议将字段设置为private,对于private字段,Scala采用类似Java中的getter和setter方法,定义了两个成对的方法value和value_=进行读取和修改
class Counter{
  private var value = 0  //私有字段
  def value = privateValue  //定义一个方法,方法的名称就是原来我们想要的字段的名称
  def value_=(newValue:Int){
      if(newValue > 0) privateValue = newValue //只要是正数,就允许修改
  }
  def increment(step:Int):Unit = { value += step }
  def current():Int = { value }
}
object MyCounter{
  def main(args:Array[String]){
    val myCounter = new Counter
    println(myCounter.value)   //打印value的初始值
    myCounter.value = 3 //为value设置新的值
    println(myCounter.value)
    myCounter.increment(1) //这里设置步长为1,每次增加1
    println(myCounter.current)
  }
}


你可能感兴趣的:(Scala入门系列之四--类成员的可见性(private)以及用value和value_=进行读取和修改)