文章目录
1、Scala面向对象基本概念
1.1 类(class)
与java相同:
1、类通过class关键字定义
2、类通过new关键字创建实例
3、类拥有成员变量和方法
4、类的成员默认为public,也支持private、protected
与java不同:
5、类中无法定义静态成员变量和方法
6、类无需明确定义构造方法,通过构造参数列表声明为类的一部分
1.1.1类的访问修饰符
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 | Y | Y | Y | Y | Y |
protected | Y | Y | Y | N | N |
private | Y | Y | N | N | N |
1.1.2类的定义
构造器:
主构造器:一个类如果没有显示定义的主构造器则自动拥有一个无参的主构造器。
辅助构造器:可以没有,也可以有多个,辅助构造器必须从调用其他构造器开始,辅助构造的名称是this。
class Student {
//Scala主构造函数,主构造函数定义在类的头部
//定义成员变量
var name:String="zhang"
var age:Int=_ //默认0
var gender:String=_ //默认null
//定义一个辅助构造器1(可以没有辅助构造器)
def this(name:String,age:Int)={
//辅助构造器必须从调用其他构造器开始
this() //调用主构造器
this.name=name
this.age=age
}
//定义一个辅助构造器2
def this(gender:String){
this("张三",18) //调用辅助构造器1
this.gender=gender
}
//定义一个成员方法
def study()={
println("good good study,day day up")
}
}
object Test01{
def main(args: Array[String]): Unit = {
val stu1 = new Student()
println(stu1.name)
println(stu1.gender)
println(stu1.age)
stu1.study()
val stu2 = new Student("zhangsan",20)
println(stu2.name)
println(stu2.gender)
println(stu2.age)
stu2.study()
//scala中定义成员变量后,会默认生成get和set方法
stu2.age=25
println(stu2.age)
}
}
1.1.3类的继承
1、Scala使用“extends”关键字实现继承
2、子类重写父类方法必须使用“override”关键字
1.2 抽象类(abstract class)
1、抽象类可包含未实现的方法,即抽象方法
2、抽象类无法实例化
3、抽象类使用“abstract”关键字修饰
-
子类重写父类抽象方法时,“override”关键字可选
-
子类重写父类非抽象方法,“override”关键字必写
1.3 单例对象(object)
1、Scala的类中无法定义静态成员,即无static关键字。如何像Java一样表达类的静态成员变量、成员方法与静态代码块?
2、Scala解决方案:单例对象
- 使用“object”关键字声明,可包含变量、方法与代码定义
- 单例对象中的成员变量、成员方法通过单例对象名直接调用
- 单例对象第一次被访问时初始化,并执行全部代码块
- 单例对象不能new,且无构造参数
- 程序入口main()方法必须定义在单例对象中
- 单例对象与同名类定义在同一文件中时形成绑定关系(伴生)
1.4 样例类(case class)
样例类常用于描述不可变的值对象(Value Object)
-
样例类构造参数默认声明为“val”,自动实现类构造参数的getter
-
样例类构造参