类
定义
1,在Scala中,类并不用声明为public
2,Scala源文件中可以包含多个类,所有这些类都具有公有可见性
3,用val修饰的变量是只读属性,有getter但没有setter,相当与Java中用final修饰的变量
4,用var修饰的变量既有getter又有setter
5,类私有字段 private,只能在类的内部使用,伴身对象可以访问
6,对象私有字段 private[this],访问权限更加严格的,类的方法只能访问到当前对象的字段
7,所有的类名的第一个字母要大写
构造器
1,类后面定义的构造器是主构造器
2,gender:String相当于定义了一个private[this]的成员变量
class User(val id: Int, var name: String, gender: String, var age: Int = 30)
3,主构造器和辅构造器(也可以认为Java中构造器的重载)
注意:主构造器会执行类定义中的所有语句
class User(val id: Int, var name: String, gender: String, var age: Int = 18) {
//默认赋一个空值
var money: Int = _
//定义了一个辅助的构造器
def this(id: Int, name: String, gender: String, age: Int, money: Int) = {
//一定要在第一行显示调用主构造器
this(id, name, gender, age)
this.money = money
}
}
object User {
def main(args: Array[String]): Unit = {
val user = new User(1, "neo", "男")
println(user.id + "," + user.name + "," + user.age + "," + user.money)
val u1 = new User(1, "neo", "男", 20, 1000)
println(u1.id + "," + u1.name + "," + u1.age + "," + u1.money)
}
}
4,主构造器执行顺序
package oop.t2
import scala.io.Source
class TestConstructor {
//主构造器里的内容会被执行
var name: String = "abc"
println(name)
try {
val str: String = Source.fromFile("H:\\hive.txt").mkString
println(str)
} catch {
case e: Exception => e.printStackTrace()
} finally {
println("finally")
}
//会加载方法的定义,但是不会调用
def sayHi(): Unit = {
println("hi .....")
}
}
object TestConstructor {
def main(args: Array[String]): Unit = {
var t = new TestConstructor
}
}
对象
单例对象
在Scala中没有静态方法和静态字段,但是可以使用object这个语法结构来达到同样的目的
- 存放工具方法和常量
- 高效共享单个不可变的实例
伴生对象
如果有同样一个类与该object名字一样,则称该object为该类的伴生对象,相对应,该类为object的伴生类。如果一个类有它的伴生对象,这个类就可通过object的名字访问到所有成员,但object不在该类的作用范围。类和伴生对象之间可以相互访问私有的方法和属性(伴生对象一般跟类在同一个文件里)
apply
通常我们会在类的伴生对象中定义apply方法,当遇到类名(参数1,...参数n)时apply方法会被调用
class Person(val id: Int, var name: String) {
def show() = {
println("id:" + id + ",name:" + name)
}
}
object Person {
def apply(id: Int, name: String): Person = {
println("调用了Person的apply方法")
var p = new Person(id, name)
p
}
}
object Test {
def main(args: Array[String]): Unit = {
val person = Person(1, "张三")
person.show()
}
}
main方法 和 扩展App特质
def main(args: Array[String]){}
object TestApp extends App {
println(11)
}