Scala 类和对象

类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类是用于创建对象的蓝图,它是一个定义包括在特定类型的对象中的方法和变量的软件模板。

我们可以使用 new 关键字来创建类的对象,实例如下:

class Point(xc: Int, yc: Int) {var x: Int = xc   var y: Int = yc   def move(dx: Int, dy: Int) {x = x + dxy = y + dyprintln ("x 的坐标点: " + x);println ("y 的坐标点: " + y);}}

Scala中的类不声明为public,一个Scala源文件中可以有多个类。

以上实例的类定义了两个变量 xy ,一个方法:move,方法没有返回值。

Scala 的类定义可以有参数,称为类参数,如上面的 xc, yc,类参数在整个类中都可以访问。

接着我们可以使用 new 来实例化类,并访问类中的方法和变量:

import java.io._class Point(xc: Int, yc: Int) {var x: Int = xc   var y: Int = yc   def move(dx: Int, dy: Int) {x = x + dxy = y + dyprintln ("x 的坐标点: " + x);println ("y 的坐标点: " + y);}}object Test {def main(args: Array[String]) {val pt = new Point(10, 20);// 移到一个新的位置pt.move(10, 10);}}

执行以上代码,输出结果为:

$ scalac Test.scala
$ scala Testx 的坐标点: 20y 的坐标点: 30

Scala 继承

Scala继承一个基类跟Java很相似, 但我们需要注意以下几点:

  • 1、重写一个非抽象方法必须使用override修饰符。
  • 2、只有主构造函数才可以往基类的构造函数里写参数。
  • 3、在子类中重写超类的抽象方法时,你不需要使用override关键字。

接下来让我们来看个实例:

class Point(xc: Int, yc: Int) {var x: Int = xc   var y: Int = yc   def move(dx: Int, dy: Int) {x = x + dxy = y + dyprintln ("x 的坐标点: " + x);println ("y 的坐标点: " + y);}}class Location(override val xc: Int, override val yc: Int,val zc :Int) extends Point(xc, yc){var z: Int = zc   def move(dx: Int, dy: Int, dz: Int) {x = x + dxy = y + dyz = z + dzprintln ("x 的坐标点 : " + x);println ("y 的坐标点 : " + y);println ("z 的坐标点 : " + z);}}

Scala 使用 extends 关键字来继承一个类。实例中 Location 类继承了 Point 类。Point 称为父类(基类),Location 称为子类。

override val xc 为重写了父类的字段。

继承会继承父类的所有属性和方法,Scala 只允许继承一个父类。

实例如下:

import java.io._class Point(val xc: Int, val yc: Int) {var x: Int = xc   var y: Int = yc   def move(dx: Int, dy: Int) {x = x + dxy = y + dyprintln ("x 的坐标点 : " + x);println ("y 的坐标点 : " + y);}}class Location(override val xc: Int, override val yc: Int,val zc :Int) extends Point(xc, yc){var z: Int = zc   def move(dx: Int, dy: Int, dz: Int) {x = x + dxy = y + dyz = z + dzprintln ("x 的坐标点 : " + x);println ("y 的坐标点 : " + y);println ("z 的坐标点 : " + z);}}object Test {def main(args: Array[String]) {val loc = new Location(10, 20, 15);// 移到一个新的位置loc.move(10, 10, 5);}}

执行以上代码,输出结果为:

$ scalac Test.scala
$ scala Testx 的坐标点 : 20y 的坐标点 : 30z 的坐标点 : 20

Scala重写一个非抽象方法,必须用override修饰符。

class Person {var name = ""override def toString = getClass.getName + "[name=" + name + "]"}class Employee extends Person {var salary = 0.0override def toString = super.toString + "[salary=" + salary + "]"}object Test extends App {val fred = new Employeefred.name = "Fred"fred.salary = 50000println(fred)}

执行以上代码,输出结果为:

$ scalac Test.scala
$ scala TestEmployee[name=Fred][salary=50000.0]

Scala 单例对象

在 Scala 中,是没有 static 这个东西的,但是它也为我们提供了单例模式的实现方法,那就是使用关键字 object。

Scala 中使用单例模式时,除了定义的类之外,还要定义一个同名的 object 对象,它和类的区别是,object对象不能带参数。

当单例对象与某个类共享同一个名称时,他被称作是这个类的伴生对象:companion object。你必须在同一个源文件里定义类和它的伴生对象。类被称为是这个单例对象的伴生类:companion class。类和它的伴生对象可以互相访问其私有成员。

单例对象实例

import java.io._class Point(val xc: Int, val yc: Int) {var x: Int = xc   var y: Int = yc   def move(dx: Int, dy: Int) {x = x + dxy = y + dy   }}object Test {def main(args: Array[String]) {val point = new Point(10, 20)printPoint      def printPoint{println ("x 的坐标点 : " + point.x);println ("y 的坐标点 : " + point.y);}}}

执行以上代码,输出结果为:

$ scalac Test.scala
$ scala Testx 的坐标点 : 10y 的坐标点 : 20

伴生对象实例

/* 文件名:Marker.scala* author:阿里云大学* url:www.runoob.com*/// 私有构造方法class Marker private(val color:String) {println("创建" + this)override def toString(): String = "颜色标记:"+ color
}// 伴生对象,与类共享名字,可以访问类的私有属性和方法object Marker{private val markers: Map[String, Marker] = Map("red" -> new Marker("red"),"blue" -> new Marker("blue"),"green" -> new Marker("green"))def apply(color:String) = {if(markers.contains(color)) markers(color) else null}def getMarker(color:String) = { if(markers.contains(color)) markers(color) else null}def main(args: Array[String]) { println(Marker("red"))  // 单例函数调用,省略了.(点)符号  println(Marker getMarker "blue")  }}

执行以上代码,输出结果为:

$ scalac Marker.scala
$ scala Marker创建颜色标记:red创建颜色标记:blue创建颜色标记:green颜色标记:red颜色标记:blue

Scala 类和对象详解相关推荐

  1. Scala类和对象详解

    一.类定义.创建对象 Scala和Java一样,用class关键字来创建类,eg: class Student{ var score:Int=0 } 利用javap -private Student命 ...

  2. python类和对象详解_Python公开课 - 详解面向对象

    前言 在C语言中,单纯通过结构化的函数也可以实现很好的软件,顺序思路比较好理解:而C++则以面向对象的思维来进行代码组织,通过定义对象.成员变量.成员函数.以封装.继承和多态等方式来更灵活处理业务逻辑 ...

  3. 【C++学习笔记一】C++类和对象详解

    类定义是以关键字class开头,后面跟类的名称.主体是包含在一对花括号中.类定义后必须跟着一个分号或一个声明列表. 类的对象的公共数据成员可以使用直接成员访问运算符.来访问.需要注意的是,私有的成员和 ...

  4. Android中使用Intent进行窗体切换,并且传值和自定义类的对象详解

    在Android中,Intent对象负责各个Activity窗口之间的切换,同时他更担负起数据传输重任. 一般情况下,使用Intent对象进行简单窗口切换的代码如下: Intent i=new Int ...

  5. Java 类和对象详解(二)——static关键字

    文章目录 1.static关键字 为何会引入这个static 变量? final 和 static 的区别 static 修饰方法 1.static关键字 看见static,本能反应,和对象无关 st ...

  6. 九 Python 类与对象详解,这是软件工程师的分水岭

    目录 1 为什么要面向对象编程 2 核心思想 3 初次体验 4 初始化方法 5 类专用的方法 6 继承(有点像生物的基因传递) 7 灵活的Python,属性自由 8 一切皆是对象 9 OOP的设计方法 ...

  7. 对python3中pathlib库的Path类的使用详解

    原文连接   https://www.jb51.net/article/148789.htm 1.调用库 ? 1 from pathlib import 2.创建Path对象 ? 1 2 3 4 5 ...

  8. 【ES6】Promise对象详解

    [ES6]Promise对象详解 一.Promise对象的含义 二.Promise对象的用法 三.Promise对象的几个应用[重点] 1.时间延迟函数 2.图片异步加载 查看更多ES6教学文章: 参 ...

  9. c++类的构造函数详解

    c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初 ...

最新文章

  1. 判断当前时间是否大于零点_入伏是祛湿最佳时间!中医教你3招判断是否湿气重...
  2. Windows查看网络端口被占用情况netstat命令
  3. EndNote 20的同步功能如何使用?及新版下载
  4. Mysql select into outfile NULL值导出的处理方法
  5. win7局域网共享设置_Win7系统打印机共享不了的设置方法思路!
  6. 在java继承机制中 父类中的私有_Java中子类能继承父类的私有属性吗?
  7. 基于zeromq的高性能分布式RPC框架Zerorpc 性能测试
  8. Linus 发文宣布Linux Kernel 5.0 正式发布
  9. linux系统q7文件,linux系统安装包的管理
  10. 干货 | 深度文本分类综述(12篇经典论文)
  11. java.sql包是jdbc_sqljdbc4.jar官方下载|
  12. jabber android apk,Android版Jabber — 快速入门指南
  13. openssl_verify(): supplied key param cannot be coerced into a public key错误解决的一种办法
  14. scrapy--Rule()与LinkExtractor()函数理解
  15. android连麦功能,Android IOS WebRTC 音视频开发总结(七六)-- 探讨直播低延迟低流量的粉丝连麦技术...
  16. 基于OPENCV的动态图片阵列显示程序
  17. CDR插件开发之Addon插件007 - Addon插件简介和案例演示
  18. HTTP之proxy
  19. 写给大忙人的建议:如何优雅地速成代码?(教你如何在忙碌中学习新知识)
  20. 中国移动实时数据分析-基于spark+kafka+flume

热门文章

  1. python3随笔-协方差,标准差,方差
  2. 【Python基础】101道Numpy、Pandas练习题,提升你的Python水平
  3. 【机器学习】使用MLflow管理机器学习模型版本
  4. AI基础:数据可视化简易入门(Matplotlib 和 Seaborn)
  5. Transformer在图像复原领域的降维打击,ETH提出SwinIR:各项任务全面领先
  6. 减负提质的新命题下,网易云信如何为课后服务升级?
  7. 全面助推国产化进程,网易云信获鲲鹏技术认证
  8. 技术干货|如何在企业内部实现云信私有化?
  9. 互联网1分钟 |1227
  10. 即时通讯音视频开发(八):常见的实时语音通讯编码标准