Scala面向对象中有这几个概念:
类、抽象类、单例对象、特质、样例类
类
和Java中类似点:
类通过class关键字定义
类通过new关键字创建实例
类拥有成员变量和方法
类的成员默认为public,也支持private、protected,Scala中没有public这个关键字
和Java中不一样之处:
类中无法定义静态成员变量和方法(Java中有static)
类无需明确定义构造方法,通过构造参数列表声明为类的一部分
Java中访问修饰符
Modifier | Class(自己) | Package(包) | Subclass(子类) | World(全局) |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
default | Y | Y | N | N |
private | Y | N | N | N |
Scala中访问修饰符
Modifier | Class | Companion(伴生类、伴生对象) | Subclass | Package | World |
---|---|---|---|---|---|
default(public) | Y | Y | Y | Y | Y |
protected | Y | Y | Y | N | N |
private | Y | Y | N | N |
类的定义
package oop
// 不写参数默认是无参构造
class Student() {
// 定义成员变量
var name:String= "zhangsan"
var age:Int = _ // 下划线意思是有个默认值0
var gender:String = _ // String的默认类型是null
val banji:String = "1"
// 定义一个辅助构造器,辅助构造器名字都是this
def this(name:String,age:Int) = {
this() // 调用主构造器 不调会报红 辅助构造器必须从调用其他构造器开始
this.name = name
this.age = age
}
// 辅助构造器名字都一样,但是参数列表不一样
def this(name:String,age:Int,gender:String) = {
this("lisi",18) // 调用辅助构造器,并做了初始化
this.gender = gender
}
// 定义成员方法 (和定义方法一样)
def study() = {
println("good goood study,day day up")
}
}
object Test01{
def main(args: Array[String]): Unit = {
// 通过主构造器创建
val stu1:Student = new Student() // 创建一个实例化对象
println("-----主构造器调用-------")
println(stu1.name) // 打印的都是主构造器的值
println(stu1.gender)
println(stu1.age)
stu1.study()
println("-----辅助构造器调用------")
// 通过辅助构造器创建
val stu2 = new Student("zhangsan",20)
println(stu2.name) // 打印的都是主构造器的值
println(stu2.gender)
println(stu2.age)
stu2.study()
println("---对成员变量初始值做修改----")
// 对成员变量初始值做修改
stu2.age = 25
println(stu2.age)
// 在scala中,定义完成员变量默认会生成get/set方法,不需要像java中再去写
println(stu2.banji) // => 1 val 修饰的不能改变
}
}
主构造参数(不同写法):
class Person (var name:String,var age:Int){ // n 、 a 是形式参数
/* var name = n
var age = a*/