面向对象

一、Scala包
1、基本语法
package 包名
2、Scala 包的三大作用(和 Java 一样)
(1)区分相同名字的类
(2)当类很多时,可以很好的管理类
(3)控制访问范围
二、包说明
1、说明
Scala 有两种包的管理风格,一种方式和 Java 的包管理风格相同,每个源文件一个包(包名和源文件所在路径不要求必须一致),包名用“.”进行分隔以表示包的层级关系
2、案例实操:
// 定义父包
package com {
  // 父包中的对象
  object Parent {
    val parentValue: String = "I'm from parent package"
  }
  // 定义子包
  package child {
    // 子包中的对象
    object Child {
      def main(args: Array[String]): Unit = {
        // 子包访问父包内容,无需导包
        println(Parent.parentValue) 
      }
    }
  }
}
// 另一个包,尝试访问 com 包下的内容
package other {
  // 这里访问 com 包下子包内容,需要导包
  object TryAccess {
    def main(args: Array[String]): Unit = {
      // 先导入 com.child.Child
      import com.Parent
      println(Parent.parentValue) 
    }
  }
}

三、导包说明
1、和 Java 一样,可以在顶部使用 import 导入,在这个文件中的所有类都可以使用。
2、局部导入:什么时候使用,什么时候导入。在其作用范围内可以用
3、通配符导入:import java.util._
4、给类起名:import java.util.{ArrayList=>JL}
5、导入相同包的多个类:import java.util.{HashSet, ArrayList}
6、屏蔽类:import java.util.{ArrayList =>_,_}
7、导入包的绝对路径:new _root_.java.util.HashMap
四、属性
案例实操:
package com.example.demo

import scala.beans.BeanProperty

// 定义一个员工类
class Employee {
  // 可变属性,员工姓名
  var name: String = "Alice"
  // 未初始化的可变属性,员工年龄,后续可赋值
  var age: Int = 0
  // 使用@BeanProperty注解,会自动生成setter和getter方法
  @BeanProperty var department: String = "Engineering"
}
object Employee {
  def main(args: Array[String]): Unit = {
    val employee = new Employee()
    println(employee.name)
    // 设置年龄
    employee.age = 30
    println(employee.age)
    // 使用自动生成的setter方法修改部门
    employee.setDepartment("Marketing")
    // 使用自动生成的getter方法获取部门
    println(employee.getDepartment())
  }
}

五、权限访问
1、说明
在 Java 中,访问权限分为:public,private,protected 和默认。在 Scala 中,你可以通过类似的修饰符达到同样的效果。但是使用上有区别。
(1)Scala 中属性和方法的默认访问权限为 public,但 Scala 中无 public 关键字。
(2)private 为私有权限,只在类的内部和伴生对象中可用。
(3)protected 为受保护权限,Scala 中受保护权限比 Java 中更严格,同类、子类可以访问,同包无法访问。
(4)private[包名]增加包访问权限,包名下的其他类也可以使用
2、案例实操:
// 定义动物类
class Animal {
  private var species: String= "Dog" // 私有属性,动物种类
  protected var age: Int = 3 // 受保护属性,年龄

  def speak(): Unit = {
    println(s"I'm a $species")
  }
}
object Animal {
  def main(args: Array[String]): Unit = {
    val animal = new Animal()
    animal.speak()
    // 以下直接访问私有属性会报错
    // println(animal.species) 
    // 以下直接访问受保护属性会报错
    // println(animal.age) 
  }
}
// 定义狗类,继承自动物类
class Dog extends Animal {
  def checkAge(): Unit = {
    // 子类可访问父类受保护属性
    println(s"My age is $age")
    // 子类不能直接访问父类私有属性
    // println(this.species) 
  }
}

六、构建器
和 Java 一样,Scala 构造对象也需要调用构造方法,并且可以有任意多个构造方法。Scala 类的构造器包括:主构造器和辅助构造器
1、说明
(1)辅助构造器,函数的名称 this,可以有多个,编译器通过参数的个数及类型来区分。
(2)辅助构造方法不能直接构建对象,必须直接或者间接调用主构造方法。
(3)构造器调用其他另外的构造器,要求被调用构造器必须提前声明。
2、案例实操
// 定义一个书籍类
class Book {
  // 定义书籍的属性
  var title: String = _
  var author: String = _
  var pages: Int = _
  // 主构造器,无参数时小括号可省略
    println("主构造器被调用")
  }
  // 第一个辅助构造器,接受页数参数
  def this(pages: Int) {
    this()
    this.pages = pages
    println(s"辅助构造器(传入页数:$pages)被调用")
  }
  // 第二个辅助构造器,接受标题和作者参数
  def this(title: String, author: String) {
    this()
    this.title = title
    this.author = author
    println(s"辅助构造器(传入标题:$title,作者:$author)被调用")
  }

  // 第三个辅助构造器,接受标题、作者和页数参数
  def this(title: String, author: String, pages: Int) {
    this(title, author)
    this.pages = pages
    println(s"辅助构造器(传入标题:$title,作者:$author,页数:$pages)被调用")
  }
}
object Book {
  def main(args: Array[String]): Unit = {
    // 使用不同构造器创建对象
    val book1 = new Book(200)
    val book2 = new Book("Scala Programming", "Martin Odersky")
    val book3 = new Book("Effective Scala", "Josh Suereth", 300)
  }
}

七、继承和多态
1、基本语法
(1)子类继承父类的属性和方法
(2)scala 是单继承
2、案例实操
// 定义一个形状类,作为父类
class Shape(color: String) {
  var shapeColor: String = color
  var area: Double = _

  def this(color: String, sideLength: Double) {
    this(color)
    this.area = calculateArea(sideLength)
    println("父类辅助构造器")
  }

  private def calculateArea(sideLength: Double): Double = {

    sideLength * sideLength
  }

  println("父类主构造器")
}

// 定义一个正方形类,继承自形状类,作为子类
class Square(color: String, sideLength: Double) extends Shape(color, sideLength) {
  var side: Double = sideLength

  def this(color: String, sideLength: Double, additionalInfo: String) {
    this(color, sideLength)
    println(s"子类辅助构造器,额外信息:$additionalInfo")
  }

  println("子类主构造器")
}

object ShapeExample {
  def main(args: Array[String]): Unit = {
    val square = new Square("Red", 5.0, "This is a square")
  }
}
 

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

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

相关文章

MySQL多表联查

一、数据库表结构 假设我们有两个表:users 和 orders,users 表存储用户信息,orders 表存储订单信息,一个用户可以有多个订单,通过 user_id 关联两个表。 users 表 字段名数据类型描述user_idINT用户 ID,…

如何迁移AxureCloud到新服务器?

前言 常有朋友遇到在更换服务器时或者本地AxureCloud迁移到服务器上时,如何正确迁移AxureCloud,让原有的原型可以正常访问呢? 事前准备 Navicat:用于迁移数据库。 AxureCloud:和原安装版本一致。 MySQL&#xff1…

CSGO 皮肤交易平台后端 (Spring Boot) 代码结构与示例

csgo-market/ ├── pom.xml (or build.gradle) └── src/└── main/├── java/│ └── com/│ └── yourcompany/│ └── csgomarket/│ ├── CsgomarketApplication.java # Spring Boot 启动类│ ├── conf…

mac Python多版本第三方库的安装路径

终端查看python版本是 3.12,但是pycharm使用的python版本是 3.9 终端正常安装包以后,pycharm都可以正常使用,但是将 pycharm的python换成 3.12 版本,之前安装的库都没有了 通过终端查看安装库的位置,确实是安装到py…

Java常用异步方式总结

使用建议 完整代码见https://gitee.com/pinetree-cpu/parent-demon 提供了postMan调试json文件于security-demo/src/main/resources/test_file/java-async.postman_collection.json 可导入postMan中进行调试 Java异步方式以及使用场景 继承Thread类 新建三个类继承Thread&…

【VUE3】Pinia

目录 0前言 1 手动添加Pinia 2 创建与使用仓库(Setup Store 组合式) 2.1 创建仓库 2.2 使用仓库数据 2.3 解构响应式数据 3 持久化插件 0前言 官网:Pinia | The intuitive store for Vue.js 1 手动添加Pinia 上手之后,可…

JVM 每个区域分别存储什么数据?

JVM(Java Virtual Machine)的运行时数据区(Runtime Data Areas)被划分为几个不同的区域,每个区域都有其特定的用途和存储的数据类型。以下是 JVM 各个区域存储数据的详细说明: 1. 程序计数器 (Program Cou…

C++中shared_ptr 是线程安全的吗?

在 C 中,shared_ptr 的线程安全性和实现原理可以通过以下方式通俗理解: 1. shared_ptr 是线程安全的吗? 答案:部分安全,需分场景! 安全的操作: 引用计数的增减:多个线程同时复制或销…

什么是 CSSD?

文章目录 一、什么是 CSSD?CSSD 的职责 二、CSSD 是如何工作的?三、CSSD 为什么会重启节点?情况一:网络和存储都断联(失联)情况二:收到其他节点对自己的踢出通知(外部 fencing&#…

arm64平台下linux访问寄存器

通用寄存器 示例:读取寄存器值 // 用户态程序或内核代码中均可使用 unsigned long reg_value; asm volatile ("mov %0, x10" // 将X10的值保存到reg_value变量: "r" (reg_value) ); printk("X10 0x%lx\n", reg_value);示例&…

超级好用的小软件,连接电脑和手机。

将手机变成电脑摄像头的高效工具Iriun Webcam是一款多平台软件,能够将手机摄像头变成电脑的摄像头,通过简单的设置即可实现视频会议、直播、录制等功能。它支持Windows、Mac和Linux系统,同时兼容iOS和Android手机,操作简单&#x…

Mysql MIC高可用集群搭建

1、介绍 MySQL InnoDB Cluster(MIC)是基于 MySQL Group Replication(MGR)的高可用性解决方案,结合 MySQL Shell 和 MySQL Router,提供自动故障转移和读写分离功能,非常适合生产环境 2、部署 …

PERL开发环境搭建>>Windows,Linux,Mac OS

特点 简单 快速 perl解释器直接对源代码程序解释执行,是一个解释性的语言, 不需要编译器和链接器来运行代码>>速度快 灵活 借鉴了C/C, Basic, Pascal, awk, sed等多种语言, 定位于实用性语言,既具备了脚本语言的所有功能,也添加了高级语言功能 开源.免费 没有&qu…

ubuntu改用户权限

在 Linux 系统中,赋予普通用户 sudo 权限可以让他们执行一些需要 root 权限的命令,而不需要频繁切换到 root 用户。以下是具体步骤: 创建用户(useradd和adduser两种方式) 首先,需要创建一个新的用户。可以使用 adduser 或 usera…

蓝桥杯 web 学海无涯(axios、ecahrts)版本二

答案: // TODO: 待补充代码// 初始化图表的数据,设置周视图的初始数据 option.series[0].data [180, 274, 253, 324, 277, 240, 332, 378, 101]; // 周数据(每周的总学习时长) option.xAxis.data ["2月第1周", "…

Java 大视界 -- Java 大数据在智慧文旅虚拟场景构建与沉浸式体验增强中的技术支撑(168)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

API vs 网页抓取:获取数据的最佳方式

引言 在当今数字化时代,对于企业、研究人员以及开发人员而言,获取准确且及时的数据是大多数项目成功的关键因素。目前,收集网页数据主要有两种常用方法,即使用 API(应用程序接口)和网页抓取。然而&#xf…

车载以太网网络测试-25【SOME/IP-报文格式-1】

目录 1 摘要2 SOME/IP-报文格式2.1 **Service ID / 16 bits**2.2 **Method ID / Event ID / 16 bits**2.3 **Length / 32 bits**2.4 **Client ID / 16 bits**2.5 Session ID / 16 bits2.6 Protocol Version / 8 bits2.7 Interface Version / 8 bits2.8 Message Type / 8 bits2.…

Python数据可视化-第3章-图表辅助元素的定制

环境 开发工具 VSCode库的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本书为《Python数据可视化》一书的配套内容,本章为第3章-图表辅助元素的定制 本章主要介绍了图表辅助元素的定制,包括认识常用的辅助元素、设置坐标轴的标签、设置刻度范…

小程序30-wxml语法-声明和绑定数据

小程序页面中使用的数据均需要在Page() 方法的 data对象中进行声明定义 在将数据声明好以后,在 WXML 使用 Mustache 语法 ( 双大括号{{ }} ) 将变量包起来,从而将数据绑定 在 {{ }} 内部可以做一些简单的运算,支持如下几种方式: 算数运算三…