scala成长之路对象和类

Posted wangyalou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scala成长之路对象和类相关的知识,希望对你有一定的参考价值。

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成长之路对象和类的主要内容,如果未能解决你的问题,请参考以下文章

scala成长之路compaion object——伴生对象的使用

scala成长之路:问题记录

scala成长之路问题记录

scala成长之路函数进阶——可能是史上最浅显易懂的闭包教程

2021年大数据常用语言Scala(二十八):scala面向对象 MAVEN依赖和类

Scala中的Extractor对象和类