当前位置: 首页 > article >正文

8.Scala面向对象编程

概述

在这里主要了解Scala中的类、对象和接口

  • Scala中类和java中的类基本是类似的
  • Scala中的对象是需要定义的,而java中的对象是通过class new出来的
  • Scala中的接口是traitjava中的接口是interface

相关链接

阅读之前,可以浏览一下

scala相关文章

类-class

class 前面以前已经详细说明,点此链接浏览

scala类
scala辅助构造器与为构造函数提供默认值(一)

对象-object

前面的scala中的classjava中的class是类似的,下面来看一个java中没有的内容,叫object
可能有疑问了,Java中也有object,通过class就可以创建object
但是注意了,在scala中,我们可以直接定义一个object,就像定义class一样。

  • object:相当于class的单个实例,通常在里面放一些静态的field或者method
  • object不能定义带参数的constructor只有空参的constructor
  • 第一次调用object的方法时,会执行object的constructor,也就是执行object内部不在任何方法中的代码,因为它只有空参的构造函数
    但是注意,object的constructor的代码只会在他第一次被调用时执行一次,以后再次调用就不会再执行了
  • object通常用于作为单例模式的实现,或者放class的一些静态成员,比如工具方法
  • object可以直接使用,不能new
  • 创建一个object,使用object关键字
object Person {
  var age = 1
  println("this Person object!")
  def getAge  = age 
}

在这里插入图片描述

伴生对象

前面了解了classobject,那下面再来看一个特殊的概念,伴生对象
如果有一个class,还有一个与class同名的object,那么就称这个objectclass伴生对象classobject伴生类

注意: 伴生类和伴生对象必须存放在一个.scala文件之中
伴生类中可以访问伴生对象中的private field

创建一个Person objectPerson class

package com.fun.scala

class Person(val name:String,val age:Int) {

  private val strM ="测试"
  def sayHello = println("Hi, " + name + ",you are " + age + " years old!" + ", and you  have " + Person.fdNum+ " friend.")

}

object Person{
  private val fdNum =1
  def getFdNum = fdNum

  def main(args: Array[String]): Unit = {
    new Person("long",33).sayHello
  }
}		

在这里插入图片描述

apply

applyobject中非常重要的一个特殊方法,通常在伴生对象中实现apply方法,并在其中实现构造伴生类对象的功能
在创建对象的时候,就不需要使用new Class的方式,而是使用Class()的方式,隐式调用伴生对象的apply方法,这样会让对象创建更加简洁

例如:Array的伴生对象的apply方法就实现了接收可变数量的参数,以及会创建一个Array对象
val a = Array(1, 2, 3, 4, 5)

官方文档
在这里插入图片描述
源码如下
在这里插入图片描述
对上面Person伴生对象进行改造

object Person {
  private val fdNum = 1
  def getFdNum = fdNum
  def apply(name: String) = {
    println("apply exec...")
    new Person(name, 33)
  }
  def main(args: Array[String]): Unit = {
    Person("张").sayHello
  }
}

在这里插入图片描述

接口-trait

接下来看一个scala中的接口,这个接口也是比较特殊的

Scala中的接口称为traittrait类似于Java中的interface
triat中可以定义抽象方法

类可以使用extends 关键字继承trait,无论继承类还是trait统一都是使用extends这个关键字
类继承trait后,必须实现trait中的抽象方法,实现时不需要使用override关键字

scala不支持对类进行多继承,但是支持对trait进行多重继承,使用with关键字即可

package com.fun.scala

object PersonDemo {
  def main(args: Array[String]): Unit = {
    val p1 = new PersonX("tom")
    val p2 = new PersonX("jack")
    p1.sayHello(p2.name)
    p1.makeFriends(p2)
  }
}

trait HelloTrait { def sayHello(name: String)}
trait MakeFriendsTrait { def makeFriends(p: PersonX)}
class PersonX(val name: String) extends HelloTrait with MakeFriendsTrait {
  def sayHello(name: String) = println("Hello, " + name)
  def makeFriends(p: PersonX) = println("Hello, my name is " + name + ", your name is " + p.name)
}

在这里插入图片描述

结束

Scala面向对象编程至此就结束了


http://www.kler.cn/a/109118.html

相关文章:

  • 河南省的一级科技查新机构有哪些?
  • 游戏引擎学习第七天
  • leetcode206. Reverse Linked List
  • python识别ocr 图片和pdf文件
  • Linux中线程的基本概念与线程控制
  • 【Web前端】从回调到现代Promise与Async/Await
  • STM32H750之FreeRTOS学习--------(一)初识RTOS
  • Go 小知识之 Go 中如何使用 set
  • OPNET <<< Program Abort >>> Standard function stack imbalance
  • 自动化项目实战 [个人博客系统]
  • 论坛介绍 | COSCon'23 开源文化(GL)
  • 算法笔记【6】-简单选择排序算法
  • 关于使用ScriptObject作为项目数据配置
  • 私有云:【11】win10安装Agent客户端组件
  • 【Linux】环境变量
  • GoLong的学习之路(十一)语法之标准库 fmt.Printf的使用
  • JDK、JRE及JVM的关系及作用
  • web:[网鼎杯 2020 青龙组]AreUSerialz
  • 第44天:前端及html、Http协议
  • ChinaSoft 论坛巡礼 | 智慧化 IDE 论坛
  • day37(事件轮询机制 ajaxGet执行步骤与案例(五个步骤) ajax属性 PHP返回JSON对象(两种))
  • 08 MIT线性代数-求解Ax=b:可解性与结构Complete Solution of Ax=b
  • 设计模式——装饰器模式(Decorator Pattern)+ Spring相关源码
  • el-table多选表格 实现默认选中 删除选中列表取消勾选等联动效果
  • 292_C++_建立流连接,创建多个线程执行I\O异步操作
  • 搭建MyBatis