好程序员大数据教程Scala系列之类java
Scala 访问修饰符基本和Java的同样,分别有:private,protected,public。程序员
若是没有指定访问修饰符符,默认状况下,Scala 对象的访问级别都是 public。ide
私有(Private)成员大数据
用 private 关键字修饰,带有此标记的成员仅在包含了成员定义的类或对象内部可见,一样的规则还适用内部类。this
class Outer{scala
class Inner{ private def f(){println("f")} class InnerMost{ f() // 正确 } } (new Inner).f() //错误
}code
(new Inner).f( ) 访问不合法是由于 f 在 Inner 中被声明为 private,而访问不在类 Inner 以内。对象
但在 InnerMost 里访问 f 就没有问题的,由于这个访问包含在 Inner 类以内。教程
Java中容许这两种访问,由于它容许外部类访问内部类的私有成员。get
保护(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 // 2
println(point1) // prints (2, 3)
构造器能够带有默认值:
class Point(var x: Int = 0, var y: Int = 0){
...
}
val origin = new Point // x, y都取默认值0
val point1 = new Point(1)//x=1,y=0
println(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 Point
point1.x = 99
point1.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[this] val hobby = "旅游"
}
scala中,在实现属性时你有以下四个选择:
var foo: Scala自动合成一个getter和一个setter
val foo: Scala自动合成一个getter
由你来定义foo和foo_=方法
由你来定义foo方法
注意:
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
}
}