码迷,mamicode.com
首页 > 其他好文 > 详细

8.对象(object)

时间:2015-05-20 17:46:18      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:

在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();
  }
}

 

8.对象(object)

标签:

原文地址:http://www.cnblogs.com/sysman/p/4517533.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!