抽象类
抽象类中不一定有抽象方法或者抽象字段。
有抽象字段或者抽象方法的类一定是抽象类。
子类在实现抽象字段或者抽象方法的时候,不使用override。
覆盖方法
覆盖的时候,一定使用override。
覆盖字段
抽象字段一定要有类型描述。 覆盖的时候,一定使用override。
1 /** 2 * 继承 -- 抽象类 3 * @author Administrator 4 */ 5 abstract class person{ 6 var name:String 7 val age:Int 8 def show:Int 9 } 10 11 class student extends person { 12 //在scala中覆盖一个抽象类中字段时,可以不写override 13 var name:String = "zhangsan" //使用var定义的抽象字段只能使用var覆盖 14 val age:Int = 18 //使用val定义的抽象字段只能使用val覆盖 15 def show:Int = 100 //使用def定义的方法可以使用val或者def进行覆盖 16 } 17 18 object TestScala61 { 19 def main(args: Array[String]): Unit = { 20 /* 21 1、抽象类不一定有抽象字段,只需要添加abstract关键字 22 2、有抽象字段一定是抽象类 23 3、重写字段的实质是在重写字段的setter、getter方法 24 */ 25 var c = new student 26 println(c.show) 27 } 28 }
1 /** 2 * 继承-构造顺序 3 * @author Administrator 4 */ 5 class person1{ 6 val name:String = "lisi" 7 val age:Int = 10 8 lazy val interest:Array[Int] = new Array[Int](age) 9 println("person1类") 10 } 11 12 class student1 extends person1{ 13 override val age:Int = 20 14 println("student1类") 15 } 16 17 18 object TestScala62 { 19 def main(args: Array[String]): Unit = { 20 val c = new student1 21 println(c.name)//打印"lisi" 22 println(c.age)//打印20 23 println(c.interest.length) 24 25 /*说明*/ 26 //1、实例化student1类时,发现student1继承了person1 27 //2、继承person1优先调用person1初始化person1中的字段 28 //3、初始化到age时发现age字段要被student1中age重写,setter、getter方法为空 29 //4、初始化interest时需要调用age字段的getter方法,用于初始化数组,由于getter方法没有定义,所以长度为0 30 //5、student1类开始进行初始化,将20设置进age字段 31 32 //解决方法:在interest前添加lazy--使得该字段在构造对象的最后在进行初始化 33 34 } 35 36 }
打印输出:
person1类
student1类
lisi
20
20
先打印出父类"person1"然后打印出子类"student1"
本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/5673260.html,如需转载请自行联系原作者