问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

scala class和object,trait的区别

发布网友 发布时间:2022-05-01 02:32

我来回答

1个回答

热心网友 时间:2022-06-22 14:46

object
在scala中没有静态方法和静态字段,所以在scala中可以用object来实现这些功能,直接用对象名调用的方法都是采用这种实现方式,例如Array.toString。对象的构造器在第一次使用的时候会被调用,如果一个对象从未被使用,那么他的构造器也不会被执行;对象本质上拥有类(scala中)的所有特性,除此之外,object还可以一扩展类以及一个或者多个特质:例如,
abstract class ClassName(val parameter){}
object Test extends ClassName(val parameter){}
trait TraitA{}
trait TraitB{}
trait TraitC{}
object Test1 extends TraitA with TraitB with TraitC{}
注意:object不能提供构造器参数,也就是说object必须是无参的
我们通常会定义和使用object的apply方法,有如下情形,apply方法就会被调用,Object(参数1 ,参数2 ,……)这样是隐含的调用apply方法,当然也可以显示的调用,如下Array("Mary","tong"),当然也可以这样来写Array.apply("Mary","tong"),一般我们提倡隐式的写法。
所有的main方法都必须在object中被调用,来提供程序的主入口,十分简单,不举例说明,处理main方法以外,scala中还提供了扩展App特质,然后将程序代码放入都早起方法体内,如
object Hello extends App{
println("Hello World !!!")

}
这样的代码可以直接执行,输出

如果需要命令行参数,可以直接调用args属性来得到,例如

def main(args: Array[String]) { if (args.length > 0 ) println("Hello " + args(0)) else
println("Hello World")
}scala中并没有枚举类型,但是,标准类库中提供了一个枚举类型的接口,在object下面,可以扩展出枚举类型(Enumeration),
具体示例如下:object EnumerationDemo extends Enumeration{ val red, green, blue, pink = Value

val black = Value // 上面一条语句是简写
val white = Value
val gray = Value

val yellow = Value(12, "huang") //可以随意指定id和名称,但是避免重复
val purple = Value("zi") //id为13
val orange = Value(20)
}
上面的代码为实现枚举类型的具体代码,如果不指定id和name,系统默认是id从0开始,name就是变量的名称,可以指定其中的
任何一个或者是两个全部指定,已经指定的就按指定的初始化,并且后面的依次递增。

枚举的引用
可以直接objectName.red这样来进行引用,也可以将import objectName._来进行导入引用,还可以给枚举类型增加一个类型别名,
具体如下:
object EnumerationDemo extends Enumeration{ type EnumerationDemo = Value val red, green, blue, pink = Value

val black = Value
val white = Value
val gray = Value

val yellow = Value(12, "huang") val purple = Value("zi") val orange = Value(20)
}
现在枚举类型变成了EnumerationDemo.EnumerationDemo 这种用法只有在使用import语句的时候才显得有意义。
package enumerationimport EnumerationDemo._/** * Created by tongtong on 2015/9/8. *
*/class EnumDemo { def transportation(color:Enumeration): Unit ={ if (color == red) "Stop" else if (color == green) "go" else if (color == yellow) "wait" }
}
枚举类型也可以通过for循环将所有元素输出,同时可以通过Enumeration(Int)和Enumeration.withName("")来进行定位操作

class

在scala中,类名可以和对象名为同一个名字,该对象称为该类的伴生对象,类和伴生对象可以相互访问他们的私有属性,但是
他们必须在同一个源文件内。类只会被编译,不能直接被执行,类的申明和主构造器在一起被申明,在一个类中,主构造器只有一个,
所有必须在内部申明主构造器或者是其他申明主构造器的辅构造器,主构造器会执行类定义中的所有语句。scala对每个字段都会提供
getter和setter方法,同时也可以显示的申明,但是针对val类型,只提供getter方法,默认情况下,字段为公有类型,可以在setter方法中增加*条件来限定变量的变化范围,在scala中方法可以访问改类所有对象的私有字段
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
韩国EMS19.3公斤的箱子去中国要多少钱 俄罗斯快递查询 青春期孩子想买贵东西怎么办 发现青春期孩子买成人用品怎么办?? ...运送石油到中国上海湾,途中经过的海峡有( )A.白令海峡B.马六甲海峡C... 中俄货物运输企业 ...湾往我国运送石油的船只需要经过的海峡是: ( ) A.直布罗陀海峡 B... 童心唱响祖国完整版歌词【26句精选】 苹果有面容和没面容有什么区别 苹果无面容影响 如何处理Scala未来中抛出的异常 初学scala,我希望大神解答 如何在Scala中使用条件表达式 为什么scala不能接收元组作为函数参数 scala 里映射和元组的区别 scala之函数是个什么鬼 scala的unit是什么意思? 外观是个手机里面是个相机图标是啥软件? 彩色相机是什么软件 这是什么相机软件? iphone有个照相机图标的交友软件叫什么 图标是相机的软件叫什么 水印可爱的你是什么相机 照片左下角有水印可爱的你 是什么相机软件啊? 可爱的你是什么美颜相机 左下角有可爱的你这4个字是什么相机 mysql查询语句和oracle查询语句的差别大吗?l OPPO R815T的安装和调试在哪 怎么打开安装和调试 也没有开发者选项 怎么打开 oppoa33安装和调试在哪? wow敏锐盗贼都有哪些特色? 魔兽世界敏锐盗贼怎么PK,求高手教 scala怎样实现一个自定义的类 scala中class和object的区别 scala main函数 args 怎么写 scala中匿名函数作为参数的问题 如何用scala语言分解质因数? scala中spilt切割问题 Scala + JUnit 怎么使用 Rule 苹果11电池寿命83算几成新 苹果手机电池效率只有83是什么意思 苹果手机83电池续航一般用了多久 HP P1007打印机怎么加墨粉,位置在哪里? p1007硒鼓如何加墨粉 有什么好看的美女拼图 苹果x11个月电池掉到83正常吗? 复兴西路57号甲是属于湖南路街道吗? 惠普打印机p1007墨粉怎么加 求推荐一款孩子益智教育拼图 湖南省邵东县到河北省唐山走高速有多远 苹果8手机电池容量83%要不要换电池? 上海闵行到湖南长沙走江西方向多少公里