Scala之高阶面向对象编程

2024-08-31 09:20

本文主要是介绍Scala之高阶面向对象编程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Scala之高阶面向对象编程


文章目录

  • Scala之高阶面向对象编程
    • 写在前面
      • 继承
    • 封装
      • 抽象
    • 单例对象
    • 特质
      • 基本语法
      • 动态混入(方便扩展程序功能)
      • 初始化叠加
      • 功能叠加
    • 扩展


写在前面

  • 操作系统:Windows10
  • JDK版本:jdk1.8
  • Maven版本:Maven-3.5.4
  • Scala版本:Scala-2.12.11
  • IDE工具:IntelliJ IDEA 2019.2.3

继承

和Java一样,Scala中的继承也是单继承,且使用 extends 关键字。

class Person {}class User extends Person {}

构造对象时需要考虑构造方法的执行顺序

封装

封装就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作(成员方法),才能对数据进行访问。

  • 将属性进行私有化

  • 提供一个公共的set方法,用于对属性赋值

  • 提供一个公共的get方法,用于获取属性的值

抽象

  • Scala将一个不完整的类称之为抽象类。
abstract class Person {}
  • Scala中如果一个方法只有声明而没有实现,那么是抽象方法,因为它不完整。
abstract class Person {def test():Unit
}
  • Scala中如果一个属性只有声明没有初始化,那么是抽象属性,因为它不完整。
abstract class Person {var name:String
}
  • 子类如果继承抽象类,必须实现抽象方法或补全抽象属性,否则也必须声明为抽象的,因为依然不完整。
abstract class Person {var name:String
}
class User extends Person {var name : String = "whybigdata"
}

单例对象

  • 所谓的单例对象,就是在程序运行过程中,指定类的对象只能创建一个,而不能创建多个。这样的对象可以由特殊的设计方式获得,也可以由语言本身设计得到,比如object伴生对象

  • Scala语言是完全面向对象的语言,所以并没有静态的操作(即在Scala中没有静态的概念)。但是为了能够和Java语言交互(因为Java中有静态概念),就产生了一种特殊的对象来模拟类对象,该对象为单例对象。若单例对象名与类名一致,则称该单例对象这个类的伴生对象,这个类的所有“静态”内容都可以放置在它的伴生对象中声明,然后通过伴生对象名称直接调用

  • 如果类名和伴生对象名称保持一致,那么这个类称之为伴生类。Scala编译器可以通过伴生对象的apply方法创建伴生类对象。apply方法可以重载,并传递参数,且可由Scala编译器自动识别。所以在使用时,其实是可以省略的。

class User { // 伴生类}object User { // 伴生对象def apply() = new User() // 构造伴生类对象
}......val user1 = new User()// 通过构造方法创建对象
Val user2 = User.apply() // 通过伴生对象的apply方法构造伴生类对象 
val user3 = User() // scala编译器省略apply方法,自动完成调用

特质

Scala将多个类的相同特征从类中剥离出来,形成一个独立的语法结构,称之为“特质”(特征)。这种方式在Java中称之为接口,但是Scala中没有接口的概念。所以scala中没有interface关键字,而是采用特殊的关键字trait来声明特质, 如果一个类符合某一个特征(特质),那么就可以将这个特征(特质)“混入”到类中。这种混入的操作可以在声明类时使用,也可以在创建类对象时动态使用。

基本语法

trait 特质名称

class 类名 extends 父类(特质1) with 特质2 with特质3

trait Operator {}trait DB{}class MySQL extends Operator with DB{}

动态混入(方便扩展程序功能)

object ScalaTrait{def main(args: Array[String]): Unit = {val mysql = new MySQL with Operatormysql.insert()}
}trait Operator {def insert(): Unit = {println("insert data...")}
}class MySQL {}

初始化叠加

object ScalaTrait{def main(args: Array[String]): Unit = {val mysql = new MySQL}
}trait Operator {println("operator...")
}trait DB {println("database...")
}class MySQL extends DB with Operator{println("mysql...")
}

功能叠加

object ScalaTrait {def main(args: Array[String]): Unit = {val mysql: MySQL = new MySQLmysql.operData()}
}trait Operate{def operData():Unit={println("操作数据。。")}
}trait DB extends Operate{override def operData(): Unit = {print("向数据库中。。")super.operData()}
}trait Log extends Operate{override def operData(): Unit = {super.operData()}
}class MySQL extends DB with Log {}

扩展

  • 类型检查和转换
class Person{}object Person {def main(args: Array[String]): Unit = {val person = new Person//(1)判断对象是否为某个类型的实例val bool: Boolean = person.isInstanceOf[Person]if ( bool ) {//(2)将对象转换为某个类型的实例val p1: Person = person.asInstanceOf[Person]println(p1)}//(3)获取类的信息val pClass: Class[Person] = classOf[Person]println(pClass)}
}
  • 枚举类和应用类
object Test {def main(args: Array[String]): Unit = {println(Color.RED)}
}// 枚举类
object Color extends Enumeration {val RED = Value(1, "red")val YELLOW = Value(2, "yellow")val BLUE = Value(3, "blue")
}// 应用类
object AppTest extends App {println("application");
}
  • Type定义新类型

使用type关键字可以定义新的数据数据类型名称,本质上就是类型的一个别名

object Test {def main(args: Array[String]): Unit = {type S = Stringvar v : S = "xyz"}
} 

全文结束!

这篇关于Scala之高阶面向对象编程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1123503

相关文章

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

如何掌握面向对象编程的四大特性、Lambda 表达式及 I/O 流:全面指南

这里写目录标题 OOP语言的四大特性lambda输入/输出流(I/O流) OOP语言的四大特性 面向对象编程(OOP)是一种编程范式,它通过使用“对象”来组织代码。OOP 的四大特性是封装、继承、多态和抽象。这些特性帮助程序员更好地管理复杂的代码,使程序更易于理解和维护。 类-》实体的抽象类型 实体(属性,行为) -》 ADT(abstract data type) 属性-》成

Java基础回顾系列-第二天-面向对象编程

面向对象编程 Java类核心开发结构面向对象封装继承多态 抽象类abstract接口interface抽象类与接口的区别深入分析类与对象内存分析 继承extends重写(Override)与重载(Overload)重写(Override)重载(Overload)重写与重载之间的区别总结 this关键字static关键字static变量static方法static代码块 代码块String类特

Python中的私有属性与方法:解锁面向对象编程的秘密

在Python的广阔世界里,面向对象编程(OOP)是一种强大而灵活的方法论,它帮助我们更好地组织代码、管理状态,并构建可复用的软件组件。而在这个框架内,私有属性与方法则是实现封装的关键机制之一。它们不仅有助于隐藏类内部的具体实现细节,还能保护数据免受外部干扰。今天,让我们一起探索Python中私有属性与方法的魅力所在,了解它们如何在实际开发中发挥重要作用。 引言 随着软件系统变得越来越复杂,维

【网络安全】服务基础第二阶段——第二节:Linux系统管理基础----Linux统计,高阶命令

目录 一、Linux高阶命令 1.1 管道符的基本原理 1.2 重定向 1.2.1 输出重定向 1.2.2 输入重定向 1.2.3 wc命令基本用法 1.3 别名 1.3.1 which命令基本语法 1.3.2 alias命令基本语法 1.4 压缩归档tar 1.4.1 第一种:gzip压缩 1.4.2 第二种:bzip压缩 1.5 tar命令 二、VIM编辑器使用

Kotlin高阶函数与Lambda表达式及内联函数的介绍

目录 1、高阶函数1.1、什么是高阶函数?1.1.1、不带返回值的高阶函数1.1.2、带参数且带返回值的高阶函数1.1.3、与一般的函数进行比较 1.2、如何使用?1.3、高阶函数有什么作用? 2、Lambda表达式2.1、什么是Lambda表达式?2.1.1、无参数的写法2.1.2、有参数的写法2.1.3、有参数且有返回值的写法 2.2、如何使用?2.3、Lambda表达式有什么作用? 3

Javascript中的高阶函数

其实高阶函数(Higher-Order Function)并不是什么神秘的概念,在开发中我们已经经常在用,高阶函数的概念是这样的:函数可以作为参数被传递,或者函数可以作为返回值输出这样的一个函数就叫高阶函数,这也是为什么在JavaScript中函数被称为一等公民的原因,可能概念不太好理解,我们接着往下看: 1、map, forEach,reduce,filter,sort 等数组的操

面向对象编程 和 面向过程编程 介绍

面向对象编程(Object-Oriented Programming,OOP)和面向过程编程(Procedural Programming,PP)是两种常见的编程范式。它们各自有不同的设计理念、代码组织方式和适用场景。以下是对这两种编程范式的详细介绍。 1. 面向对象编程(OOP) 面向对象编程是一种以对象为核心的编程范式,它将程序结构化为一组对象,这些对象具有特定的属性(数据)和行为(方法)

【scala 安装错误】错误: 找不到或无法加载主类 scala.tools.nsc.MainGenericRunner

错误: 找不到或无法加载主类 scala.tools.nsc.MainGenericRunner 原因: Scala安装路径中包含空格。 解决办法:scala 不要安装在E:\Program Files 这种有空格的目录下,简直坑

从二叉树看类,对象和面向对象编程

一句话 对象就是活的类 对象在函数里面活动执行任务 本身的自带属性或者行为是在类里面提前定义好的 二叉树来看: 实际上,递归函数里面的root就是类的活体,本来这个类就是一个节点的类里面有三个属性,root就是类的活体,是root赋予类生命,让root能在递归函数里面成为能够动态执行函数的节点,如果没有root,类就是死的,只是一个设计图,所以可以任意调用类里面的属性 所以二叉树递归函数里面的