覆写字段注意事项和细节说明2|学习笔记

简介: 快速学习覆写字段注意事项和细节说明2。

开发者学堂课程【Scala 核心编程-基础覆写字段注意事项和细节说明2】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/609/detail/8978


覆写字段注意事项和细节说明2

 

内容介绍

一、覆写字段的注意事项

二、语法书写示例

三、小结

 

本节继续来介绍 Scala 的细节

 

一、覆写字段的注意事项

var 只能重写另一个抽象的 var 属性,需注意不是重写另外一个 var,而是抽象的 var 属性。打开 scala,新建文件ScalaFieldOverrideDetail03:

package com. atguigu.chapter07. myextends

object ScalaFieldOverrideDetail03 {

def main(args:Array[String]):Unit={

}

}

//在 A03中,有一个抽象的字段(属性)

//1.抽象的字段(属性):就是没有初始化的字段(属性)

classA03{

var name:string    //抽象

}

string 此时属性没有赋值不能执行,因为在 class 里要求需要默认值,可用_来指令,也可以 Jack 字串来指令,所以没有初始化的字段就是抽象的,抽象的字段要求类也是抽象的(标记 abstract),如下:

package com. atguigu.chapter07. myextends

object ScalaFieldOverrideDetail03 {

def main(args:Array[String]):Unit={

}

}

//在 A03中,有一个抽象的字段(属性)

//1.抽象的字段(属性):就是没有初始化的字段(属性)

//2.当一类含有抽象属性时,则该类需要标记为 obstract

abstract classA03{

var name:string    //抽象

}

抽象的属性在底层不会生成对应的属性说明,而是生成两个对应的抽象方法,来运行之后看结果:

package com. atguigu.chapter07. myextends

object ScalaFieldOverrideDetail03 {

def main(args:Array[String]):Unit={

println(“hello~”)

}

}

//在A03中,有一个抽象的字段(属性)

//1.抽象的字段(属性):就是没有初始化的字段(属性)

//2.当一类含有抽象属性时,则该类需要标记为 obstract

//3.对于抽象的属性在底层不会生成对应的属性说明,而是生成两个对应的抽象方法(name、name_$eq)

abstract classA03{

var name:string    //抽象

}

运行后打开反编译工具,看到 A03没有 name 的属性,只有两个抽象方法,如下图:

image.png

这时就可重写,注意若不是一个抽象的属性就无法重写,如下:

package com. atguigu.chapter07. 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 A03 extends A03 {

}

此时会在 sub A03初报错,将光标置于 A03后,按 alt+enter,会提示你两种解决方法(Add'abstract'modifier/Implement methods),但此时不用这两种方法,用覆写来解决:

package com. atguigu.chapter07. 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 A03 extends A03 {

var name:string=“”

}

此时就可以覆写,如果在子类中重写父类的抽象属性,本质是实现了抽象方法,因此注意可以写 override,也可不写。

 

二、语法书写示例

接着来看:

package com. atguigu.chapter07. myextends

object ScalaFieldOverrideDetail03 {

def main(args:Array[String]):Unit={

println(“hello~”)

}

}

//在 A03中,有一个抽象的字段(属性)

//1.抽象的字段(属性):就是没有初始化的字段(属性)

//2.当一类含有抽象属性时,则该类需要标记为 obstract

//3.对于抽象的属性在底层不会生成对应的属性说明,而是生成两个对应的抽象方法(name、name_$eq)

abstract classA03{

var name:string    //抽象

var age:Int=10

}

class sub A03 extends A03 {

override var name:string=“”

override var age:Int=10

}

来看这时运行能否成功:

image.png

看到报错,发现变量不能去 override 可变的 variable,这是语法的规则,不用去细究其中原因,记住不要用就可以。

 

三、小结

1、抽象属性:声明未初始化的变量就是抽象的属相,抽象属性属在抽象类中。

2、一个属性没有初始化,那么这个属性就是抽象属性

3、抽象属性在编译成字节码文件时,属性并不会声明,但是会自动生成抽象方法,所以类必须声明为抽象类

4、如果是覆写一个父类的抽象属性,那么 override 关键字可省略[原因:父类的抽象属性,生成的是抽象方法,因此就不涉及到方法重写的概念,因此 override 可省略,写上也并不会报错,当然再严谨的语法也会有纰漏,大家不需要较真。

相关文章
|
6月前
|
C++
C++:类的补充知识
C++:类的补充知识
34 0
|
Java Scala 开发者
属性的注意事项|学习笔记
快速学习属性的注意事项。
属性的注意事项|学习笔记
|
编译器 Scala 开发者
函数使用注意事项和细节2|学习笔记
快速学习函数使用注意事项和细节2。
|
开发者 Python
继承的注意事项 | 学习笔记
快速学习继承的注意事项,介绍了继承的注意事项系统机制, 以及在实际应用过程中如何使用。
继承的注意事项 | 学习笔记
|
Java 程序员 编译器
覆写字段注意事项和细节说明1|学习笔记
快速学习覆写字段注意事项和细节说明1。
106 0
|
编译器 Scala 开发者
类型匹配的注意事项和细节 | 学习笔记
快速学习类型匹配的注意事项和细节
|
Java 编译器 Scala
主构造器和辅助构造器的细节|学习笔记
快速学习主构造器和辅助构造器的细节。
129 0
|
Java 程序员 Scala
抽象类使用注意事项和细节|学习笔记
快速学习抽象类使用注意事项和细节。
|
Java 编译器 Scala
函数使用注意事项和细节3|学习笔记
快速学习函数使用注意事项和细节3。
|
Java 编译器 Scala
函数使用注意事项和细节1|学习笔记
快速学习函数使用注意事项和细节1。