??斗地主捕鱼电竞提现秒到 广告位招租 - 15元/月全站展示
??支付宝搜索579087183领大额红包 ??伍彩集团官网直营彩票
??好待遇→招代理 ??伍彩集团官网直营彩票
??络茄网 广告位招租 - 15元/月全站展示
Scala类讲解

转载   2018-05-03   浏览量:484


Scala 中的类是创建对象的蓝图。类中可以包含方法,值,变量,类型,对象,traits(特征)和成员类。类型,对象和traits(特征)将在后面介绍。

定义类

最简单的类定义就是使用关键字 class 和标识符。类名应该使用大写。

class User
val user = new User

这里写图片描述
使用关键字 new 去创建一个类的实例对象。因为User没有自定义的构造器,所以Scala会为User提供一个默认的无参构造器。但是,我们更多的会去创建构造器和类体。接下来定义一个 Point 示例类:

class Point(var x: Int, var y: Int) {
  def move(dx: Int, dy: Int): Unit = {
    x = x + dx
    y = y + dy
  }
  override def toString: String =
    s"($x, $y)"
}
val point1 = new Point(2, 3)
point1.x  // 2
println(point1)  // prints (2, 3)

这里写图片描述
Point 类有四个成员:变量 x 和 y,方法 move 和 toString。不像许多其他语言一样,主构造器(var x: Int, var y: Int)定义在类的签名中,move 方法含有两个整型参数并返回不带任何信息的Unit值()。Unit和Java语言中的void类似。另一方面,String 方法没有参数仅仅返回一个字符串的值,因为 toString 使用 override 关键字重写了 AnyRef 中的 toString 方法。

构造器<喎?"//www.kbyp.net/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L3A+DQo8cD48Y29kZT48Y29kZT48Y29kZT48Y29kZT48Y29kZT48Y29kZT48Y29kZT7NqLn9zOG5qcSsyM/WtaOsubnU7Le9t6i/ydLUvt/T0L/J0aGyzsr9oaPI58/Cy/nKvqO6PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvcD4NCjxwcmUgY2xhc3M9"brush:java;"> class Point(var x: Int = 0, var y: Int = 0) val origin = new Point // x and y are both set to 0 val point1 = new Point(1) println(point1.x) // prints 1

这里写图片描述
Point 类中,因为 x 和 y 都有默认值0,所以就不需要参数了。但是,因为构造器是从左到右读取参数的,所以如果你只想传一个 y 值的话,那就需要给这个参数命名。

class Point(var x: Int = 0, var y: Int = 0)
val point2 = new Point(y=2)
println(point2.y)  // prints 2

这里写图片描述
这也是明确指定值的良好做法。

私有成员和Getter/Setter语法

成员默认都是公开的的,使用 private 访问修饰符对外部类隐藏实现细节。

class Point {
  private var _x = 0
  private var _y = 0
  private val bound = 100
  def x = _x
  def x_= (newValue: Int): Unit = {
    if (newValue < bound) _x = newValue else printWarning
  }
  def y = _y
  def y_= (newValue: Int): Unit = {
    if (newValue < bound) _y = newValue else printWarning
  }
  private def printWarning = println("WARNING: Out of bounds")
}

val point1 = new Point
point1.x = 99
point1.y = 101 // prints the warning

这里写图片描述
这里写图片描述
Ponit类中,数据存储在私有变量 x 和 y 中。方法 def x 和 def y 用于访问私有数据。方法 def x_= 和 def y_= 用于校验和设置变量 _x和 _y 的值。注意用于setters的特殊语法:该方法把 _= 附加到 getter 标识符上并且后面跟着参数。

主构造器中使用 var 或 val 声明的参数都是公开(public)的。但是,因为 val 是不可变的,所以不能随意修改??聪旅胬樱?/code>

class Point(val x: Int, val y: Int)
val point = new Point(1, 2)
point.x = 3  // <-- does not compile

这里写图片描述
上面的程序试图去修改 val 声明的 x 参数是不成功的。

没有使用 val 或 var 声明的参数是私有值,仅仅对于类的内部可见。

class Point(x: Int, y: Int)
val point = new Point(1, 2)
point.x  // <-- does not compile

这里写图片描述
想直接访问私有属性 x 或试图修改是不成功的。

转载自:https://www.2cto.com/net/201805/742515.html

招聘 不方便扫码就复制添加关注:程序员招聘谷,微信号:jobs1024


上一篇:

用scala实现二次排序
用scala实现二次排序,二次排序就是按照不同字段进行排序,类似于MapReduce里面的分组+排序的实现。
实现scala二次排序代码
二次排序就是按照不同字段进行排序代码。
Scala面向对象编程教程
如果只是希望拥有简单的getter和setter方法,那么就按照scala提供的语法规则,根据需求为field选择合适的修饰符就好:var、val、private、private[this],但是如果希望能够自己对getter与setter进行控制,则可以自定义getter与setter方法。
Scala闭包分析
由于apply方法只是简单调用apply$mcII$sp(int)方法,因此我们继续分析apply$mcII$sp(int)。首先它调用了ClosureDemo类的ClosureDemo$$i$1方法取i的值,然后取Int类型的j$1的值,再取IntRef类型的k$1中的elem值,将它们加在一起返回。
Scala写WordCount查看本地的前20条数据
Scala写WordCount,查看本地的前20条数据,并统计出现的次数,并且是多线程。代码。
scala教程之每日一练
创建一个Listvallst0=List(1,7,9,8,0,3,5,4,6,2)将lst0中每个元素乘以10后生成一个新的集合解析:lst0map(_*10)将lst0中的偶数取出来生成一个新的集合解析:lst0filter(_%2==0)将lst0排序后生成一个新的集合解析:lst0sorted
新手入门必看的Scala的基本使用
1函数式编程2变量类型val常量var变量lazyval惰性求值3数据类型AnyVal基本数据类型:NumerictypeBooleanCharUnit(void)
Scala练习九文件和正则表达式
Scala练习九文件和正则表达式。摘要:在本篇中,你将学习如何执行常用的文件处理任务,比如从文件中读取所有行或单词,或者读取包含数字的文件等。
Scala练习四映射和元组
Scala练习四映射和元组。摘要:一个经典的程序员名言是:"如果只能有一种数据结构,那就用哈希表吧"。哈希表或者更笼统地说映射,是最灵活多变的数据结构之一。映射是键/值对偶的集合。Scala有一个通用的叫法:元组,即n个对象的聚集,并不一定要相同类型的。
Scala练习四
Scala练习四。1设置一个映射,其中包含你想要的一些装备,以及它们的价格。然后构建另一个映射,采用同一组键,但在价格上打9折。