Dream灬虾虾--scala类

类的要点:

Dream灬虾虾--scala类_第1张图片

①类的字段自动带有getter和setter方法。不需要想java语言一样,要手动添加类的字段的getter、setter方法

②可以用定制的getter/setter方法替换掉字段的定义,而不必修改使用类的客户端---也就是所谓的“统一访问原则”

③可以是用@BeanProperty注解来生产JavaBeans的getXxx/setXxx方法。

④每个类都有一个主要的构造器,这个构造器和类定义“交织”在一起。它的参数直接成为类的字段。主构造器执行类体中的所有的语句

⑤辅助构造器是可选的。他们叫做this


详解:

一、简单类和无参方法

class Person {

var value=0

def getValue() {

println("value--"+ value)

} }

在scala中,类并不声明为public,Scala源文件可以包含多个类,所有这些类都具有公有可见性

使用该类就直接new就行,或者创建类的伴生对象object Person,伴生对象其实就是类的实例。

上面的Person会 生产面向JVM的类,其中有一个私有的value字段以及相应的getter和setter方法。这两个方法是公有的,因为我们没有将value声明为private。(对私有字段而言getter和setter方法也是私有的,外界是无法直接访问的类似“类.value”这样是得不到值的)

在scala中,getter和setter分别叫做value和value_=

在任何时候都可以自己重新定义getter和setter方法

说明:

Scala中getter和setter方法的说明

①如果字段是私有的,则getter和setter方法也是私有的。

②如果字段是val的,则只有getter方法被生产,没有setter方法。(因为val是不可以的,Scala编译后会生成一个final字段和一个getter方法,没有setter)

③如果你不需要getter和setter,可以将字段声明为private[this],(只有当前对象可以使用)

二、对象私有字段

在Scala中(java和C++也一样),方法可以访问该类的所有对象的私有字段。例如:

class Person {

private var value=0

def getValue() {

println("value--"+ value)

def isLess (other:Person) =value < other.value//可以访问另一个对象的私有字段

}

之所以访问other.value是合法的,是因为other也同样是Person对象。

如果private[this] var value =0(对象私有) ,那么某个对象.value这样的访问将不被允许了。只能在对象内部使用,下面的getValue是合法的,这样就可以通过类.getValue方法去访问value这个字段了

class Person {

private[this] val value=0(value字段已经不能声明为var的了。)

def getValue() {

println("value--"+ value)

}

}

对于类私有字段,Scala生成私有的getter和setter方法。但是对于对象私有的字段,Scala根本不会生成getter或setter方法

说明:

Scala允许你将访问权赋予指定的类。private[类名]修饰符可以定义仅有指定类的方法可以访问给定的字段。这里的类名必须是当前定义的类,或者是包含该类的外部类

在这种情况下,编译器会生成辅助的getter和setter方法,允许外部类访问该字段。这些类将会是公有的,因为JVM并没有更细粒度的访问控制系统,并且它们的名称也会随这JVM实现不同而不同

三、Bean属性

有@BeanProperty标志的字段,会生产javaBean规范的getXxx和setXxx方法。

所有字段都是private的。

val只对应get方法

var会有get和set方法

Person2.scala

classPerson2 {

private[this]valage=1

@BeanPropertyvalnameVal="wls"

@BeanPropertyvarnameVar="lyl"

varaihao="play"

valaival="wan"

defgetMyAge():Unit={

println("age--"+age)

}

}

对应的.class反编译之后的代码

public class Person2

{

private final int age = 1;

private final String nameVal = "wls";

private String nameVar = "lyl";

private String aihao = "play";

private final String aival = "wan";

public String nameVal()

{

return this.nameVal; }

public String nameVar() { return this.nameVar; }

public void nameVar_$eq(String x$1) { this.nameVar = x$1; }

public void setNameVar(String x$1) { this.nameVar = x$1; }

public String aihao() { return this.aihao; }

public void aihao_$eq(String x$1) { this.aihao = x$1; }

public String aival() { return this.aival; }

public void getMyAge() {

Predef..MODULE$.println(new StringBuilder().append("age--").append(BoxesRunTime.boxToInteger(this.age)).toString());

}

public String getNameVal()

{

return nameVal(); }

public String getNameVar() { return nameVar(); }

}

Dream灬虾虾--scala类_第2张图片

四、辅助构造器

和Java或C++一样,Scala也可以有任意多的构造器,不过,Scala类有一个构造器比其他所有构造器都更为重要,就是主构造器(primary constructor).除了主构造器之外,类还可以有任意多的辅助构造器(auxiliary constructor)

辅助构造器

辅助构造器通java的构造器有2处不同

①辅助构造器的名称为this。(在Java中,构造器的名称和类名相同,参数不同----当你修改命名时就不那么方便了)

②每一个辅助构造器都必须以一个对先前已定义的其他辅助构造器的调用开始


Dream灬虾虾--scala类_第3张图片

说明:

一个类如果没有显示定义主构造器则自动拥有一个无参的主构造器


五、主构造器

在Scala中,每个类都有主构造器,主构造器并不是以this方法定义,而是与类定义交织在一起。

①主构造器的参数直接放置在类名之后


Dream灬虾虾--scala类_第4张图片

主构造器的参数被编译成字段,其值被初始化成构造时传入的参数。在本例中name和age成为Person类的字段。如new Person("wls",27)这样的构造器调用将设置name和age字段

主构造器会执行类定义中的所有语句。

println语句是主构造器的一部分。每当有对象被构造出来时,上述代码就会被执行。当你需要在构造过程中配置某个字段时这个特性特别有用。比如:


Dream灬虾虾--scala类_第5张图片

说明:

如果类名之后没有参数,则该类具备一个无参构造器。这样一个构造器仅仅是简单地执行类体中的所有语句而已。

构造参数也可以是普通的方法参数,不带val或var。这样的参数如何处理取决于他们在类中如何被使用。

如果不带val或var的参数至少被一个方法所使用,他将被升格为字段


Dream灬虾虾--scala类_第6张图片

上述代码声明并初始化了不可变字段name和age,而这两个字段都是对象私有的。

类似这样的字段等同于private[this] val 字段的效果

否则,该参数将不被保存为字段。他仅仅是一个可以被主构造器中的代码访问的普通参数


Dream灬虾虾--scala类_第7张图片

如果主构造器的表示法让你困惑,你不需要使用它。你只要按照常规的做法提供一个或多个辅助构造器即可,不过要记得调用this(),如果你不和其他辅助构造器串接的话。

话虽如此,许多程序猿还是喜欢主构造器这种精简的写法。Martin Odersky建议这样来看待主构造器:在Scala中,类也接受参数,就像方法一样

说明:

当你把主构造器的参数看做是类参数时,不带val或var的参数就变得易于理解了。这样的参数的作用域涵盖了整个类。因此,您可以在方法中使用它们,而一旦你这样做了,编译器就自动帮你将它保存为字段。

如果想让主构造器变成私有的,可以像这样放置private关键字:


Dream灬虾虾--scala类_第8张图片

打印结果:Person4--namewls--age--277

你可能感兴趣的:(Dream灬虾虾--scala类)