Scala学习笔记(三)类层级和特质
无参方法
功能:将方法的定义转换为属性字段的定义;
作用范围:方法中没有参数,并且方法仅能通过读取所包含的对象属性去访问可变状态,而不改变可变状态,就可使用无参方法;
例子:
abstract class Element{
def texts:String
}
class Sub1Element(text:String) extends Element{
val texts:String = text
}
object RunApplication{
def main(args:Array[String]){
var node:Element = new Sub1Element("Hello World 1");
println(node.texts);
}
}
说明:
Scala中仅有两个命名空间:
1、值(字段、方法、包还有单例对象)
2、类型(类和特质名)
正因为字段和方法在同一个命名空间,所以val可重写无参方法;
超类构造器的调用
例子:
class Element(text:String){
println(text);
def texts:String = text
}
class Sub1Element(text:String) extends Element("Hello World 2"){
override val texts:String = text
}
object RunApplication{
def main(args:Array[String]){
var node:Element = new Sub1Element("Hello World 1");
println(node.texts);
}
}
override修饰符
1、若子类成员所有重写了父类成员则必须带有该修饰符;
2、若成员实现的是同名的抽象成员时,则该修饰符是可选的;
3、若成员并未重写或实现其它基类里的成员则禁用这个修饰符;
final
作用:当某个类的成员不需要被子类重写时,可通过final修饰对应的成员来实现;
zip
作用:将两个数组或集合等取出相应的元素生成二元对数组;
例子:
scala> val a = Array[String]("world","world")
a: Array[String] = Array(world, world)
scala> val b = Array[Int](1,2,3,4,5)
b: Array[Int] = Array(1, 2, 3, 4, 5)
scala> val c = a zip b
c: Array[(String, Int)] = Array((world,1), (world,2))
scala> for ((p1,p2) <- c){
| println(p1+p2)}
world1
world2
说明:
当两个数组中测长度不一致时,zip将舍弃多余的元素;
Scala类层级
1、scala中每个类都继承自Any的超类,即所有类都是Any的子类;
2、Nothing是所有其它类的子类;
层级图:
==、!=、equals、eq、ne
1、Any类中的等号和不等号方法(==和!=)被声明为final,因此它们不能被子类重写,而实际上==总是与equals相同,!=总是与equals相反,所以子类可以通过重写equals方法来改变==和!=的意义;【适合值类型比较】
2、scala中对值的比较使用==或equals,而对引用的比较使用eq和ne,eq为判别引用是否相等,nq作用与eq相反;【适合引用类型比较】
Any有两个子类:AnyVal和AnyRef
1、AnyVal是Scala里每个内建值类(Byte、Short、Char、Int、Long、Float、Double、Boolean、Unit)的父类;
2、值类都被定义为即是抽象的又是final的;
3、AnyRef是scala里所有引用类的基类,在Java平台中对用java.lang.Object的别名,因此Java里面写的类和scala里面写的类都继承自AnyRef;
4、scala类与Java类的不同在于,scala中的类还继承自ScalaObject的特别的记号特质,有提高执行效率的作用,ScalaObject只包含一个方法,名为$tag,在内部使用加速模式匹配;
scala.Null
每个引用类的子类(继承自AnyRef),Null不兼容值类型,如:不能把null赋值给整型变量;
例子:
scala> val a:Int = null
<console>:7: error: an expression of type Null is ineligible for implicit conver
sion
val a:Int = null
^
scala.Nothing
scala的类层级的最低端,它是任何其它类型的的子类;
作用:标明不正常的终止
scala> def error(message:String):Nothing=
throw new RuntimeException(message)
scala> def divide(x:Int,y:Int):Int=
| if (y!=0) x / y else
| error("can't divide by zero")
warning: there were 1 deprecation warning(s); re-run with -deprecation for detai
ls
divide: (x: Int, y: Int)Int
scala> val b = divide(2,0)
java.lang.RuntimeException: can't divide by zero
at scala.sys.package$.error(package.scala:27)
at scala.Predef$.error(Predef.scala:139)
at .divide(<console>:9)
特质
定义:带有具体方法的Java接口
例子:
trait trafunction{
def showTrait(){println("trafunction")}
}
功能:特质可以声明字段和维护状态值,可以用特质的定义做任何用类定义做的事情;
与类的区别:
1、特质不能有任何参数(构造器的参数);
2、特质的调用是动态绑定的;
extends混入特质
格式:class 类名 extends 特质
特质混入扩展超类的类里
class 类名 extends 基类 with 特质1 with 特质2 ...
例子:
// 特质定义
trait Line{
def left:Int
def leftvalue=left+5
def showLine = println("showTraitLine")
def showLeft = println("Left is "+left);
}
// 工具类
class Graph(val left:Int) extends Line{
def showGraph = println(leftvalue)
}
// 程序入口
object TestTrait{
def main(args:Array[String]){
val a = new Graph(5);
a.showLine
a.showLeft
a.showGraph
}
}
说明:
1、在特质Line中定义了left和leftLine两个无参方法,即可将这样的方法看做属性字段处理;
2、类Graph混入特质Line后,根据构造器传入的参数left自动为特质中的无参数方法left赋值(参数化字段),需要注意的是构造器中的参数名,与特质中定义的无参方法名必须同名;
3、特质Line中的left若定义为var运行将出错;
Ordered特质
功能:简话类对比较操作的实现;
例子:
class Unit(n:Int) extends Ordered[Unit]{
def num = n
def compare(that:Unit) = {
this.num - this.num
}
}
//程序入口
object TestUnit{
def main(args:Array[String]){
val a = new Unit(5)
val b = new Unit(9)
println(a>b)
}
}
说明:
1、用compare方法替换了所有的比较方法,本质上是Ordered特质利用这个方定义了>、<、>=、<=,所以只需要实现compare那么所有的比较方法就都实现了;
2、compare返回值说明:相等返回0,this小于that返回负数,this大于that返回正数;
特质的堆叠
功能:改变类方法的实现,构造所需改造的新类;
例子:
import scala.collection.mutable.ArrayBuffer
abstract class IntQueue{
def get():Int
def put(x:Int)
}
class BaseQueue extends IntQueue{
private val buf = new ArrayBuffer[Int]
def get() = buf.remove(0)
def put(x:Int){buf += x}
}
// 特质的定义改变原有方法的实现
trait Doubling extends IntQueue{
abstract override def put(x:Int){
super.put(2*x)
}
}
// 程序入口
object TestApplication{
def main(args:Array[String]){
val a = new BaseQueue with Doubling
a.put(10)
println(a.get())
}
}
说明:
1、Doubling特质定义了超类IntQueue,这意味着它只能混入扩展了IntQueue的类中;
2、特质在声明为抽象的方法中有一个super调用,特质里的super调用是动态绑定的,特质Doubling的super调用将直到被混入另一个特质或类之后,有了具体的方法定义才工作;
3、实现堆叠改动的方法必须使用abstract override 标识修饰;
4、在有多个特质混入的情况下,越靠近右侧的特质越先起作用,当调用带混入的类的方法时,最有侧特质的方法首先被调用。若果该方法调用了super,它将调用其左侧特质的方法,以此类推;
Scala学习笔记(三)类层级和特质的更多相关文章
- [Scala]Scala学习笔记四 类
1. 简单类与无参方法 class Person { var age = 0 // 必须初始化字段 def getAge() = age // 方法默认为公有的 } 备注 在Scala中,类并不声明为 ...
- Scala学习笔记三
scala变量理解: package com.cxy.scala object Hello { def main(args: Array[String]): Unit = { println(&quo ...
- Scala学习笔记——样本类和模式匹配
1.样本类 在申明的类前面加上一个case修饰符,带有这种修饰符的类被称为样本类(case class). 被申明为样本类的类的特点:1.会添加和类名一致的工厂方法:2.样本类参数列表中的所有参数隐式 ...
- Scala学习笔记(5)类
1.简单类和无参方法 calss Counter{ private var value = 0 //必须初始字段 def increment(){value +=1} //方法默认是公有的 def ...
- [Scala]Scala学习笔记三 Map与Tuple
1. 构造映射 可以使用如下命令构造一个映射: scala> val scores = Map("Alice" -> 90, "Kim" -> ...
- scala 学习笔记三 闭包
闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量. 闭包通常来讲可以简单的认为是可以访问一个函数里面局部变量的另外一个函数. 如下面这段匿名的函数: val multiplier = (i: ...
- 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性
基于.net的分布式系统限流组件 在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...
- [Firefly引擎][学习笔记三][已完结]所需模块封装
原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读: 笔记三主要就是各个模块的封装了,这里贴 ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- VSTO学习笔记(三) 开发Office 2010 64位COM加载项
原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...
随机推荐
- PythonCrawl自学日志(2)
一.Scrapy环境的安装 1.配套组件的安装 由于开发环境是在VS2015Community中编码,默认下载的python3.5,系统是windows8.1,为此需要安装的组件有如下列表: 所有的组 ...
- hdu 2087 剪花布条 KMP多次匹配
剪花布条 Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? I ...
- MVC-登录并设置角色
1.新建一个类,设置角色: using System; using System.Collections.Generic; using System.Linq; using System.Text; ...
- C# - implicit, explicit
如果类型直接没有继承关系,也没有共享接口,想在这两个类型之间进行转换,就必须重载转换运算符. 此时需要关键字implicit和explicit. 下面定义了类型ConvClass1和ConvClass ...
- 设置BootStrap导航条的高度
只要加上这段css就可以覆盖Bootstrap.css的代码,定制符合自己的样式 .navbar { min-height: 40px; } .nav > li > a { padding ...
- delphi xe5 android sample 中的 SimpleList 是怎样绑定的
C:\Users\Public\Documents\RAD Studio\12.0\Samples\FireMonkeyMobile 例子中的绑定方式如下图: 1.拖拽一个listview到界面上,然 ...
- sublime text 2 前端编码神器-快捷键与使用技巧介绍
介绍网址:http://www.xuanfengge.com/sublime-text-2-artifact.html
- USACO4.12Beef McNuggets(背包+数论)
昨天晚上写的一题 结果USACO一直挂中 今天交了下 有一点点的数论知识 背包很好想 就是不好确定上界 官方题解: 这是一个背包问题.一般使用动态规划求解. 一种具体的实现是:用一个线性表储存所有的 ...
- bzoj1267 3784
双倍经验题像这种方案太多不能全部求出来但求前k大一般有这样一个思路将所有方案无重复不漏的分为若干类,每个类的元素满足单调性,然后我们用堆维护就行了!对于这道题,可以想到用树的分治来处理路径,当处理根为 ...
- 解决因block的损坏而导致hdfs启动后进入安全模式
问题描述: 以单机伪分布式方式安装了hadoop2.7.1,并在该机器上安装了hive1.2.1.首先执行 sbin/start-dfs.sh 启动hdfs服务,然后执行hive,这时hive脚本启动 ...