探索Scala(7)-- 字段

本文讨论一下在Scala语言里,字段(Fields)是如何实现的

字段实际上是getter/setter方法

在Scala里,字段是通过varval关键字来定义的。var字段是可读写的,val字段是只读的。下面是一个简单的例子:

class MyObj {
    var intVar = 1
    val strVal = "str"
}

反编译之后,可以得到下面的Java代码:

public class MyObj {

    private int intVar = 1;
    private final String strVal = "str";

    public int intVar() {return intVar;}
    public void intVar_$eq(int intVar) {this.intVar = intVar;}

    public String strVal() {return strVal;}

}

可见:

  • 对于var字段,Scala编译器会生成相应的Java字段和一对儿getter/setter方法
  • 对于val字段,编译器会生成final字段和getter方法
  • getter方法和字段同名
  • setter方法为:字段名_$eq

抽象字段

因为字段实际上就是getter/setter方法,所以在Scala里,可以定义抽象字段(只要不赋初始值即可):

abstract class AbstractObj {
    var intVar: Int
    val strVal: String
}

反编译之后,得到下面Java代码:

public abstract class AbstractObj {
    public abstract int intVar();
    public abstract void intVar_$eq(int intVar);
    public abstract String strVal();
}

字段重写

只有val字段可以被override,如下所示:

class MySubObj extends MyObj {
    override val strVal = "substr"
}

反编译后,得到下面的Java代码:

public class MySubObj extends MyObj {
    private final String strVal = "substr";

    @Override
    public String strVal() {
        return strVal;
    }
}

如果不想让val字段被子类重写,可以给字段加上final关键字:

class MyObj {
    var intVar = 1
    final val strVal = "str"
}

private字段

字段默认是public,但是即使改成private,Scala仍然会给字段生成getter/setter方法。如果字段只在对象内使用,可以把字段的访问级别设置成private[this],这样,字段的含义就跟Java一样了(而且拥有更小的可见范围--只有对象自己可见):

class ObjectPrivateFields {
    private[this] var intVar = 1
    private[this] val strVal = "str"
}

生成JavaBean风格Getter/Setter方法

如果想生成JavaBean风格的getter/setter方法,可以给字段打上@BeanProperty注解:

import scala.beans.BeanProperty
class ScalaBean {
    @BeanProperty var intVar = 1
    @BeanProperty val strVal = "str"
}

参考资料

《Scala for the Impatient》

时间: 2024-08-02 12:30:18

探索Scala(7)-- 字段的相关文章

探索Scala(8)-- 关键字

本文比较一下Java和Scala语言的关键字 Java关键字 Java一共有50个关键字(keywords),其中有2个是保留字,目前还不曾用到:goto和const.true.false和null看起来很像关键字,但实际上只是字面量而已.本文粗略的把true.false和null也看做Java关键字,认为Java一共有53个关键字.下面是大致归类的Java关键字列表: assert boolean, byte, short, char, int, long, float, double, vo

探索Scala(4)-- Case Classes

本文简单探讨一下Scala语言Case Class的实现机制 Case Class Case Class是Scala语言模式匹配功能的基础.如果定义类的时候加上case关键字,那么它就变成了Case Class,比如下面这个简单的类CC: case class CC(x: Int, y: Int) 那么加上case关键字对于一个类来说,到底意味着什么呢?下文将进行详细的解释. 单例对象 编译CC,会产生两个class:CC.class和CC$.class.这说明,Scala会给case类自动添加

探索Scala(3)-- 单例对象

研究一下Scala语言的单例对象(Singleton Objects),为下一篇文章做准备. static不是关键字 上一篇文章提到过,interface并不是Scala语言关键字,可以自由使用.同样,static在Scala里也没有特殊的含义,也是可以自由使用的,如下面代码所示: 单例对象 Java并不是完美的面向对象语言,包括很多缺陷,比如允许static字段和方法,primitive类型,等等.Scala语言在这些方面都有所改进,所以号称是比Java更OO的语言.既然去掉了static关键

探索Scala(6)-- Tuples

本文讨论一下Tuple的用法和实现方式 Unit Scala语言没有void关键字,取而代之的,是Unit概念(和对象).Scala比Java更加OO,这也算是其中一个方面.从Scala语言的角度来讲,Unit和Tuple并没有太大的联系,但是基于两点原因,我打算先讨论一下Unit: 概念相似:Tuple表示包含n(n > 0)个元素的对象,Unit表示没有对象,或不需要对象.所以Unit可以认为是Tuple的一种特殊情况,即包含0个元素的Tuple. 语法相似:可以用圆括号来创建Tuple实例

探索Scala(5)-- 基本类型

文本讨论一下Scala语言基本类型的实现方式 Java基本类型 Java的数据类型大致可以分为两类:基本(Primitive)类型和对象类型.基本类型一共有8种,分别是boolean.byte.short.char.int.long.float.double.为了把基本类型融入OO系统,Java提供了包装类(Wrapper).包装类在包java.lang里,一共8个,分别与基本类型一一对应,它们是:Boolean.Byte.Short.Character.Integer.Long.Float和D

Scala之继承

1. 继承 Scala语言通过 extends 关键字来继承类.那么继承一个类有什么好处呢? 子类除了拥有继承自超类的方法和字段(即为val(常量), var(变量)所定义的), 还可以添加自己需要的新方法和新字段, 而且不但可以重写(override)超类的方法, 还可以重写超类的字段. final 关键字 在Scala中, 不仅可以将类声明为final, 而且可以将字段和方法声明为final 当类被声明为final时, 类不可以被继承; 当方法和字段被声明为final时, 对应的方法和字段不

Scala学习(四)

抽象类定义:abstract class Element{ def contents:Array[String]; def height = contents.length} 定义无参数方法:如果仅提供对象的某个数据的访问(没有副作用的方法),那么久省略括号.定义成无参数方法. 如果无参数方法用用到的地方较多并且比较频繁,建议把无参数方法def height = contents.length变成val height = contents.length的字段值.两者的区别是:因为字段值在类初始化

Scala总结

===概述 scala是一门以java虚拟机(JVM)为目标运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言. scala是纯粹的面向对象的语言.java虽然是面向对象的语言,但是它不是纯粹的,因为java的基本数据类型不是类,并且在java中还有静态成员变量和静态方法.相反,scala是纯粹面向对象的,每个值都是对象,每个操作都是方法调用. scala也是一个成熟的函数式语言.函数式编程有两个指导思想:①函数是头等值,也就是说函数也是值,并且和其他类型(如整数.字符串等)

Scala学习(八)---Scala继承

Scala继承 摘要: 在本篇中,你将了解到Scala的继承与Java和C++最显著的不同.要点包括: 1. extends.final关键字和Java中相同 2. 重写方法时必须用override 3. 只有主构造器可以调用超类的主构造器 4. 你可以重写字段 在本篇中,我们只探讨类继承自另一个类的情况.继承特质的内容后面会详细介绍 扩展类 扩展关键字 Scala扩展类的方式和Java一样,使用extends关键字: class Employee extends Person { var sa