开发者学堂课程【Scala 核心编程-基础:Scala 覆写字段快速入门】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/609/detail/8976
Scala 覆写字段快速入门
案例:创建一个类型为 class 的文件名为 ScalaFilledoverride 写入:
package com. atguigu. chapter07. myextends
object ScalaFiledoverride {
def main(args: Array[String]): Unit = {
}
class AAA{
val age : Int= 10
}
class BBB extends AAA {
override val age : Int= 20
}
在 scala 里面要求覆写一个字段,或者有一个子类的字段跟它一模一样时必须写 override,否则报错。
创建两个对象实例,都是 B 的实例,一个交给 A 一个交给 B,看各个对象的 age 值:
Val obj1 :AAA= new BBB
Val obj2 : BBB= new BBB
println(" obj1.age="+ obj1.age +” \t obj2.age= ”+ obj2.age)
}
执行:
D: \program\jdk8\bin\java
obj1.age=20| obj2.age=20
Process finished with exit code 0
会发现两个都是20,而不是一个是10,一个是20.
因为:
val age : Int= 10会生成 public age()
override val age : Int= 20会生成 public age()
也就是下面的方法把上面的覆盖掉了,看起来好像是字段的覆写,本质是方法的覆写。
println(" obj1.age="+ obj1.age +” \t obj2.age= ”+ obj2.age) 这里 obj1.age 调用了 obj1.age(),obj2.age 看起来是访问了 obj2.age()
但是,虽然 obj1是父类的引用,但是有动态绑定机制,指向的内存地址是 BBB,所以调用的是 BBB 里面的 age。
如果就是想访问父类的 age,那么就自己写一个方法,让它继承去访问。
打开源代码:
public class AAA
private final intr age = 10;
public int age() { return this.age; }
}
AAA 里面有 age 方法。
public class BBB extends AAA
private final int age = 20:
public int age
()
{ return this.age; }
BBB 里面也有 age 方法,相当于覆写了,所以在调用的时候一直调用的是 age(),那么就会返回20.