标签:
在Scala中没有static关键字.如果我们想实现Java中的static语法,在scala中我们可以使用object来实现.如果仅从
面向对象的层面来说static确实在一定程度上不符合OOP的理念.但是在某些时候使用static语义还是很必要的.在
scala中我们可以使用object关键字声明一个单例对象.如下:
package chapter06 object Adder { println("I am in constructor...") private var current = 0 def addOne():Int={ current = current+1 current } }
在如上代码中我们声明了一个单例对象Adder.在scala中碰到object声明时,编译器会生成一个虚构类,并实例化出
一个该虚构类的实例.拿到本例中,scala编译器看到object Adder{...}后会生成一个虚构类Adder$.并生成另外一
个final类Adder.Adder会把Adder$中的所有非私有方法在自己中声明一遍并把这些方法都改为static的.当我们
首次调用Adder类的某个静态方法时才会触发Adder$虚构类的单例的实例化.运行如下测试类:
package chapter06 object MainApp extends App { println(Adder.addOne()) println(Adder.addOne()) println(Adder.addOne()) }
如果我们想要实现java中的在一个类中既有static方法又有实例方法,我们可以使用scala中的伴生对象来实现.伴生
对象是指对象名跟类名相同的情况。如下:
package chapter06 class Adder{ def sayHi{ println("Hi") } def addOne():Int={ Adder.addOne() } } object Adder { println("I am in constructor...") private var current = 0 def addOne():Int={ current = current+1 current } def addTwo():Int={ current = current+2 current } }
我们把对象Adder跟类Adder声明到同一个源文件中.这时候对象跟类就可以互相访问私有成员.有一点值得注意:可
以在class中覆盖object中的方法.所以如果我们想要在class中调用object的方法必须使用Adder.method()这种形
式.我们可以看下反编译出来的类:
//Adder$.class package chapter06; import scala.Predef.; public final class Adder$ { public static final MODULE$; private int current; private int current() { return this.current; } private void current_$eq(int x$1) { this.current = x$1; } public int addOne() { current_$eq(current() + 1); return current(); } public int addTwo() { current_$eq(current() + 2); return current(); } private Adder$() { MODULE$ = this;Predef..MODULE$.println("I am in constructor...");this.current = 0; } static { new (); } } //Adder.class package chapter06; import scala.Predef.; import scala.reflect.ScalaSignature; @ScalaSignature(bytes="") public class Adder { //对象中的方法在反编译的类中是静态的 public static int addTwo() { return Adder..MODULE$.addTwo(); } //类中的方法保持不变 public void sayHi() { Predef..MODULE$.println("Hi"); } //类中的方法可以覆盖对象中的方法 public int addOne() { return Adder..MODULE$.addOne(); } }
标签:
原文地址:http://www.cnblogs.com/sysman/p/4517533.html