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

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

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

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


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

 

覆写字段的注意事项和细节

1def 只能重写另一个 def(即:方法只能重写另一个方法)

2val 只能重写另一个 val 属性或重写不带参数的 def[案例+分析]

如果加入了 def,就不存在重写的概念了。

在 scala 里面属性方法重写在一定程度上是等价的。

class AAAA {  

var name: String = ""

}

class BBBB extends AAAA {

override val name: String =“jj"

}

这段代码正确吗?

上面有 AAAA 的父类,下面有 BBBB,上面是 var,下面是 val 而且还有 override,这段代码是不通过的。

如果这段代码可以,那么上面的 name 会生成两个公开方法,一个是 name 设置的方法,一个是name获取的方法,下面是 val,所以只能生成一个 get方 法。那么就会出现:

假如有一个 BBBB 的对象,在得对象的时候用的是 BBBB 的方法,设置的时候用的是父类的方法,就很容易造成逻辑上的混乱。

创建一个 object 类型的文件名为 FiledOverrideDetail,将代码引入:

package com. atguigu. chapter07. myextends

object FiledoverrideDetail {

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

println(" 'xxx" )

}

class AAAA {  

var name: String = ""

}

class BBBB extends AAAA {

override val name: String =“jj"

}

运行看会不会报错,有些时候在 Scala 里语法没有报错,但是执行的时候就会出现问题:

Error:(13, 17) overriding variable name in class AAAA of type String;

value name cannot override a mutable variable

override val name: String = “jj”

如果代码成立:

var name: String = ""底层会生成 public name()和 public name $eq()

override val name: String =“jj"底层会生成 public name() 这样就把上面的方法覆写了。

那么就会出现,比如:val bbbb = new BBBB,假如程序员在使用 bbbb.name=“jack”相当于调用了父类的name $eq()

在读取时:println(bbbb.name)相当于调用了子类的 name(),这样编译器就会出现数据设置和数据获取不一致。

class A {

def sal(): Int = {

return 10

}}

class B extends A{

override val sal :Int = 0

}

这段代码是可以的,因为学习完方法的重写就要清楚它的本质,override val sal :Int = 0

它的本质是会在 B 里面生成一个 public 类型的 get 方法,就可以形成重写的关系,也就是这里看起来是属性,但是属性居然把父类的方法重写了,所以 Scala 就有一个和 java 思路上的转变。

说明val只能重写另外一个 val 属性。如果 val age 改成 var 就会报错。

新建一个类型为 object 类型的文件名为

ScalaFieldoverridedetail02,将代码引入:

package com. atguigu. chapter07. myextends

object ScalaFieldoverrideDetail02 {

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

println(" 'xxx" )

}

class AAAAA {

def sal(): Int = {

return 10

}}

class BBBBB extends AAAAA{

override val sal :Int = 0

}

代码没有任何问题,运行:

D: \program\jdk8\bin\java

Xxx

Process finished with exit code 0

现在创建一个bbbbb的对象:

val bbbbb=new BBBBB( )

println(bbbbb. sal)    

因为是动态绑定机制,所以返回的还是 override val sal :Int = 00,底层有一个 public sal

运行:

D: \program\jdk8\bin\java

XXx

0

Process finished with exit code 0

返回的是0.

假如现在有一个 b2

valb2:AAAAA =new BBBBB( )

println("b2.sal=" +b2.sal())

虽然写的是 AAAAA,但是调用的还是 override val sal :Int = 0,因为有动态绑定机制所以返回的还是0

运行:

D: \program\jdk8\bin\java

XXx

0

B2.sal:0

Process finished with exit code 0

所以一定要考虑 scala 底层的机制。

相关文章
|
虚拟化 数据中心 异构计算
GPU 虚拟化技术MIG简介和安装使用教程
使用多实例GPU (MIG/Multi-Instance GPU)可以将强大的显卡分成更小的部分,每个部分都有自己的工作,这样单张显卡可以同时运行不同的任务。本文将对其进行简单介绍并且提供安装和使用的示例。
1240 0
|
前端开发 Java Maven
Eclipse里使用Servlet实现简单的登录功能
Maven是一款非常方便的Java开发插件,它可以自动管理好开发过程中需要的jar包,提升开发者们的开发效率。在这里,我手把手教给大家如何新建一个Maven项目,并实现简单的用户登录功能。
335 0
|
10月前
|
机器学习/深度学习 计算机视觉 iOS开发
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 RepViT 轻量级的Vision Transformers架构
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 RepViT 轻量级的Vision Transformers架构
600 0
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 RepViT 轻量级的Vision Transformers架构
|
Java 程序员 数据库连接
Java执行顺序大揭秘:静态块、非静态块和构造方法谁先谁后?
本文详细介绍了Java中的初始化块,包括静态初始化块和非静态初始化块的概念、执行顺序和实际应用场景。通过具体示例,帮助读者理解这两种初始化块的区别和使用场景,让面试官对你刮目相看。
149 0
Java执行顺序大揭秘:静态块、非静态块和构造方法谁先谁后?
|
11月前
|
人工智能 JSON 测试技术
Search-o1:人大清华联合推出动态检索推理框架,使模型能够在推理过程中动态检索外部知识
Search-o1 是中国人民大学和清华大学联合推出的创新框架,通过动态知识检索和精炼,提升大型推理模型在复杂任务中的推理能力。
483 23
Search-o1:人大清华联合推出动态检索推理框架,使模型能够在推理过程中动态检索外部知识
|
XML 缓存 数据库
Discuz! X3.0 版本的数据库字典
Discuz! X3.0 版本的数据库字典
221 0
mybatis复习01,简单配置让mybatis跑起来
文章介绍了MyBatis的基本概念、历史和特点,并详细指导了如何配置MyBatis环境,包括创建Maven项目、添加依赖、编写核心配置文件、创建数据表和实体类、编写Mapper接口和XML配置文件,以及如何编写工具类和测试用例。
mybatis复习01,简单配置让mybatis跑起来
|
JavaScript 前端开发 数据库
测试开发之路--Flask 之旅 (三):数据库
本文介绍了在 Flask 应用中实现权限管理的过程,包括使用 Flask-SQLAlchemy、Flask-MySQLdb、Flask-Security 和 Flask-Login 等扩展模块进行数据库配置与用户权限设置。首先创建数据库并定义用户、环境和角色模型,接着通过 Flask-Security 初始化用户和角色,并展示了如何便捷地管理权限。后续将深入探讨权限控制的具体应用。
290 4
测试开发之路--Flask 之旅 (三):数据库
|
开发框架 Java Android开发
JNI中调用Java函数
JNI中调用Java函数
196 0
|
开发框架 Dart JavaScript
深入探讨Flutter中的Web支持功能,以及如何利用Flutter构建跨平台Web应用的最佳实践
【6月更文挑战第11天】Flutter,Google的开源跨平台框架,已延伸至Web支持,让开发者能用同一代码库构建移动和Web应用。Flutter Web基于Dart转JavaScript,利用WebAssembly和JavaScript在Web上运行。构建Web应用最佳实践包括选择合适项目、优化性能、进行兼容性测试和利用Flutter的声明式UI、热重载等优势。尽管性能挑战存在,Flutter Web为跨平台开发提供了更多机会和潜力。
439 1