之前在学习scala时做的笔记,希望能对大家有点帮助。
import java.io.Serializable
import com.dreamponline.scala_train._
import com.sun.istack.internal.NotNull
import org.scalatest.FreeSpec
import scala.annotation.elidable
import scala.beans.BeanProperty
import scala.collection.immutable.HashMap
import scala.collection.mutable
import scala.reflect.ClassTag
/**
*
* xx 08/07/25 09:00
*/
class ControlProgrammer extends FreeSpec {
"访问修饰符" - {
"私有(Private)成员 仅在包含了成员定义的类或对象内部可见" in {
class Demo {
private var sum = 0
var avg = 0
}
new Demo().avg = 1 // 能访问
// new Demo().sum = 1 // 私有成员无法访问
// 类的私有构造方法
class Demo1 private(val name: String, val age: Int) {
def this(name: String) {
this(name, 10)
"辅助构造函数".show()
}
}
//私有主构造方法不能直接用主构造方法实例化,只能通过辅助构造函数实例化
new Demo1("test")
}
"保护(Protected)成员 在 scala 中,对保护(Protected)成员的访问比 java 更严格一些。因为它只允许保护成员在定义了该成员的的类的子类中被访问。" +
"而在java中,用protected关键字修饰的成员,除了定义了该成员的类的子类可以访问,同一个包里的其他类也可以进行访问" in {
class Demo {
protected var sum = 0
protected def method(): Unit = {}
}
// 子类可访问
class Demo1 extends Demo {
sum = 1
method()
}
class Demo2 {
val b = new Demo
// b.sum = 2 此时无法访问,因为demo2不是demo的子类
}
}
"公共(Public)成员,scala中,如果没有指定任何的修饰符,则默认为 public。这样的成员在任何地方都可以被访问" in {
class Demo {
var sum = 0
def method() {}
}
// 默认的demo类所有成员都为public, 所以demo1可以访问demo的成员
class Demo1 {
var demo = new Demo
demo.sum = 1
demo.method()
}
}
"作用域保护 Scala中,访问修饰符可以通过使用限定词强调" in {
//private[x] x指代某个所属的包、类或单例对象 ,表示这个成员除了对[…]中的类或[…]中的包中的类及它们的伴生对像可见外,对其它所有类都是private
// 针对[包package] 案例
class Demo {
// 指定sum对keypoint包下的类可访问
private[keypoint] var sum = 0
private var max = 1
}
class Demo1 {
// 由于Demo1在keypoint包下, 所以可以访问sum
val demo = new Demo
demo.sum = 1
// demo.max = 2 无法访问max
}
// TODO: 详情查看包keyPoint下的ScalaScope.scala
}
}
}