方法重写

方法重写是实现多态和动态绑定的关键。
scala中的方法重写同java一样,也是利用override关键字标识重写父类的算法。

//如果父类是抽象类,则override关键字可以不加
//因为如果继承的父类是抽象类
//在父类中,父类中对应的抽象方法如果没有实现的话,那子类也必须定义为抽象类
//否则必须要有方法的实现,这样的话,加不加override关键字都是可以的

匿名类

实际上下面例子中的匿名类的演示并不是特别有代表性,如果将PersonFather声明为抽象类,则对于匿名类的使用更加的明显。

因为例子中PersonFather是可以被实例化的,而抽象类不能实例化

因此即使PersonFather是抽象类也能new出来的原因是,创造了一个匿名类,extends了PersonFarher,因此有了override def walk()

代码示例



package main.scala

/**
  * Created by postbird on 2016/9/13.
  */

class PersonFather(name:String,age:Int){
    println("PersonFather is created!")

    def walk(): Unit ={
        println("Person walking...")
    }
}

//(此处理解错误)如果是在主构造器实现继承的参数实现,那么应当和父类的主构造器的写法一样
//(此处理解错误)然后再extends后面的父类中调用子类的构造器的参数来实现父类构造器
//(此处理解错误)至少我是这么理解的

//无论父类的主构造方法中声明什么,在子类的主构造其中,不需要加 val 或者是 var来限定
//因为那样会声明成自己本身的private类型
//因此只要是 name:String 就可以
// 不知道这个理解有没有问题,有问题再改

class StudentSon(name:String,age:Int,var stuNo:Int) extends PersonFather(name,age){
    println("StudentSon is created!")

    override def walk() : Unit ={
        super.walk()
        println("Student walking.....")
    }
    //scala和java的重写一样,使用override 声明
    //调用父类方法 , 使用super关键字调用即可

    //如果父类是抽象类,则override关键字可以不加
    //因为如果继承的父类是抽象类
    //在父类中,父类中对应的抽象方法如果没有实现的话,那子类也必须定义为抽象类
    //否则必须要有方法的实现,这样的话,加不加override关键字都是可以的
}

object ClassExtendTest {
    def main(args: Array[String]) {
        val stu=new StudentSon("postbird",18,123456)
//        PersonFather is created!
//        StudentSon is created!
        //关于构造函数的执行顺序是先进行父类的然后再进行子类的构造,因此会出现上述的打印

        stu.walk()
//        Person walking...
//        Student walking.....

        //匿名类只能使用一次 可以直接new出来
        val tmpName=new PersonFather("ptbird",28){
            override def walk():Unit={
                println("tmp PersonFather class  walk......")
            }
        }
        tmpName.walk()
        //tmp PersonFather class  walk......
        // 可以看出 这其中 将PersonFather的方法进行了重写,tmpName不仅仅是一个PersonFather对象
    }
}