scala中定义类
简单的类和无参方法,scala类最简单的形式看上去和java/C++很相似
/**
* 定义一个类
*/
class Counter {
// 定义初始化字段未来可期
private var value = 0
}
在scala中类并不声明为public,一个scala文件中可以包含多个类,所有这些类都具有公开可见性。类中的方法默认都是公有方法。
class Counter {
// 定义初始化字段
private var value = 0
private var name = ""
// private[Counter] 修饰符可以定义仅有指定类的方法可以访问此字段,
// 这里的类可以是当前定义的类,也可以是包含该类的外部类
// private[Counter] var value = 0
/**
* 默认公有方法
* 在scala中类并不声明为public,一个scala文件中可以包含多个类,所有这些类都具有公开可见性
*/
def increment(): Unit = {
value += 1 // 注意此处累计加1与java中写法不一样,scala不支持使用 value++
}
// 如果count函数代码块中只有一行代码可以简写为 def count() = value
def count() = {
value // 注意在scala中若最后一行数据,则该数据为返回值
}
// 类中方法的调用, 类似于java中的方式, 需要构造出对象然后调用方法
val coun = new Counter
// 在scala中如果方法中没有参数可以将后面的 () 省略
coun.increment
println(coun.count)
}
scala中对每个字段都提供了getter和setter方法。scala文件在被JVM编码的时候,会自动创建字段的getter和setter方法,如果字段声明为private那么对应的getter和setter方法也是private。如果字段定义为val,那么只会生成getter方法。如果不需要getter和setter方法,则可以将字段声明为private[this]。
另外我们也可以直接给字段加上@BeanProperty注解 也会自动生成getter和setter方法,通过该注解会生成四个方法:
name:String
name_(newValue:String):Unit
getName ==> 与Java互操作
setName(String newValue):Unit ==> 与Java互操作
// 我们也可以重新定义字段的getter和setter方法
def privateValue: Int = value
def privateValue_(newValue: Int): Unit = {
this.value = newValue
}
与java一样, scala也可以有很多的构造器,不过scala中的主构造器最为重要,其他可以有多个辅助构造器。与Java相比有两个地方不同:
-
-
辅助构造器的名称是this。
-
每一个辅助构造器都必须以一个对先前定义好的其他辅助构造器或主构造器的调用
-
// 定义一个辅助构造器
def this(newName: String) {
this() // 主构造器
this.name = newName
}
// 定义另外一个辅助构造器
def this(newName: String, newValue: Int) {
this(name)
this.value = newValue
}
在scala中每个类都有主构造器,主构造器实际上并不是以this方法定义而是与类定义交织在一起。
/**
* 括号中的内容就是主构造器的参数
* 1.主构造器中的参数可以是任意形态的
* 例如 class Person(val name: String,private var age: Int) {}
* 2.构造参数中如果不指定字段类型,默认是 private[this] val
*
* @param name
* @param age
*/
class Person(var name: String, var age: Int) {
def desc = name + " is " + age + " years old"
}
在scala中几乎可以在任意语法结构中嵌套任意语法结构,可以在函数中定义函数,在类中定义类。
class NetWork {
class Member(val name: String) {
val contacts = new ArrayBuffer[Member]
}
private val members = new ArrayBuffer[Member]
def join(name: String): Member = {
val m = new Member(name)
members += m
m
}
}
def main(args: Array[String]): Unit = {
// 实例化两个不同的类
val chatter = new NetWork
val myFace = new NetWork
val jason = chatter.join("jason")
val jack = chatter.join("jack")
jason.contacts += jack
val mark = myFace.join("mark")
// 不可以将myFace中的Member添加到chatter.Member元素中
// jason.contacts += mark
}
扫描二维码
获取更多精彩
WuMaoYin