Scala与Java差异(六)之类定义

一、类定义

(1)定义类,包含field以及方法

class ScalaClass {private var field = "one"def aMethod() { print("field : " + field ) }  def getField  = field }

(2)调用对象方法

val scalaClass = new ScalaClassscalaClass.aMethod()

print(scalaClass.getField) // 也可以不加括号,如果定义方法时不带括号,则调用方法时也不能带括号

(3)getter与setter

1)var

此时scala生成的面向JVM的类时,会定义为private的name字段,并提供public的getter和setter方法。如:var field

2)val

只会生成getter方法。如:val field

3)private

生成的getter和setter也是private的,与java的私有属性变量类内访问一致。如:private var field

4)private[this]

不生成setter和getter方法,并且只是当前对象能够访问,与java的私有属性变量类内访问不一致。如:private[this] var field

5)自定义getter与setter方法

定义setter方法,def field_=(val: type){   },自定义setter方法的时候注意scala的语法限制,签名、=、参数间不能有空格

定义getter方法,def field=xxx

class Person{private var lastName = "mk"def name = lastName def name_=(newVal: String)  {lastName=newVal}}val mk = new Personprint(mk.name)mk.name = "xx"// 调用getter和setter方法,分别叫做name和name_ =

6)Java风格的getter和setter方法

Scala的getter和setter方法的命名与java是不同的,是field和field_=的方式

让scala自动生成java风格的getter和setter方法,只要给field添加@BeanProperty注解即可

此时会生成4个方法,name: String、name_=(newValue: String): Unit、getName(): String、setName(newValue: String): Unit

import scala.reflect.BeanPropertyclass Person{@BeanProperty var name: String = _}class Person(@BeanProperty var name: String)val s = new Persons.setName("MK")s.getName()

7)辅助constructor

Scala中,可以给类定义多个辅助constructor,类似于java中的构造函数重载
辅助constructor之间可以互相调用,而且必须第一行调用主constructor

class Person {private var name = ""private var age = 0def this(name: String) {this()this.name = name}def this(name: String, age: Int) {this(name)this.age = age}
}

8)主constructor

Scala中,主constructor是与类名放在一起的,与java不同

而且类中没有定义在任何方法或者是代码块之中的代码,就是主constructor的代码,没有java构造方法清晰

class Person(val name: String, val age: Int) {println("name:" + name + ", age:" + age)}

主constructor中还可以通过使用默认参数,来给参数默认的值

class Person(val name: String = "MK", val age: Int = 18) {println("name:" + name + ", age:" + age)}

主constrcutor传入的参数什么修饰都没有,比如name: String,那么如果类内部的方法使用到了,则会声明为private[this] name;否则没有该field,就只能被constructor代码使用

 

二、对象object

object,相当于class的单个实例,在里面定义一些静态的field或者method(等价于java的定义静态变量和静态方法的类)

第一次调用object的方法时,就会执行object的constructor(即object内部不在method中的代码)。object不能定义接受参数的constructor

object通常用于作为单例模式的实现,或者放class的静态成员,比如工具方法

object Num {private val zero = 0println("init Number object!")def getZero = zero}

(1) 伴生对象

有一个class,还有一个与class同名的object,那么就称这个object是class的伴生对象,class是object的伴生类
伴生类和伴生对象必须存放在一个.scala文件之中
伴生类和伴生对象,最大的特点就在于,互相可以访问private field

object Num {private val zero = 0println("init Number object!")def getZero = zero}class Num (val valueNum: Int) {def getValue = valueNum
}

(2)object继承抽象类

object的功能其实和class类似,除了不能定义接受参数的constructor之外,object也可以继承抽象类,并覆盖抽象类中的方法

abstract class Animal(var name: String) {def toStr(): String
}object Cat extends Animal("cat") {override def toStr() = name
}

(3) apply方法

apply方法通常在伴生对象objec中实现apply方法实现构造伴生类的对象的功能。

而创建伴生类的对象时,一般不会使用new ClassName的方式,而是使用ClassName()的方式,隐式地调用伴生对象得apply方法,这样会让对象创建更加简洁

比如,Array类的伴生对象的apply方法就实现了接收可变数量的参数,并创建一个Array对象的功能

var arr = Array("a", "b")

class Cat(val name: String)
object Cat{def apply(name: String) = new Cat(name)
}

(4) main方法

在scala中要运行一个应用程序,那么必须有一个main方法,作为入口(像java中需要编写一个包含main方法类)

scala中的main方法必须在object中定义,格式为def main(args: Array[String])

object ScalaProgram {def main(args: Array[String]) {println("scala run...")}}

除了实现main方法可以作为启动入口,继承App Trait类也可以作为启动入口,然后将需要在main方法中运行的代码,直接作为object的constructor代码;而且用args可以接受传入的参数

object ScalaProgram extends App {println("scala run ...")}

运行上面的代码,需要将其放入ScalaProgram.scala文件,然后先使用scalac编译,再用scala执行

scalac ScalaProgram.scala

scala -Dscala.time ScalaProgram

App Trait的工作原理:App Trait继承自DelayedInit Trait,scalac命令进行编译时,会把继承App Trait的object的constructor代码都放到DelayedInit Trait的delayedInit方法中执行。

(5)object实现枚举

Scala没有直接提供类似于Java中的Enum类的枚举特性,如果要实现枚举,则需要用object继承Enumeration类,并且调用Value方法来初始化枚举值

通过Value传入枚举值的id和name,通过id和toString可以获取; 还可以通过id和name来查找枚举值。使用枚举object.values可以遍历枚举值

object Sex extends Enumeration {val MAN = Value(0, "man")val WOMAN = Value(1, "woman")}Sex(0)
Sex.withName("man")
for (s <- Sex.values) println(s)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jzoj6297-世界第一的猛汉王【切比雪夫距离,扫描线】

正题 题目大意 有若干个红点和蓝点&#xff0c;对于每一对红点和蓝点&#xff0c;若距离大于DDD则蓝点压制红点&#xff0c;否则红点压制蓝点。然后红点和蓝点之间也有不定的压制关系。 求有多少个三角要求AAA压制BBB&#xff0c;BBB压制CCC&#xff0c;CCC压制AAA且至少包含…

给Ocelot做一个Docker 镜像

写在前面在微服务架构中&#xff0c;ApiGateway起到了承前启后&#xff0c;不仅可以根据客户端进行分类&#xff0c;也可以根据功能业务进行分类&#xff0c;而且对于服务调用服务也起到了很好的接口作用。目前在各个云端中&#xff0c;基本上都提供了ApiGateway的功能&#xf…

Spark SQL(一)之简介

Spark SQL是用于结构化数据处理的Spark模块。与基本的Spark RDD API不同&#xff0c;Spark SQL提供的接口为Spark提供了有关数据结构和正在执行的计算的更多信息。在内部&#xff0c;Spark SQL使用这些额外的信息来执行额外的优化。 与Spark SQL交互的方法有多种&#xff0c;包…

hdu4336-Card Collector【min-max容斥,期望概率】

正题 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid4336 题目大意 每次获得第iii张牌的概率为pip_ipi​(每次只能获得一张)&#xff0c;期望多少回合后获得所有牌。 解题思路 min−maxmin-maxmin−max容斥:max{S}∑T⊆S(−1)∣T∣−1min{T}max\{S\}\sum_{T\subseteq …

.NET Core UI框架Avalonia

.NET Core UI框架Avalonia&#xff0c;Avalonia是一个基于WPF XAML的跨平台UI框架&#xff0c;并支持多种操作系统&#xff1a;Windows&#xff08;.NET Framework&#xff0c;.NET Core&#xff09;&#xff0c;Linux&#xff08;GTK&#xff09;&#xff0c;MacOS&#xff0c…

Spark SQL(二)之DataSet操作

一、创建DataSet 使用SparkSession&#xff0c;应用程序可以从现有的RDD&#xff0c;Hive表的或Spark数据源创建DataFrame 。 &#xff08;1&#xff09;基于JSON的内容创建一个DataFrame //hdfs Dataset<Row> df spark.read().json("hdfs://master:9000/test.j…

jzoj6296-投票【期望dp,贪心】

正题 题目大意 nnn个人&#xff0c;第iii投票的概率是pip_ipi​&#xff0c;选择kkk个求最大的平票概率。 解题思路 我们显然要让kkk人中一半投票的概率大&#xff0c;一半投票的概率小。 所以我们可以先进行排序&#xff0c;这样我们发现答案一定是选取一段前缀和一段后缀。…

揽货最短路径解决方案算法 - C# 蚁群优化算法实现

需求为&#xff08;自己编的&#xff0c;非实际项目&#xff09;&#xff1a;某配送中心进行揽货&#xff0c;目标客户数为50个客户&#xff0c;配送中心目前的运力资源如下&#xff1a;现有车辆5台单台运力最大行驶距离200千米单台运力最大载重公斤1吨问&#xff1a;运力怎样走…

Spark SQL(三)之视图与执行SQL

一、视图与sql执行 SparkSession能够以编程方式运行SQL查询并返回结果Dataset<Row> Dataset<Row> df spark.read().json("hdfs://master:9000/test.json"); df.createOrReplaceTempView("man");Dataset<Row> sqlDF spark.sql("…

hdu4965-Fast Matrix Calculation【矩阵乘法】

正题 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid4965 题目大意 给出矩阵A,BA,BA,B&#xff0c;求(AB)n(AB)^n(AB)n。然后对于每个元素%6\% 6%6后取和。 题目大意 我们发现如果直接让AB∗ABAB*ABAB∗AB这样的时间复杂度是n3n^3n3&#xff0c;显然不可过。但是我们…

OIDC在 ASP.NET Core中的应用

我们在《ASP.NET Core项目实战的课程》第一章里面给identity server4做了一个全面的介绍和示例的练习 。如果想完全理解本文所涉及到的话题&#xff0c;你需要了解的背景知识有&#xff1a;什么是OpenId Connect (OIDC)OIDC 对oAuth进行了哪些扩展&#xff1f;Identity Server4…

论文阅读:Blind Super-Resolution Kernel Estimation using an Internal-GAN

这是发表在 2019 年 NIPS 上的一篇文章&#xff0c;那个时候还叫 NIPS&#xff0c;现在已经改名为 NeurIPS 了。文章中的其中一个作者 Michal Irani 是以色 Weizmann Institute of Science (魏茨曼科学研究学院) 的一名教授&#xff0c;对图像纹理的内在统计规律有着很深入的研…

Spark SQL(四)之DataSet与RDD转换

一、创建DataSet DataSet与RDD相似&#xff0c;但是&#xff0c;它们不使用Java序列化或Kryo&#xff0c;而是使用专用的Encoder对对象进行序列化以进行网络处理或传输。虽然编码器和标准序列化都负责将对象转换为字节&#xff0c;但是编码器是动态生成的代码&#xff0c;并使…

P3389-[模板]高斯消元法

正题 题目链接:https://www.luogu.org/problem/P3389 题目大意 给出一个nnn元一次方程组&#xff0c;求解。 解题思路 模板&#xff0c;有什么好说的吗 codecodecode #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> usi…

【ASP.NET Core】处理异常

依照老周的良好作风&#xff0c;开始之前先说点题外话。前面的博文中&#xff0c;老周介绍过自定义 MVC 视图的搜索路径&#xff0c;即向 ViewLocationFormats 列表添加相应的内容&#xff0c;其实&#xff0c;对 Razor Page 模型&#xff0c;也可以向 PageViewLocationFormats…

Spark SQL(五)之数据加载与存储

一、数据加载 &#xff08;1&#xff09;默认数据源&#xff08;parquet&#xff09; 最简单加载数据的方式&#xff0c;所有操作都使用默认数据源&#xff08;parquet&#xff09;。如果指定默认数据源需要配置 spark.sql.sources.default参数。 Dataset<Row> manDF …

树莓派3B上部署运行.net core 2程序

针对Linxu arm处理器如何部署.net core 2的资料很少&#xff0c;网上找到几篇但都写得不够详细&#xff0c;按照他们教程来撞墙了&#xff0c;折磨了几天终于部署成功了&#xff0c;先上一张运行成功的图1.windows系统中&#xff0c;在项目的目录下使用CMD命令运行进行发布dotn…

bzoj3143,P3232-[Hnoi2013]游走【数学期望,高斯消元,贪心】

正题 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id3143 https://www.luogu.org/problem/P3232 题目大意 一张无向图nnn个点mmm条边&#xff0c;然后给每条边附上1∼m1\sim m1∼m的权值(不能重复)&#xff0c;求1走到nnn的最小期望值。 解题思路 我们可以计…

Spark SQL(六)之加载数据的参数配置

一、配置 忽略损坏的文件、忽略丢失的文件、路径全局过滤器、递归文件查找和修改时间路径过滤器等选项/配置仅在使用基于文件的源&#xff08;parquet&#xff0c;orc&#xff0c;avro&#xff0c;json&#xff0c;csv&#xff0c;txt&#xff09;时才有效。 以下示例中使用的…

bzoj1013,luogu4035-[JSOI2008]球形空间产生器【高斯消元】

正题 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id3534 https://www.luogu.org/problem/P4035 题目大意 一个nnn维平面的元&#xff0c;给出圆表面上的n1n1n1个坐标&#xff0c;求圆心位置。 解题思路 对于圆心的第iii维位置xix_ixi​有∑j0n(ai,j−xi)2C\…