对于 scala 的理解. 首先从代码方面来理解, 首先看下面的代码:
- scala:
- import scala.beans.BeanProperty
- object Demo2 {class Person{println("shanghai is a good place")
- @BeanProperty var sex: String=_
- }
- def main(args: Array[String]): Unit = {
- val sex = new Person()
- sex.setSex("male")
- print(sex.getSex)
- }
- }
运行完成之后的结果为:
shanghai is a good place
male
然后通过反编译工具对这段代码进行反编译生成的 java 代码如下:
- import scala.Predef.;
- import scala.reflect.ScalaSignature;
- public final class Demo2 {
- public static void main(String[] paramArrayOfString) {
- Demo2..MODULE$.main(paramArrayOfString);
- }
- public static class Person {
- private String sex;
- public String sex() {
- return this.sex;
- }
- public void sex_$eq(String x$1) {
- this.sex = x$1;
- }
- public String getSex() {
- return sex();
- }
- public void setSex(String x$1) {
- sex_$eq(x$1);
- }
- public Person() {
- Predef..MODULE$.println("shanghai is a good place");
- }
- }
- }
从上面的反编译的结果可以有如下的总结:
(1) 在 scala 中, 每个类都有主要的构造器, 这个构造器和类交织在一起, 他的参数直接成了类的字段. 主构造器执行类体中的所有语句.
除了主构造器之外, 我们还有辅构造器, 这个辅助构造器使用 this, 这一点和 java 当中的构造器不同. java 的构造器必须和类名相同. 这个就比较灵活.
反编译后的类变成了静态的类. 而且是 public 的静态类.
(2) 然后在类当中定义了一个变量 sex, 这个变量在 scala 当中作为私有的成员变量.(详见反编译后的代码), 因为是在这个私有的成员中加上了
@BeanProperty, 这个时候就想 java 中的 javabean 一样. 可以正常的使用 get set 方法, 对变量进行赋值和取值.(反编译后的代码转化成为 javabean 的形式, 但是还是有点不同)
(3) 在主构造器中的语句都会执行. 我们定义的输出. 在反编译后可以看到, 他会放在构造方法中去执行.
总结: 对于 scala 的语法. 紧凑严谨
来源: http://www.bubuko.com/infodetail-2560764.html