MangoCool

Scala的基础学习(一)类和对象

2015-06-16 10:44:27   作者:独木   来源:博客园

为了充分的理解Spark,开始学习Scala。一开始学习的时候,看twitter在github上的学习资料,对于object和class真的不是很理解,为了帮助自己更好的理解和今后温习,决定记录此文!

Scala基础学习地址:http://twitter.github.io/scala_school/zh_cn/basics.html

Scala 的类大抵和 Java 是类似的,简单的例子如下:

class MyClass {
    var myField : Int = 0; 
     
    def this(value : Int) = {
        this();
        this.myField = value;
    } 
 
    def getMyField() : Int = {
        return this.myField; 
    }
 
    def addToMyField(value : Int) {
        this.myField += value;
    }
}

如果好奇,可以把编译后的代码反编译成Java代码看看:

import scala.reflect.ScalaSignature;

@ScalaSignature(bytes="\006\00112A!\001\002\001\013\t9Q*_\"mCN\034(\"A\002\002\017q*W\016\035;z}\r\0011C\001\001\007!\t9!\"D\001\t\025\005I\021!B:dC2\f\027BA\006\t\005\031\te.\037*fM\")Q\002\001C\001\035\0051A(\0338jiz\"\022a\004\t\003!\001i\021A\001\005\b%\001\001\r\021\"\001\024\003\035i\027PR5fY\022,\022\001\006\t\003\017UI!A\006\005\003\007%sG\017C\004\031\001\001\007I\021A\r\002\0275Lh)[3mI~#S-\035\013\0035u\001\"aB\016\n\005qA!\001B+oSRDqAH\f\002\002\003\007A#A\002yIEBa\001\t\001!B\023!\022\001C7z\r&,G\016\032\021\t\0135\001A\021\001\022\025\005=\031\003\"\002\023\"\001\004!\022!\002<bYV,\007\"\002\024\001\t\0039\023AC4fi6Kh)[3mIR\tA\003C\003*\001\021\005!&\001\007bI\022$v.T=GS\026dG\r\006\002\033W!)A\005\013a\001)\001")
public class MyClass
{
  private int myField = 0;
 
  public int myField() { return this.myField; }
  public void myField_$eq(int x$1) { this.myField = x$1; }
 
  public int getMyField() {
    return myField();
  }
 
  public void addToMyField(int value) {
    myField_$eq(myField() + value);
  }
 
  public MyClass() {
  }
 
  public MyClass(int value) {
    this();
    myField_$eq(value);
  }
}
除了ScalaSignature,其他部分再熟悉不过了。只是Scala在语法上稍作了改变,在学习了golang和swift之后,也应该习以为常了吧。
类部分虽然没有太多可说的地方,但是在对象上就有些许不同。Scala 中 object 用于构建 singleton 类型。
object Main {
    def sayHi() {
        println("Hi!");
    }
}
在 Java 进行调用的话,就是
Main.sayHi();
之前在Java中写过Singleton代码的话,很容易猜出来具体的实现。反编译的代码:
import scala.reflect.ScalaSignature;
 
@ScalaSignature(bytes="\006\001e9Q!\001\002\t\002\025\tA!T1j]*\t1!A\004=K6\004H/\037 \004\001A\021aaB\007\002\005\031)\001B\001E\001\023\t!Q*Y5o'\t9!\002\005\002\f\0355\tABC\001\016\003\025\0318-\0317b\023\tyAB\001\004B]f\024VM\032\005\006#\035!\tAE\001\007y%t\027\016\036 \025\003\025AQ\001F\004\005\002U\tQa]1z\021&$\022A\006\t\003\027]I!\001\007\007\003\tUs\027\016\036")
public final class Main {
  public static void sayHi() {
    Main..MODULE$.sayHi();
  }
}
实现上来讲,只是多了一个 Main$ 类来实现具体的代码。
有了静态成员,如何添加非静态成员?Scala给出的答案是 Companion Objects,也就是定义同名 class。
object Main {
    def sayHi() {
        println("Hi!");
    }
}
 
class Main {
    def sayHelloWorld() {
        println("Hello World");
    }
}
这样一来,Main既支持静态方式调用,也支持实例化。其实在 Java 中只是一个类,包含了静态成员和非静态成员而已。
public class Main {
  public static void sayHi() {
    Main..MODULE$.sayHi();
  }
 
  public void sayHelloWorld() {
    Predef..MODULE$.println("Hello World");
  }
}
可以考虑一种情况,object 和 class 中都定义了相同名称的成员,结果会如何呢?
object Main {
    def sayHi() {
        println("Hi!");
    }
}
 
class Main {
    def sayHelloWorld() {
        println("Hello World");
    }
 
    def sayHi() {
        println("non-static hi!")
    }
}
编译没有报错,结果是静态成员无法访问了。
error: non-static method sayHi() cannot be referenced from a static context
        Main.sayHi();
            ^
1 error
静态方法被隐藏了,可以通过反编译来验证。
public class Main {
  public void sayHelloWorld() {
    Predef..MODULE$.println("Hello World");
  }
 
  public void sayHi() {
    Predef..MODULE$.println("non-static hi!");
  }
}
实际生成的代码中并不包含静态成员。有没有办法访问之前的静态成员呢?可以试试下面的代码:
Main$.MODULE$.sayHi();
当然,以上是Java中调用的情况,在 Scala 中是可以区分两个sayHi的。
object UseInScala {
    def main(args: Array[String]) {
        Main.sayHi();
        var main = new Main();
        main.sayHi();
    }
}
输出:
Hi!
non-static hi!
从这些方面来看,Scala 的代码是极容易引入到 Java 中的,下一步可能会花些功夫在 Scala 的学习和应用上。


文章来源:http://www.cnblogs.com/huys03/p/3994007.html

标签: Scala object class Singleton Companion Objects

分享:

上一篇Scala的基础学习(二)变量

下一篇linux下打开端口命令

关于我

崇尚极简,热爱技术,喜欢唱歌,热衷旅行,爱好电子产品的一介码农。

座右铭

当你的才华还撑不起你的野心的时候,你就应该静下心来学习,永不止步!

人生之旅历途甚长,所争决不在一年半月,万不可因此着急失望,招精神之萎葸。

Copyright 2015- 芒果酷(mangocool.com) All rights reserved. 湘ICP备14019394号

免责声明:本网站部分文章转载其他媒体,意在为公众提供免费服务。如有信息侵犯了您的权益,可与本网站联系,本网站将尽快予以撤除。