scala面向对象综述
一、Scala面向对象编程综述
1.1 Scala是纯粹的面向对象的语言
以Java为例, Java并不是一门纯面向对象的语言,其允许非对象值的存在,也允许不属于任何对象的静态字段和方法存在。
Scala是纯粹的面向对象的语言,每个值都是对象,每个操作都是方法调用。
1.2 Scala大量重用了 Java中的类型
Scala与 Java完全兼容, Scala程序会被编译成 Java字节码,访问 Java字段,继承 Java类,实现 Java接口都不需要特别的语法,实际上 Scala也使用了大量的Java库代码。比如 Scala String类与 java.lang.String一样。
1.3 Scala OOP比较 Java OOP的主要差异
- Scala取消了接口( Interface),新增了类似的 特质 概念( Trait)
- Scala取消静态字段和方法,新增 单例对象 的概念( Singleton Object)
- Scala新增了 样例类 case class)
二、类和对象
- 类是对对象的抽象模板,描述了该类对象可以拥有的属性和方法
- 对象是类 的具体实例
- 类和对象最明显的 区别:类不占用内存,对象占用内存
2.1类的定义
Scala与 Java创建普通类的方式基本一样:
class 类名 (参数列表 ){
辅助构造器
成员变量
成员方法
}
- Scala提出主构造器与辅助构造器的概念,类似 Java构造方法。主构造器是 “类名 (构造参数列表 )” ,辅助构造器 this(构造参数列表 )” ,辅助构造器类似于 Java中的构造方法重载,所有构造器都没有返回值。注意辅助构造器必须间 接或直接调用主构造器。
- Scala中,“ this” 是关键字,用于引用当前对象。可以使用 this调用实例变量、方法、构造器。
- Scala类成员默认为 public ,也可修改为 private 和 protected 。
- Scala类中无法定义静态成员和方法,因为没有 static关键字。
- 类中可以有字段和方法,统称为成员变量。字段可以用var或 val定义,都是指向对象的变量。
示例: 创建一个 Studnet 类
class Student() { //默认无参。括号可以不加 默认有一个无参构造器
//定义成员变量 //使用var修饰自带了get、set方法, val只有get方法
var name:String="张三" //设置name默认值为 张三
var age:Int= _ //默认为0
var gender:String = _ //默认null
var banji:Int = 1 //设置班级默认为1
//定义一个辅助构造器1,设置 name,age属性
def this(name:String,age:Int)={
//辅助构造器必须从调用其他构造器开始
this()
this.name=name
this.age=age
}
//定义一个辅助构造器2,设置gender属性
def this(gender:String){
this("李四",18) //可以在this中设置name,age的默认值
this.gender =gender
}
//定义一个成员方法
def study()={
println(name+"喜欢学习scala")
}
}
object Test01{ //main方法只能写在object中
def main(args: Array[String]): Unit = {
//使用默认无参的构造方法
val stu1: Student = new Student()
println(stu1.name)
println(stu1.age)
println(stu1.gender)
stu1.study()
//控制台输出:
/*张三
0
null
张三喜欢学习scala
*/
//调用辅助构造器1
val stu2: Student = new Student("小明", 22)
println(stu2.name)
println(stu2.age)
println(stu2.gender)
stu2.study()
//控制台输出:
/*小明
22
null
小明喜欢学习scala
*/
//调用辅助构造器2
val stu3=new Student("男")
println(stu3.name)
println(stu3.age)
println(stu3.gender)
stu3.age=18
stu3.study()
//控制台输出:
/*李四
18
男
李四喜欢学习scala
*/
}
}
除了上面介绍的类定义方法,还有一种更简便的创建类的方式:
class Dog(val name: String,var age:Int){ //自动生成类的属性
def cry()=println("wow ...")
}
object Dog {
val dog = new Dog("Harry",2)
dog.name="Wang" //编译错误,需要将val类型改成var
dog.age=3 //编译通过
}
注: 主构造器中,使用val的定义的变量自动生成 getter var定义的变量自动生成 getter&setter。在 Scala中,严格来说是没有 getter和 setter这个说法,使用了“ value”和 value_=”两个方法来分别代替了 getter和 setter。如下所示:
class Counter(var value:Int)
class Counter{
private var privateValue = 0 //私有变量,外界无法直接访问
def value = privateValue //定义一个方法,代替 getter
def value_= ( newValue : Int ){ // value_= 是方法名字 ,代替 setter
value = newValue //将 newValue 赋值给 value,类似于set方法
} //注意, scala中默认方法是 public的
}