scala成长之路(2)对象和类
scala提供了一种特殊的定义单例的方法:object关键字
scala> object Shabi{
| val age = 0
| val name = "shabi"
| def say = {
| println("hello, I am a shabi")
| }
| }
defined object Shabi
scala> Shabi.say
hello, I am a shabi
object定义的单例可以类比于java中的静态元素,也类似于enum,可以直接import后调用。
正常定义类scala用的是class关键字,注意这里可以在类名的后天添加参数列表,表示主构造函数参数,而主构造函数主体就是类定义中除了类成员函数定义以外的部分:
package test.wangyalou class Rational(n:Int, s:Int){
require(s != 0)
var num = n
var sub = s
override def toString() = num + "/" + sub
def add(other:Rational) = {
var subtotal = sub * other.sub
var numtotal = sub * other.num + num * other.sub
val mintotal = subtotal min numtotal
for(i <- 2 to mintotal){
while (numtotal % i == 0 && subtotal % i == 0){
subtotal /= i
numtotal /= i
}
}
new Rational(numtotal, subtotal)
}
val big = n / s
var isFalse = false
isFalse = if(num > sub) true else false
val initmin = num min sub
for (i <- 2 to initmin){
while(num % i == 0 && sub % i == 0){
num /= i
sub /= i
}
}
}
注意在上边的代码中,除了黄色和绿色的成员函数代码以及红色的成员变量声明代码外,其余代码均为构造函数代码。这里的require作用类似于java中的assert,即如果不满足条件就报错。
在scala中还有一种辅助构造函数,使用def this(){...},但是记住,所有辅助构造函数的第一句必须显式调用其他构造函数:
def this(num:Int) = {
this(num,1)
}
因此无论调用哪个构造函数最终都一定会调用到主构造函数,这是与java很大的一点不同!而且只有主构造函数中才能调用基类构造函数!
scala的标识符包括:普遍意义的标识符、符号标识符,以及字面量标识符。
第一种不多说,需要注意的是$字符也被当作是字母,但是被保留作为 Scala 编译器产生的标识符之用。用户程序里的标识符不应该包含$字符,尽管能够编译通过;
第二种包括一些如 + , : , ? , ~ 或 #
的可打印的ASCII字符。以下是一些操作符标识符的例子: + ++ ::: <?> :->,
Scala 编译器将内部“粉碎”操作符标识符以转换成合法的内嵌’$’的 Java 标识符。例如, 标识符:->
将被内部表达为 $colon$minus$greater
。 若你想从 Java 代码访问这个标识符,就应使用这个内部表达。
第三种也称为文本标识符,即反单引号包含的任意字符,这样的好处是可以将变量或方法命名为冲突的字符、保留字符或关键字,最典型的就是Thread类的`yield`方法,调用方式为Thread1.`yield`
和java一样,scala也支持方法的重载,根据方法参数的不同可以定义同一个方法的不同重载形式。例如定义Rational的整数add方法:
def add(intnum:Int) = {
add(new Rational(intnum,1)
}
scala成长之路(2)对象和类的更多相关文章
- scala成长之路(6)函数入门
众所周知,scala作为一门极客型的函数式编程语言,支持的特性包括: 函数拥有“一等公民”身份: 支持匿名函数(函数字面量) 支持高阶函数 支持闭包 部分应用函数 柯里化 首先需要指出,在scala中 ...
- scala成长之路(4)compaion object——伴生对象的使用
虽然java一直声称自己是完全面向对象的语言,但一直以来都被很多人所质疑,其中java的静态成员函数就是主要的“罪魁祸首”.由于java中保留了静态方法的调用,导致其编程模式依然有过程式编程的可能,尤 ...
- Scala 学习之路(八)—— 类和对象
一.初识类和对象 Scala的类与Java的类具有非常多的相似性,示例如下: // 1. 在scala中,类不需要用public声明,所有的类都具有公共的可见性 class Person { // 2 ...
- scala成长之路(7)函数进阶——可能是史上最浅显易懂的闭包教程
由于scala中函数内部能定义函数,且函数能作为函数的返回值,那么问题来了,当返回的函数使用了外层函数的局部变量时,会发生什么呢?没错,就产生是闭包. 关于闭包的解释网上一大堆,但基本上都是照葫芦画瓢 ...
- scala成长之路(5)问题记录
还是在看scala sdk源码的时候,有很多问题要考自己慢慢摸索,这里做个记录. 一. 隐式转换的作用域? 隐式转换需要三个因素 1. 己方(当前对象) 2. 转换函数 3. 对方(转换的目标类) 这 ...
- scala成长之路(3)隐式转换
不废话,先上例子:定义一个参数类型为String的函数: scala> def sayHello(name:String) = println("hello " + name ...
- scala成长之路(1)基本语法和数据类型
scala作为JVM上的Lisp,是一种geek类型的编程语言,也一直是我等java程序员眼中的梦寐以求的一门技能,遂下定决心花一段时间好好学习scala.第一天学习,主要介绍与java在编程上的主要 ...
- Scala学习之路 (六)Scala的类、对象、继承、特质
一.类 1.类的定义 scala语言中没有static成员存在,但是scala允许以某种方式去使用static成员这个就是伴生机制,所谓伴生,就是在语言层面上,把static成员和非static成员用 ...
- Scala进阶之路-Scala特征类与unapply反向抽取
Scala进阶之路-Scala特征类与unapply反向抽取 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Scala特征类分析 1>.Unit 答:用于定义返回值类型, ...
随机推荐
- Windows怎样共享文件夹给Virtualbox 里面的Ubuntu
主要命令 1. sudo mount -t vboxsf Share /media/sf_Share 2. sudo adduser userid vboxsf
- mybooklist 日志5.12
这是一个很悲伤的日子. 今天,我不发朋友圈了.可手头的工作还是要做的,虽然说这是工作,也不能完全算. 在上班的时间做的事情,可以称得上工作,可这不是老板交给我做的事情.国有企业领导很两难,老板你是要辞 ...
- CSS中的EM属性之弹性布局
这篇教程将引导大家如何使用“em”来创建一个基本的弹性布局,从而学习其如何计算?又是如何使用“em”对层进行弹性扩展?又是如何扩展文本和图像等内容?下在我们就一起带着这些问题开始今天的“em”之行. ...
- 关于 org.hibernate.TransientObjectException 异常
在Hibernate的关联关系中,如果一个对象A 持有 对象 B 的引用,如果先保存 A ,再保存B,那么会出现 org.hibernate.TransientObjectException 异常. ...
- BZOJ1856:[SCOI2010]字符串(卡特兰数,组合数学)
Description lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgw ...
- 动态规划(DP),最长递增子序列(LIS)
题目链接:http://poj.org/problem?id=2533 解题报告: 状态转移方程: dp[i]表示以a[i]为结尾的LIS长度 状态转移方程: dp[0]=1; dp[i]=max(d ...
- 2017.9.5 Java知识点总结
1.*程序的数据操作往往都在内存中操作的,也就是说数据运算都在内存中完成. 2.*什么是变量? --变量就是内存中的一块用来存放数据的存储单元. --变量中的值可变 --我们通过变量名就可以找到内存中 ...
- dijkstra 最小费用最大流
前言:众所周知:spfa他死了 滑稽 dijkstra同样为最短路算法,为什么不能跑费用流qwq 好像是因为有负权边的缘故 但是如果我们如果使用某种玄学的将边权都拉回到正数的话 就可以跑了dijkst ...
- 【题解】洛谷P1066 [NOIP2006TG] 2^k进制数(复杂高精+组合推导)
洛谷P1066:https://www.luogu.org/problemnew/show/P1066 思路 挺难的一道题 也很复杂 满足题目要求的种数是两类组合数之和 r的最多位数m为 w/k(当w ...
- HDU1285_确定比赛名次
HDU1285_确定比赛名次 题目大意 有 n 个队伍, 只知道 m 条关于两支队伍之间胜负的关系. 求 排名. 排名不唯一, 此时输出编号较小的队伍的排名. 输入数据保证有一个符合要求的排名. 思路 ...