关于scala的简单理解,对象,属性

对于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的语法。紧凑严谨
原文地址:https://www.cnblogs.com/gxgd/p/8819769.html