Scala基础入门-4

Scala学习——类

简单类和无参方法

class Counter {
  private var value = 0 // 必须初始化字段
  def increment() { value += 1 } // 方法默认公有
  def current() = value
}

  

Scala中的类不声明为public,一个Scala源文件中可以有多个类。

val myCounter = new Counter // 或new Counter()
myCounter.increment()

  

调用无参方法时,圆括号是可写可不写的。推荐的做法是:如果是会改变对象状态的方法,就带上( );否则,就不带。

如果将方法的声明改为以下形式,那么可以强制不能带( )(下面要提到的getter就是这种风格的,所以调用getter时,必须不带( )):

class Counter {
  private var value = 0 // 必须初始化字段
  def increment() { value += 1 } // 方法默认公有
  def current = value // 调用必须是myCounter.current这种风格
}

  

带getter和setter的属性

在Java中,通常将字段声明为私有的,然后添加公有的getter和setter方法来提供访问字段的接口。像这样拥有一对getter/setter的字段,通常被称为属性(property)。

Scala对每个字段都提供了getter和setter方法。

class Person {
  var age = 0
}

  

在面向JVM的类中,这个简单的Person类有一个私有的age字段和相应的,公有的getter和setter方法。(如果将age声明为private的,getter和setter方法也是私有的。)Scala中,getter和setter分别叫做age和age_=。

println(fred.age) // 调用方法fred.age()
fred.age = 21 // 调用方法fred.age_=(21)

  

将这个简单的Person编译后,使用javap查看生成的字节码,可以验证这一点。

// -private选项说明显示所有的类和成员
javap -private Person.class

  

public class Person implements scala.ScalaObject {
  private int age;
  public int age();
  public void age_$eq(int); // =号被翻译成了$eq
  public Person();
}

  

知道了这些默认实现后,就可以使用自己的实现来代替默认实现了。

class Person {
  private var privateAge = 0

  def age = privateAge
  def age_=(newValue: Int) {
  	if (newValue > privateAge) privateAge = newValue
  }
}

  

Scala中,字段和getter/setter间的关系,还有其他几种情况。

使用val声明的字段,是只有getter,因为val声明的是不可变的啊。Scala中不能实现只有setter的字段。

还有种对象私有字段。Scala中,方法可以访问该类的所有对象的私有字段,这一点与Java一样。如果通过private[this]来字段来修饰,那么这个字段是对象私有的,这种情况下,不会生成getter和setter。对象私有字段,只能由当前对象的方法访问,而该类的其他对象的方法是无法访问的。如果说分不清楚对象和类的区别,这里就又要犯浑了。

接下来是一种与private[this]相似的访问控制。Scala中可以使用private[class-name]来指定可以访问该字段的类,class-name必须是当前定义的类,或者是当前定义的类的外部类。这种情况会生成getter和setter方法。

Bean属性(L1)

使用 @BeanProperty注解来为字段生成符合JavaBeans规范的getter/setter方法。使用该注解后,将会生成4个方法:Scala的getter/setter和JavaBeans规范的getter/setter(如果是val声明,就没有setter部分了)。

import scala.reflect.BeanProperty
// 在Scala 2.10.0之后已被废弃
// 使用scala.beans.BeanProperty代替
class Person {
  @BeanProperty var name: String = _
}

  

构造器(Constructor)

在Scala中,有两种构造器,主构造器(primary constructor)和辅助构造器(auxiliary constructor)。

辅助构造器

首先来讨论辅助构造器,因为比主构造器更容易理解。辅助构造器与Java构造器很相似,但有两点不同:

  • 名字是this(Java中构造器名称与类名相同)
  • 辅助构造器必须以对已经定义的辅助构造器或主构造器的调用开始
class Person {
  private var name = ""
  private var age = 0

  def this(name: String) {
    this() // 调用主构造器
    this.name = name
  }

  def this(name: String, age: Int) {
    this(name)  // 调用辅助构造器
    this.age = age
  }
}

  

val p1 = new Person // 主构造器
val p2 = new Person("Fred")  // 第一个辅助构造器
val p3 = new Person("Fred", 42) // 第二个辅助构造器

  

主构造器

Scala中每个类都有主构造器,并且是与类定义混合在一起的。

主构造器的参数,是类名后()内的内容。

class Person(val name: String, val age: Int) {
  // val name: String, val age: Int 部分就是主构造器的参数
}

  

定义如上一个简单类,然后创建一个Person的对象,结果如下:

scala> val fred = new Person
0
1
2
fred: Person = [email protected]

  

也就是说,主构造器会将类定义内的,也就是{ }内的,所有语句执行一次。

如果主构造器参数不带val或var,那么会根据是否被方法使用来决定。如果不带val或var的参数被方法使用了,它会变为对象私有字段;如果没有被方法使用,则被当成一个普通的参数,不升级成字段。

主构造器或许不太好理解。Martin Odersky建议如此看主构造器:Scala中的类也接受参数,像方法一样。

可以将主构造器变为私有的,将private关键字放在圆括号前:

fRom: http://nerd-is.in/2013-08/scala-learning-classes/

时间: 2024-11-29 04:59:03

Scala基础入门-4的相关文章

Scala基础入门-1

首先需要Scala开发环境的搭建,网上自己找教程. 声明常量与变量 val foo = 0 // 常量 var bar = 0 // 变量 在Scala中,更加鼓励使用val来进行声明,也就是推荐使用常量.在大部分时候不需要分号,看自己便好…虽然是强静态类型的语言,但是却并没有写出类型——这就是类型推断. 也可以指定类型: val spark: String = "Hello Scala" 多个的同时声明: val xInt, yInt = 100 // xInt, yInt都声明为1

Scala基础入门-代码碎片

import scala.util.control._ import java.util.Date object Test { def main(args: Array[String]) { // var a = 10; // var b = 20; // var c = 25; // var d = 25; // println("a + b = " + (a + b) ); // println("a - b = " + (a - b) ); // printl

Scala 基础入门【翻译】

原文地址 本文只是带你进入 Scala 的世界,包括安装.不可变变量 val.可变变量 var.定义类.集合(包括列表(list).集(set).映射(map))以及集合遍历和集合库(能达到并行/并发效果). 题外话,如果 Java 争气的话,还就真不会出现像 Scala 这些语言.对于函数编程风格的支持,尤其是对于 Lambda 表达式的支持,能够有助于减少必须要编写的逻辑无关样板代码,也许让它可以更简单的关注要面对的任务本身.而 Java 对 Lamdba 表达式的支持到 JavaSE8 才

scala基础入门

类方法.if.while.for package per.xxl /**  * @author Administrator  */ class HelloScala {    } //object声明类,表示此类为单例,在第一次调用的时候初始化 //类中的方法都是静态方法 object HelloScala{      def hello(name:String):String={     "hello "+name   }   //无参方法可以去掉(),如果没()则调用时不能有()

Scala基础语法(声明定义、标识符命名、Scala脚本入门)

一.声明与定义(赋值) 1.val, 常量声明   val x:T val x:T=e 2.var, 变量声明   var x:T var x:T=e ?类型省略(默认类型)val x=e var x=e ? 声明省略(连续声明) val x1,x2,x3 等价于 val x1;val x2; var x1,x2,x3:T=e  等价于  var xn:T=e 3.def,函数声明def abc(xn:T):T*=e def adder(m:Int,n:Int) =m+n def adder()

Spark入门到精通视频学习资料--第一章、Scala基础与实践

第一章.Scala基础与实践(3讲) Scala编程语言抓住了很多开发者的眼球.如果你粗略浏览Scala的网站,你会觉得Scala是一种纯粹的面向对象编程语言,而又无缝地结合了命令式和函数式的编程风格. 根据David Rupp在博客中的说法,Scala可能是下下一代Java. Scala有几项关键特性表明了它的面向对象的本质.例如,Scala中的每个值都是一个对象,包括基本数据类型(即布尔值.数字等)在内,连函数也是对象.另外,类可以被子类化,而且Scala还提供了基于mixin的组合(mix

【原创 Hadoop&Spark 动手实践 5】Spark 基础入门,集群搭建以及Spark Shell

Spark 基础入门,集群搭建以及Spark Shell 主要借助Spark基础的PPT,再加上实际的动手操作来加强概念的理解和实践. Spark 安装部署 理论已经了解的差不多了,接下来是实际动手实验: 练习1 利用Spark Shell(本机模式) 完成WordCount spark-shell 进行Spark-shell本机模式 第一步:通过文件方式导入数据 scala> val rdd1 = sc.textFile("file:///tmp/wordcount.txt")

大数据系统学习零基础入门到精通加项目实战2017最新全套视频教程

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv

Android基础入门教程——10.12 传感器专题(3)——加速度-陀螺仪传感器

Android基础入门教程--10.12 传感器专题(3)--加速度/陀螺仪传感器 标签(空格分隔): Android基础入门教程 本节引言: 本节继续来扣Android中的传感器,本节带来的是加速度传感器(Accelerometer sensor)以及 陀螺仪传感器(Gyroscope sensor),和上一节的方向传感器一样有着x,y,z 三个轴, 还是要说一点:x,y轴的坐标要和绘图那里的x,y轴区分开来!传感器的是以左下角 为原点的!x向右,y向上!好的,带着我们的套路来学本节的传感器吧