扩展类
scala 扩展类的方式和Java一样, 使用 extends 关键字,例如:
class Person(val Name:String){
def show() = {println("person name: " + Name)}
}
class Student(name:String) extends Person(name){
private var id = 0
// 重写字段
override val Name: String = "[%s]".format(name)
// 辅助构造器
def this(name:String, id:Int){
this(name)
this.id = id
}
def learn() = {
println("learn ... ")
}
// 重载方法
def learn(language:String) = {
println("learn language " + language)
}
// 重写方法
override def show() = {
println("student id: %d, name: %s".format(this.id, this.Name))
}
}
声明Student 对象
scala> val s1 = new Student("borey")
s1: Student = Student@3878be7b
scala> s1.show
student id: 0, name: [borey]
scala> val s2 = new Student("borey", 10076)
s2: Student = Student@10667848
scala> s2.learn
learn ...
scala> s2 learn "scala"
learn language scala
scala> s2.show
student id: 10076, name: [borey]
上述样例包含知识点:
- 使用extends进行类扩展, 也可以像Java一样把类声明为 final, 这样它就能被扩展;
- 子类辅助构造器不能直接调用父类构造器; java中可以通用supper(param), scala 不行。
- 类方法的重载和Java一样;
- 类方法的重写,必须添加 override; Scala 中 重写一个
非抽象方法 必须使用override修饰符。
- 类字段的重写,scala的类字段由一个私有字段和取值器/改值器方法构成(scala 类 setter和getter属性)。
你可以用另一个同名的val字段重写一个val(或一个不带参数的def),子类有一个私有字段和一个公有的getter方法, 而这个getter方法重写了超类的getter方法
。
可以看下 javap 反编译后 上述代码Java的定义:
prod@AWS-TEST-DT:~/borey_zhu/scala$ javap -p Person.class
Compiled from "Person.scala"
public class Person {
private final java.lang.String Name;
public java.lang.String Name();
public void show();
public Person(java.lang.String);
}
prod@AWS-TEST-DT:~/borey_zhu/scala$ javap -p Student.class
Compiled from "Person.scala"
public class Student extends Person {
private int id;
private final java.lang.String Name;
private int id();
private void id_$eq(int);
public java.lang.String Name();
public void learn();
public void learn(java.lang.String);
public void show();
public Student(java.