Scala学习(五)---面向对象

news2024/12/23 23:29:26

文章目录

  • 1.Scala面向对象的构造器
      • 1.1 主构造器和从构造器(辅助构造器)
      • 1.2 主构造器参数
  • 2.继承
      • 2.1 抽象属性和方法
      • 2.2 匿名子类

1.Scala面向对象的构造器

1.1 主构造器和从构造器(辅助构造器)

//主构造器
class ConstructorTest(name:String) {
  //主构造器调用
  val name1:String=name;

  //辅助构造器,也叫从构造器
  def this()={
    //辅助构造器必须在第一行代码
    //直接或者间接的调用主构造器
    this("mao")//加载主构造器
    println("辅助构造器调用")
  }
}

object ConstructorTest{
  def main(args: Array[String]): Unit = {
    //主构造器
    var masterCons=new ConstructorTest("maomao")
    println(masterCons.name1)

    //辅助构造器
    var slaveCons=new ConstructorTest()
    println(slaveCons.name1)
  }
}

运行效果:
在这里插入图片描述
辅助构造器可以进行重载
第二个辅助构造器调用第一个辅助构造器
在这里插入图片描述

1.2 主构造器参数

a.如果参数使用val或者var来修饰,那么会将参数作为属性来使用

class ConsParams(var age:Int) {

}
object ConsParams{
  def main(args: Array[String]): Unit = {
    val consParams = new ConsParams(18)
    println(consParams.age)
  }
}

在这里插入图片描述
b.在样例类中,默认会将参数转换为属性来用,默认修饰为val,如果是var需要手动添加

case class ConsParams(var age:Int,name:String) {

}
object ConsParams{
  def main(args: Array[String]): Unit = {
    val consParams = new ConsParams(18,"zhangsan")
    println(consParams.age)
    println(consParams.name)
  }
}

运行结果如下:
在这里插入图片描述

2.继承

定义一个父类Person05,再定义一个子类Student05,在如下代码中,子类继承的父类的从构造器。

/**
 * Scala面向对象继承学习
 */
object InheritTest{
  def main(args: Array[String]): Unit = {
    val student0 = new Student05("zhangsan")

  }
}
class Person05()
{
  println("父类构造器")
  //使用默认值进行初始化,String类型的为空
  var name:String=_

  def this(name:String) = {
    this()
    println("父类的辅助构造器")
    this.name=name;
    }
}

class Student05(name:String) extends Person05(name :String)
{
  println("子类的主构造器")

  def this(name:String,age:Int)={
    this(name)
    println("子类的从构造器")
    
  }
}

要点:
1.子类在继承父类的时候,子类的主构造器的参数要大于或者等于父类构造器的参数
2.scala继承的本质就是:子类继承父类的一个构造器

2.1 抽象属性和方法

a.如果父类为抽象类,那么子类需要将抽象抽象的属性和方法实现,否则子类也需要声明为抽象类

abstract class Person06{
  //抽象属性
  //抽象属性本质就是不写等号
  val name:String
  val age:Int
  
  //抽象方法
  def sayHi():Unit
}

class Student06 extends Person06{
  override val name: String = "李四"
  override val age: Int = 18

  override def sayHi(): Unit = 
    {
      println("Hi")
    }
}

//测试代码
    val student01 = new Student06
    println(student01.name)
    println(student01.age)
    println(student01.sayHi())

结果:
在这里插入图片描述
b.重写非抽象属性需要用override来修饰,重写抽象方法可以不加override,非抽象方法需要加override
c.子类中调用父类的方法,需要使用super关键字

class TestInherit01 {

}
object TestInherit01{
  def main(args: Array[String]): Unit = {
    val children0 = new Children01
    println(children0.sayHi())
  }
}

class Father01()
{
  def sayHi()={
    println("hello world!")
  }
}
class Children01() extends Father01()
{
  override def sayHi()={
    super.sayHi();
    println("子Helloworld")
  }
}

在这里插入图片描述
d.子类对抽象属性进行重写,父类抽象属性可以使用var来修饰
子类对非抽象属性进行重写,父类非抽象属性只支持val而不支持var

因为var本来就可以对变量值进行修改,重写是无意义的

e.scala中属性和方法都是动态绑定的,而java中只有方法是动态绑定的
即多态:此多态与java中多态不同
当我们在java中使用多态的时候,属性打印的是父类的属性值,方法是子类的,而使用scala完成多态时,属性与方法打印的都是子类的。

class Test_Poly {

}
object Test_Poly{
  def main(args: Array[String]): Unit = {
    val student0 = new Student08
    println(student0.name)
    println(student0.sayHi())
  }
}
class Person08(){
  val name:String ="person"
  def sayHi(): Unit = {
    println("Hi person")
  }
}
class Student08() extends Person08(){
  override val name: String = "student"
  override def sayHi()={
    println("Hi Student")
  }
}

运行结果:
在这里插入图片描述

2.2 匿名子类

可以使用匿名子类来调用抽象类

class TestNom {

}
object TestNom{
  def main(args: Array[String]): Unit = {
    val per: Person09 = new Person09 {
      override val name: String = "zhangsan"

      override def sayHi(): Unit = println("hello")
    }
    println(per.name)
    println(per.sayHi())
  }
}

abstract class Person09{
  val name:String
  def sayHi()
}

运行结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/555767.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MyBatis框架】

文章目录 Mybatis1.简介1.1MyBatis历史1.2MyBatis特性1.3MyBatis下载1.4和其它持久化层技术对比 2.搭建MyBatis2.1创建maven工程2.2创建MyBatis的核心配置文件2.3创建mapper接口2.4创建实体类2.5创建MyBatis的映射文件2.6通过junit测试功能2.7加入log4j日志功能2.8MyBatis的增删…

pytorch的学习与总结(第二次组会)

pytorch的学习与总结 一、pytorch的基础学习1.1 dataset与dataloader1.2 可视化工具(tensorboard)、数据转换工具(transforms)1.3 卷积、池化、线性层、激活函数1.4 损失函数、反向传播、优化器1.5 模型的保存、加载、修改 二、 pytorch分类项目实现2.1 网络模型2.2 具体代码 一…

新星计划2023【《计算之魂》读书会】学习方向报名入口!

前排提醒:这里是新星计划2023【《计算之魂》读书会】学习方向的报名入口,一经报名,不可更换。 ↓↓↓报名方式:(下滑到本页面底部) 一、关于本学习方向导师 博客昵称:异步社区博客主页&#x…

AI大模型时代,云从科技携“从容大模型”入场如何“从容”?

5月18日,在“AI赋能数字中国产业论坛暨2023云从科技人机协同发布会”上,云从科技自研“从容大模型”正式亮相。 根据发布会信息,“从容大模型”具备问答、阅读理解、文学创作以及解题方面的能力。受发布会消息影响,5月18日午间休盘…

【libdatachannel】cmake+vs2022 构建

libdatachannel libdatachannel 是基于c++17实现的构建 OpenSSL 找不到 Selecting Windows SDK version 10.0.22000.0 to target Windows 10.0.22621. The CXX compiler identification is MSVC 19.35.32217.1 Detecting CXX compiler ABI info Detecting CXX compiler ABI inf…

利用GPIO线进行板间通信-23-5-22

本项目基于VU9P(xcvu9pflga2105)板卡以及ZYNQ(xc7z015clg485) 简单结构流程介绍: 1.上位机通过千兆网将指令下发到ZYNQ,ZYNQ进行解帧,将数据解析出来后存储到RAM中,RAM将数据不断输送给GPIO模块,GPIO模块根据对应地址输出数据是…

新来的00后实习生太牛了,已经被取代了.....

前几天有个朋友向我哭诉,说她在公司工作(软件测试)了7年了,却被一个00后实习生代替了,该何去何从? 这是一个值得深思的问题,作为职场人员,我们确实该思考,我们的工作会被…

1718_Linux命令模式下查看日历

全部学习汇总: GreyZhang/bash_basic: my learning note about bash shell. (github.com) 前面发布了一份学习笔记,涉嫌过渡宣传,虽然我也没搞懂为什么。有一系列修改建议,我觉得直接放弃了。还是发一份新的吧! Linux命…

【数据结构】哈希底层结构

目录 一、哈希概念 二、哈希实现 1、闭散列 1.1、线性探测 1.2、二次探测 2、开散列 2.1、开散列的概念 2.2、开散列的结构 2.3、开散列的查找 2.4、开散列的插入 2.5、开散列的删除 3、性能分析 一、哈希概念 顺序结构以及平衡树中,元素关键码与其存储位…

如何用Postman做接口自动化测试?

本文适合已经掌握 Postman 基本用法的读者,即对接口相关概念有一定了解、已经会使用 Postman 进行模拟请求等基本操作。 工作环境与版本: Window 7(64位)Postman (Chrome App v5.5.3) P.S. 不同版本页面 U…

JAVA—实验4 继承、接口与多态

一、实验目的 掌握类的继承机制掌握接口的定义方法熟悉成员方法或构造方法多态性 二、实验内容 1.卖车-接口与多态编程 【问题描述】 (1) 汽车接口(Car):有两个方法, getName()、getPrice()(接口源文件可以自己写,也…

2024总统大选,成为“关乎比特币未来的公投”?背后是怎样的政治抱负?

在今年的迈阿密比特币大会上,Robert F.Kennedy Jr和Vivek Ramaswamy相继发布声明表示,他们将在2024年初选前接受比特币(BTC)的捐款。 RFK Jr作为美国前总统约翰肯尼迪的侄子,是第一个公开接受Crypto的总统候选人&#…

chatgpt赋能Python-pythons_9_98_987

用Python计算s998987的方法及重要性分析 介绍 Python是一种开源的高级编程语言,它被广泛应用于数据处理、web开发和人工智能等领域。它的简洁、易读易写的语法使得很多程序员喜爱使用它来完成各种工作。本文将介绍如何用Python计算一个简单的数学表达式&#xff1…

微服务基础环境搭建--和创建公用模块

目录 微服务基础环境搭建 创建父工程,用于聚合其它微服务模块 创建父项目, 作为聚合其它微服务模块 项目设置​编辑 ​编辑 删除src, 保留一个纯净环境​编辑 1. 配置父工程pom.xml, 作为聚合其它模块 2、修改e-commerce-center\pom.xml,删除不需要的配置节…

Java.lang.NoClassDefFoundError: org/apache/logging/log4j/util/ReflectionUtil

具体问题描述如下: SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/D:/maven/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.6.2/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class] SL…

【Spring - beans】 BeanDefinition 源码

目录 1. BeanDefinition 1.1 AbstractBeanDefinition 1.2 RootBeanDefinition 1.3 ChildBeanDefinition 1.4 GenericBeanDefinition 2. BeanDefinitionReader 2.1 AbstractBeanDefinitionReader 2.2 XmlBeanDefinitionReader 2.3 GroovyBeanDefinitionReader 2.4 Pro…

(跨模态)AI作画——使用stable-diffusion生成图片

AI作画——使用stable-diffusion生成图片 0. 简介1. 注册并登录huggingface2. 下载模型3. 生成 0. 简介 自从DallE问世以来,AI绘画越来越收到关注,从最初只能画出某些特征,到越来越逼近真实图片,并且可以利用prompt来指导生成图片…

软件测试面试题——数据库知识

1、要查询每个商品的入库数量,可以使用以下SQL语句: SELECT 商品编号, SUM(入库数量) AS 入库数量 FROM Stock GROUP BY 商品编号;这将从Stock表中选择每个商品的入库数量,并使用SUM函数对入库数量进行求和。结果将按照商品编号进行分组&…

数据宝藏与精灵法师:探秘Elf擦除魔法的奇幻故事

在数字领域的奇幻王国中,大家视数据为宝藏。作为奇幻王国的国王,在他的宝库中,自然是有着无数的数据宝藏。这么多的数据宝藏,却让国王发难了。因为宝库有限,放不下这么多数据宝藏。因此,国王广招天下的精灵…

【备战秋招】每日一题:3月18日美团春招第三题:题面+题目思路 + C++/python/js/Go/java带注释

2023大厂笔试模拟练习网站(含题解) www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据,挂载到我们的OJ上,供大家学习交流,体会笔试难度。现已录入200道互联网大厂模拟练习题&…