Scala基础教程(七):类和对象、特征
扩展一个类:
可以扩展scala类以类似的方式,如在Java中的一样,但有两个限制:方法重载需要override关键字,只有主构造可以传递参数给基构造。现在扩展上面的类,并增加一个类的方法:
class Yiibai(val xc: Int, val yc: Int) {
var x: Int = xc
var y: Int = yc
def move(dx: Int, dy: Int) {
x = x + dx
y = y + dy
println ("Yiibai x location : " + x);
println ("Yiibai y location : " + y);
}
}
class Location(override val xc: Int, override val yc: Int,
val zc :Int) extends Yiibai(xc, yc){
var z: Int = zc
def move(dx: Int, dy: Int, dz: Int) {
x = x + dx
y = y + dy
z = z + dz
println ("Yiibai x location : " + x);
println ("Yiibai y location : " + y);
println ("Yiibai z location : " + z);
}
}
extends子句有两种作用:它使类Location继承类Yiibai所有非私有成员,它使Location类 作为Yiibai类的子类。 因此,这里的Yiibai类称为超类,而Location类被称为子类。扩展一个类,继承父类的所有功能,被称为继承,但 scala允许继承,只能从一个唯一的类。让我们看看完整的例子,显示继承的用法:
import java.io._
class Yiibai(val xc: Int, val yc: Int) {
var x: Int = xc
var y: Int = yc
def move(dx: Int, dy: Int) {
x = x + dx
y = y + dy
println ("Yiibai x location : " + x);
println ("Yiibai y location : " + y);
}
}
class Location(override val xc: Int, override val yc: Int,
val zc :Int) extends Yiibai(xc, yc){
var z: Int = zc
def move(dx: Int, dy: Int, dz: Int) {
x = x + dx
y = y + dy
z = z + dz
println ("Yiibai x location : " + x);
println ("Yiibai y location : " + y);
println ("Yiibai z location : " + z);
}
}
object Test {
def main(args: Array[String]) {
val loc = new Location(10, 20, 15);
// Move to a new location
loc.move(10, 10, 5);
}
}
需要注意的是方法move,不会覆盖 move 方法相应的定义,因为它们是不同的定义(例如,前两个参数,而后者则需要三个参数)。
让我们编译和运行上面的程序,这将产生以下结果:
C:/>scalac Test.scala
C:/>scala Test
Yiibai x location : 20
Yiibai y location : 30
Yiibai z location : 20
C:/>
单例对象:
Scala比Java更面向对象,因为在Scala中不能有静态成员。相反,Scala有单例的对象。单例就是只能有一个实例,即,类的对象。可以使用关键字object代替class关键字,而不是创建单例。因为不能实例化一个单独的对象,不能将参数传递给主构造。前面已经看到全部采用单一对象,调用 Scala的main方法的例子。以下是单例显示的相同的例子:
import java.io._
class Yiibai(val xc: Int, val yc: Int) {
var x: Int = xc
var y: Int = yc
def move(dx: Int, dy: Int) {
x = x + dx
y = y + dy
}
}
object Test {
def main(args: Array[String]) {
val yiibai = new Yiibai(10, 20)
printYiibai
def printYiibai{
println ("Yiibai x location : " + yiibai.x);
println ("Yiibai y location : " + yiibai.y);
}
}
}
当上述代码被编译和执行时,它产生了以下结果:
C:/>scalac Test.scala
C:/>scala Test
Yiibai x location : 10
Yiibai y location : 20
C:/>
特性封装方法和字段定义,然后可以通过将它们混合成类被重用。不同于类继承,其中每个类都必须继承只有一个父类,一类可以在任意数量特质混合。
特征用于通过指定支持的方法的签名定义的对象类型。Scala中也允许部分实现特性但可能不具有构造参数。
一个特征定义看起来就像不同的是它使用关键字trait如下类定义:
trait Equal {
def isEqual(x: Any): Boolean
def isNotEqual(x: Any): Boolean = !isEqual(x)
}
这种特质由两个方法的isEqual和isNotEqual。这里,我们没有给出任何实现的isEqual其中作为另一种方法有它的实现。扩展特性的子类可以给实施未实现的方法。因此,一个特点是非常相似Java的抽象类。下面是一个完整的例子来说明特性的概念:
trait Equal {
def isEqual(x: Any): Boolean
def isNotEqual(x: Any): Boolean = !isEqual(x)
}
class Yiibai(xc: Int, yc: Int) extends Equal {
var x: Int = xc
var y: Int = yc
def isEqual(obj: Any) =
obj.isInstanceOf[Yiibai] &&
obj.asInstanceOf[Yiibai].x == x
}
object Test {
def main(args: Array[String]) {
val p1 = new Yiibai(2, 3)
val p2 = new Yiibai(2, 4)
val p3 = new Yiibai(3, 3)
println(p1.isNotEqual(p2))
println(p1.isNotEqual(p3))
println(p1.isNotEqual(2))
}
}
当上述代码被编译和执行时,它产生了以下结果:
C:/>scalac Test.scala
C:/>scala Test
false
true
true
C:/>
什么时候使用特性?
没有严格的规定,但这里有一些指导原则需要考虑:
· 如果行为不被重用,则要使它成为一个具体的类。它毕竟不是可重复使用的行为。
· 如果它可能在多个不相关的类被重用,使它成为一个性状。只有特性可混入的类层次结构的不同部分。
· 如果想它从继承Java代码,使用抽象类。
· 如果打算在已编译的形式分发,而且希望外部组织编写的类继承它,可能会倾向于使用抽象类。
· 如果效率是非常重要的,倾向于使用类。
模式匹配是Scala中第二个最广泛使用的功能,经过函数值和闭包。Scala中大力支持模式匹配处理消息。
模式匹配包括替代的序列,每个开始使用关键字case。每个备选中包括模式和一个或多个表达式,如果模式匹配将被计算。一个箭头符号=>分开的表达模式。这里是一个小例子,它展示了如何匹配一个整数值:
object Test {
def main(args: Array[String]) {
println(matchTest(3))
}
def matchTest(x: Int): String = x match {
case 1 => "one"
case 2 => "two"
case _ => "many"
}
}
当上述代码被编译和执行时,它产生了以下结果:
C:/>scalac Test.scala
C:/>scala Test
many
C:/>
使用case语句块定义一个函数,该函数映射整数字符串。匹配关键字提供应用函数(如模式匹配函数以上)为一个对象的一个方便的方法。下面是第二个示例,它匹配针对不同类型的模式值:
object Test {
def main(args: Array[String]) {
println(matchTest("two"))
println(matchTest("test"))
println(matchTest(1))
}
def matchTest(x: Any): Any = x match {
case 1 => "one"
case "two" => 2
case y: Int => "scala.Int"
case _ => "many"
}
}
当上述代码被编译和执行时,它产生了以下结果:
C:/>scalac Test.scala
C:/>scala Test
2
many
one
C:/>
第一个case ,如果 x 指的是整数值1. 如果x等于字符串“2”的第二case相匹配匹配。第三种case 是由一个输入模式;它匹配针对任何整数,并结合选择值xto整数类型的变量y。以下为文字相同的匹配... case 表达式用括号 {...} 另一种形式:
object Test {
def main(args: Array[String]) {
println(matchTest("two"))
println(matchTest("test"))
println(matchTest(1))
}
def matchTest(x: Any){
x match {
case 1 => "one"
case "two" => 2
case y: Int => "scala.Int"
case _ => "many"
}
}
}
from: http://www.yiibai.com/scala/scala_basic_syntax.html
Scala基础教程(七):类和对象、特征相关推荐
- python基础教程:类和对象
Python的类(class)是抽象的概念,是指一类实例对象的集合,该实例具有相同的属性和方法,而对象(object)是类的具体的实例. 类的定义语法如下所示,最重要的两个部分是属性和方法: clas ...
- Scala基础教程--06--类与对象的详解
Scala基础教程–06–类与对象的详解 章节目标 掌握类和对象的定义 掌握访问修饰符和构造器的用法 掌握main方法的实现形式 掌握伴生对象的使用 掌握定义工具类的案例 1. 类和对象 Scala是 ...
- javascript基础教程_JavaScript基础教程(九)对象、类的定义与使用
对象.类的定义与使用 对象与类是面向对象程序设计语言教学过程中不可避免需要讲解的内容之一.很多人将两者混为一谈,简单认为对象就是类,类就是对象.实际上深入分析的话,对象与类的区别还是较为明显的.本文主 ...
- JAVA基础七 类和对象
文章目录 JAVA基础七 类和对象 01 引用 02 继承 03 方法重载 04 构造方法 05 this 06 传参 07 包 08 访问修饰符 09 类属性 10 类方法 11 属性初始化 12 ...
- Scala基础教程--10--数组列表与函数式编程
Scala基础教程–10–数组列表与函数式编程 章节目标 掌握数组, 元组相关知识点 掌握列表, 集, 映射相关知识点 了解迭代器的用法 掌握函数式编程相关知识点 掌握学生成绩单案例 1. 数组 1. ...
- Scala基础教程--18--集合(二)
Scala基础教程–18–集合(二) 章节目标 掌握Iterable集合相关内容. 掌握Seq集合相关内容. 掌握Set集合相关内容. 掌握Map集合相关内容. 掌握统计字符个数案例. 1. Iter ...
- python面向对象类创建人物类包含姓名、职业_Python面向对象思想与应用入门教程【类与对象】...
本文实例讲述了Python面向对象思想与应用.分享给大家供大家参考,具体如下: 面向对象思想 1.面向对象的设计思想 面向对象是基于万物皆对象这个哲学观点. 2.面向对象和面向过程的区别 面向过程 在 ...
- Scala基础教程(一):简介、环境安装
Scala基础语法 如果有很好的了解Java语言,那么将很容易学习Scala. Scala和Java间的最大语法的区别在于;行结束符是可选的.考虑Scala程序它可以被定义为通过调用彼此方法进行通信的 ...
- 【Java基础】Java类和对象
文章目录 一.什么是类和对象? 1.类的定义及可用关键字 2.成员变量的定义和声明 3.面向对象的三大基本特征 3.1封装性 3.2 继承性 3.3多态性 二.创建对象的几种方法 1.显式创建对象 2 ...
最新文章
- 酸爽! Intellij IDEA 神器居然还藏着这些实用小技巧 !
- 深入探究 RocketMQ 事务机制的实现流程,为什么它能做到发送消息零丢失?
- 农林废弃物如何变废为宝?
- 急速收藏:4套iOS SDK的H5打通方案
- Kaggle知识点:数据分布不一致的验证
- 计算机网络基础(缩短版)
- mysql 5.0 修改字符集_修改及查看mysql数据库的字符集
- 用HTML5 Canvas为网页添加动态波浪背景
- 847方波放大电路_身为工程师需要了解的模拟积分器电路!
- oracle gbk ebcdic,EBCDIC和GBK/GBK2312的转换
- 求a的高次幂对b的余数
- PDF文字识别三步搞定,这样的方法你该知道
- qq互联php教程,thinkphp5怎么整合qq互联登录教程
- 实用好看的个人主页官方源码
- 麒麟操作系统配置web服务器,银河麒麟服务器设置
- oracle返回当年的第一天,oracle 获取 当年第一天 当月第一天
- ubuntu系统的文件权限获取
- 互联网服务线上数据迁移的原则和方法
- 云ERP来的正是时候!
- 个人简历网页搭建(快速搭建GitHub Pages和Apache)
热门文章
- eclipse 快捷键大全,eclipse查找类,文件,添加注释
- Ello讲述Haar人脸检测:易懂、很详细、值得 ...
- 源自Google、Facebook、Netflix和Cisco的10款开源安全工具很值得回味
- 白话Elasticsearch29-IK中文分词之IK分词器配置文件+自定义词库
- 并发编程-16AQS同步组件之CountDownLatch 闭锁
- Java-Java I/O 字节流之BufferedReader/BufferedWriter
- Spring-在IoC中装配Bean系列文章导读
- Android Studio报Element XXXX must be declared的解决方法
- python小结价格_036 Python进阶小结
- mysql 4 基础教程_MySQL基础教程(四):MySQL 管理