scala学习八:类和对象
一、类和对象
类是对象的抽象,而对象是类的具体实例。
类是抽象的,不占用内存,而对象是具体的,占用存储空间。
类是用于创建对象的蓝图,它是一个定义包括在特定类型的对象中的方法和变量的软件模板。
object NewTest {
def main(args: Array[String]): Unit = {
val pt = new Point(10, 20)
pt.move(5,5)
val locat = new Location(10, 20, 30)
locat.move(5,5,5)
}
class Point(xc: Int, yc: Int) {
var x: Int = xc
var y: Int = yc
def move(dx: Int, dy: Int) {
x = x + dx
y = y + dy
println("x 的坐标点: " + x);
println("y 的坐标点: " + y);
}
}
class Location(override val xc: Int, override val yc: Int, zc: Int) extends Point(xc, yc){
var z: Int = zc
def move(dx: Int, dy: Int, dz: Int): Unit = {
x = x + dx
y = y + dy
z = z + dz
println("x 的坐标点:" + x)
println("y 的坐标点: " + y)
println("z 的坐标点: " + z)
}
}
x 的坐标点: 15
y 的坐标点: 25
x 的坐标点:15
y 的坐标点: 25
z 的坐标点: 35
Scala中的类不声明为public,一个Scala源文件中可以有多个类。
以上实例的类定义了两个变量 x 和 y ,一个方法:move,方法没有返回值。
Scala 的类定义可以有参数,称为类参数,如上面的 xc, yc,类参数在整个类中都可以访问。
可以使用new来实例化类,并访问类中的方法和变量。
1.1 Scala继承
Scala继承一个基类跟Java很相似, 但需要注意以下几点:
1、重写一个非抽象方法必须使用override修饰符。
2、只有主构造函数才可以往基类的构造函数里写参数。
3、在子类中重写超类的抽象方法时,不需要使用override关键字。
具体例子见上面。
Scala 使用 extends 关键字来继承一个类。实例中 Location 类继承了 Point 类。Point 称为父类(基类),Location 称为子类。
override val xc 为重写了父类的字段。
继承会继承父类的所有属性和方法,Scala 只允许继承一个父类。
Scala重写一个非抽象方法,必须用override修饰符。
object NewTest {
def main(args: Array[String]): Unit = {
val employee = new Employee
employee.name = "Eric"
employee.salary = 1000
println(employee) // NewTest$Employee[name=Eric][salary=1000.0]
}
class Person{
var name = ""
println(getClass.getName) // NewTest$Employee
override def toString = getClass.getName + "[name=" + name + "]"
}
class Employee extends Person {
var salary = 0.0
override def toString = super.toString + "[salary=" + salary + "]"
}
}
1.2 Scala单例对象
在 Scala 中,是没有 static 这个东西的,但是它也为我们提供了单例模式的实现方法,那就是使用关键字 object。
Scala 中使用单例模式时,除了定义的类之外,还要定义一个同名的 object 对象,它和类的区别是,object对象不能带参数。
当单例对象与某个类共享同一个名称时,他被称作是这个类的伴生对象:companion object。你必须在同一个源文件里定义类和它的伴生对象。类被称为是这个单例对象的伴生类:companion class。类和它的伴生对象可以互相访问其私有成员。