Scala快速入门-继承

By timebusker on January 6, 2018

知识点

  • 继承类 extends
  • 重写方法时必须用override
  • 只有主构造器可以调用超类的主构造器
  • 重写字段
  • 抽象类、字段

扩展类

  • 使用extends关键字
class Employee extends Person {...}
  • 在子类中定义需要的新字段和方法,或者重写超类的方法
  • 可将类声明为final,这样就不有被扩展
  • 可将单个方法或字段声明为final,确保不能被重写
  • 在上一节中,类有一个主构造器和任意多的辅助构造器,而每个辅助构造器都必须先调用先前定义的辅助构造器或主构造器为开始,调用超类构造器的方式也同样与类的定义交织在一起
class Employee(name: String, age: Int, val salary: Double) extends Person(name, age) {

}

说明:Employee类中有三个参数:name、age和salary,其中的name和age会被传递到超类中。相当于下面的Java代码

public class Employee extends Person {
	private String name;
	private int age;
	private double salary;
	
	public Employee(String name, int age, double salary) {
		super(name, age);
		this.salary = salary;
	}
}

重写方法

  • 在Scala中重写一个非抽象方法必须使用override修饰符
class Pseron{
	override def toString = getClass.getName
}
  • 在Scala中调用超类的方法用supper关键字
class Employee extends Pseron{
	override def toString = super.toString + getClass.getName
}

重写字段

  • 可以用另一个同名的val字段重写一个val或不带参数的def
  • 常见操作是用val重写抽象的def
abstract class Person{
	def id: Int
}

class Student(override val id: Int) extends Person
  • 重写时注意如下限制

def只能重写另一个def

val只能重写另一个val或不带参数的def

var只能重写另一个抽象的val

抽象类

  • 用abstract关键字标记的类不能被实例化
  • 抽象类通常包含某个或几个方法没有被完整定义
  • 与Java不同,不需要对抽象方法使用abstract关键字,只是省去了方法体
  • 如果某个类至少存在一个抽象方法,则该类必须声明为abstract
  • 子类中重写超类中抽象方法时,不需要使用override关键字

抽象字段

  • 抽象字段就是一个没有初始值的字段
abstract class Person{
	val id: Int
	var name: String
}
  • 具体的子类必须提供具体的字段
  • 和方法一样,在子类中重写超类中的抽象字段时,不需要override关键字