大数据Scala系列之类

时间:2021-05-02

大数据Scala系列之类1. 类的定义Scala 访问修饰符基本和Java的一样,分别有:private,protected,public。如果没有指定访问修饰符符,默认情况下,Scala 对象的访问级别都是 public。私有(Private)成员用 private 关键字修饰,带有此标记的成员仅在包含了成员定义的类或对象内部可见,同样的规则还适用内部类。class Outer{ class Inner{ private def f(){println("f")} class InnerMost{ f() // 正确 } } (new Inner).f() //错误} (new Inner).f( ) 访问不合法是因为 f 在 Inner 中被声明为 private,而访问不在类 Inner 之内。但在 InnerMost 里访问 f 就没有问题的,因为这个访问包含在 Inner 类之内。Java中允许这两种访问,因为它允许外部类访问内部类的私有成员。保护(Protected)成员 在 scala 中,对保护(Protected)成员的访问比 java 更严格一些。因为它只允许保护成员在定义了该成员的的类的子类中被访问。而在java中,用protected关键字修饰的成员,除了定义了该成员的类的子类可以访问,同一个包里的其他类也可以进行访问。package p{class Super{ protected def f() {println("f")} } class Sub extends Super{ f() } class Other{ (new Super).f() //错误 }}类的定义示例://定义Point类,构造器带有两个参数class Point(var x: Int, var y: Int) { //无返回值的类方法 def move(dx: Int, dy: Int): Unit = { x = x + dx y = y + dy } //没有参数但是返回值为String类型的重写方法 override def toString: String = s"($x, $y)"}//创建类的实例val point1 = new Point(2, 3)point1.x // 2println(point1) // prints (2, 3)构造器可以带有默认值:class Point(var x: Int = 0, var y: Int = 0){...}val origin = new Point // x, y都取默认值0val point1 = new Point(1)//x=1,y=0println(point1.x) // prints 1私有成员变量以及重新定义的Getter/Setter方法: private var _x = 0 private var _y = 0 private val bound = 100 def x = _x def x_= (newValue: Int): Unit = { if (newValue < bound) _x = newValue else printWarning } def y = _y def y_= (newValue: Int): Unit = { if (newValue < bound) _y = newValue else printWarning } private def printWarning = println("WARNING: Out of bounds")}val point1 = new Pointpoint1.x = 99point1.y = 101 // prints the warning类定义中的其他细节://在Scala中,类并不用声明为public。//Scala源文件中可以包含多个类,所有这些类都具有公有可见性。class Person { //用val修饰的变量是只读属性 的,只带getter方法但没有setter方法 //(相当与Java中用final修饰的变量) //字段必须初始化 val id = "1234" //用var修饰的变量,默认同时有公开的getter方法和setter方法 var age: Int = 18 //类私有字段,有私有的getter方法和setter方法,只能在类的内部使用 private var name: String = "王老五" //对象私有字段,访问权限更加严格的,Person类的方法只能访问到当前对象的字段 private val hobby = "旅游"}scala中,在实现属性时你有如下四个选择:var foo: Scala自动合成一个getter和一个setterval foo: Scala自动合成一个getter由你来定义foo和foo_=方法由你来定义foo方法2. 构造器注意:1.主构造器会执行类定义中的所有语句2.主构造器如果有参数直接放 置在类名之后 class ConstructorDemo ( val id: Int ) { … }3.主构造器变成私有的,可以像这样放 置private关键字: class ConstructorDemo private ( val id: Int ) { … } 此时,用户必须通过辅助构造器来构造Person对象class ConstructorDemo { private var var1 = "" private var var2 = 0 //辅助构造器1 def this(var1:String) { this() //调用主构造器 this.var1 = var1 } //辅助构造器2 def this(var1:String, var2:Int) { this(var1) //调用辅助构造器1 this.var2 = var2 }}

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章