开发者学堂课程【Scala 核心编程-基础:覆写字段注意事项和细节说明2】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/609/detail/8978
覆写字段注意事项和细节说明2
内容介绍:
一、覆写字段的注意事项
二、语法书写示例
三、小结
本节继续来介绍 Scala 的细节
一、覆写字段的注意事项
var 只能重写另一个抽象的 var 属性,需注意不是重写另外一个 var,而是抽象的 var 属性。打开 scala,新建文件Scala
F
ield
O
verride
D
etail03:
package com. atguigu.chapter
0
7. myextends
o
bject ScalaFieldOverrideDetail03 {
def main(args:Array[String]):Unit={
}
}
//在 A03中,有一个抽象的字段(属性)
//1.抽象的字段(属性):就是没有初始化的字段(属性)
classA
0
3{
var name:string
//抽象
}
string 此时属性没有赋值不能执行,因为在 class 里要求需要默认值,可用_来指令,也可以 Jack 字串来指令,所以没有初始化的字段就是抽象的,抽象的字段要求类也是抽象的(标记 abstract),如下:
package com. atguigu.chapter
0
7. myextends
o
bject ScalaFieldOverrideDetail03 {
def main(args:Array[String]):Unit={
}
}
//在 A03中,有一个抽象的字段(属性)
//1.抽象的字段(属性):就是没有初始化的字段(属性)
//2.当一类含有抽象属性时,则该类需要标记为 obstract
abstract
classA
0
3{
var name:string
//抽象
}
抽象的属性在底层不会生成对应的属性说明,而是生成两个对应的抽象方法,来运行之后看结果:
package com. atguigu.chapter
0
7. myextends
object ScalaFieldOverrideDetail03 {
def main(args:Array[String]):Unit={
println
(“hello~”)
}
}
//在A03中,有一个抽象的字段(属性)
//1.抽象的字段(属性):就是没有初始化的字段(属性)
//2.当一类含有抽象属性时,则该类需要标记为 obstract
//3.对于抽象的属性在底层不会生成对应的属性说明,而是生成两个对应的抽象方法(name、name_$eq)
abstract
classA
0
3{
var name:string
//抽象
}
运行后打开反编译工具,看到 A03没有 name 的属性,只有两个抽象方法,如下图:
这时就可重写,注意若不是一个抽象的属性就无法重写,如下:
package com. atguigu.chapter
0
7. myextends
object ScalaFieldOverrideDetail03 {
def main(args:Array[String]):Unit={
println
(“hello~”)
}
}
//在 A03中,有一个抽象的字段(属性)
//1.抽象的字段(属性):就是没有初始化的字段(属性)
//2.当一类含有抽象属性时,则该类需要标记为 obstract
//3.对于抽象的属性在底层不会生成对应的属性说明,而是生成两个对应的抽象方法(name、name_$eq)
abstract
classA
0
3{
var name:string
//抽象
}
class
sub
A
03
extends
A
03
{
}
此时会在 sub A03初报错,将光标置于 A03后,按 alt+enter,会提示你两种解决方法(Add'abstract'modifier/Implement methods),但此时不用这两种方法,用覆写来解决:
package com. atguigu.chapter
0
7. myextends
object ScalaFieldOverrideDetail03 {
def main(args:Array[String]):Unit={
println
(“hello~”)
}
}
//在 A03中,有一个抽象的字段(属性)
//1.抽象的字段(属性):就是没有初始化的字段(属性)
//2.当一类含有抽象属性时,则该类需要标记为 obstract
//3.对于抽象的属性在底层不会生成对应的属性说明,而是生成两个对应的抽象方法(name、name_$eq)
abstract classA03{
var name:string
//抽象
}
class
sub
A
03
extends
A
03
{
var
name:string=“”
}
此时就可以覆写,如果在子类中重写父类的抽象属性,本质是实现了抽象方法,因此注意可以写 override,也可不写。
二、语法书写示例
接着来看:
package com. atguigu.chapter
0
7. myextends
object ScalaFieldOverrideDetail03 {
def main(args:Array[String]):Unit={
println
(“hello~”)
}
}
//在 A03中,有一个抽象的字段(属性)
//1.抽象的字段(属性):就是没有初始化的字段(属性)
//2.当一类含有抽象属性时,则该类需要标记为 obstract
//3.对于抽象的属性在底层不会生成对应的属性说明,而是生成两个对应的抽象方法(name、name_$eq)
abstract
classA
0
3{
var name:string
//抽象
var
age:Int
=10
}
class
sub
A
03
extends
A
03
{
override
var
name:string=“”
override
var
age:Int
=10
}
来看这时运行能否成功:
看到报错,发现变量不能去 override 可变的 variable,这是语法的规则,不用去细究其中原因,记住不要用就可以。
三、小结
1、抽象属性:声明未初始化的变量就是抽象的属相,抽象属性属在抽象类中。
2、一个属性没有初始化,那么这个属性就是抽象属性。
3、抽象属性在编译成字节码文件时,属性并不会声明,但是会自动生成抽象方法,所以类必须声明为抽象类。
4、如果是覆写一个父类的抽象属性,那么 override 关键字可省略[原因:父类的抽象属性,生成的是抽象方法,因此就不涉及到方法重写的概念,因此 override 可省略,写上也并不会报错,当然再严谨的语法也会有纰漏,大家不需要较真。