Scala中的抽象类

抽象类

抽象类中不一定有抽象方法或者抽象字段。

有抽象字段或者抽象方法的类一定是抽象类。

子类在实现抽象字段或者抽象方法的时候,不使用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"

原文地址:https://www.cnblogs.com/DreamDrive/p/5673260.html