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

  输出:

> scala UseInScala
Hi!
non-static hi!

  

从这些方面来看,Scala 的代码是极容易引入到 Java 中的,下一步可能会花些功夫在 Scala 的学习和应用上。

[1]http://tutorials.jenkov.com/scala/singleton-and-companion-objects.html

Scala 学习笔记(2)之类和对象的更多相关文章

  1. scala 学习笔记十 一 伴生对象

    1.介绍 a.所谓伴生对象就是和某个class同名的object, 并且object 必须和class在同一个scala源文件中. b.在scala中,没有像java中的静态类,静态方法和静态成员等, ...

  2. 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性

    基于.net的分布式系统限流组件   在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...

  3. Scala学习笔记及与Java不同之处总结-从Java开发者角度

    Scala与Java具有很多相似之处,但又有很多不同.这里主要从一个Java开发者的角度,总结在使用Scala的过程中所面临的一些思维转变. 这里仅仅是总结了部分两种语言在开发过程中的不同,以后会陆续 ...

  4. Java学习笔记之---类和对象

    Java学习笔记之---类和对象 (一)类 类是一个模板,它描述一类对象的行为和状态  例如:动物类是一个类,动物们都有属性:颜色,动物们都有行为:吃饭 public class Dog { Stri ...

  5. Scala学习笔记之伴生对象

    所谓伴生对象, 也是一个Scala中的单例对象, 使用object关键字修饰. 除此之外, 还有一个使用class关键字定义的同名类, 这个类和单例对象存在于同一个文件中, 这个类就叫做这个单例对象的 ...

  6. Scala学习笔记(五):类和对象

    对象实例的变量组成了对象的内存映射 public是Scala的默认访问级别 Scala里方法参数的一个重要特征是它们都是val,不是var Scala不能定义静态成员 单例对象(singleton o ...

  7. 【大数据】Scala学习笔记

    第 1 章 scala的概述1 1.1 学习sdala的原因 1 1.2 Scala语言诞生小故事 1 1.3 Scala 和 Java  以及 jvm 的关系分析图 2 1.4 Scala语言的特点 ...

  8. Scala学习笔记之:tuple、array、Map

    [TOC] 本文<快学Scala>的笔记 tuple学习笔记 tuple的定义 对偶是元组(tuple)的最简单形态--元组是不同类型的值的聚集. 元组的值是通过将单个值包含在圆括号中构成 ...

  9. [原创]java WEB学习笔记15:域对象的属性操作(pageContext,request,session,application) 及 请求的重定向和转发

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  10. Scala学习笔记之二--基本数据类型

    前言 本篇主要讲Scala的基本数据类型,更多教程请参考:Scala教程 基本数据类型 Scala一共提供了9中数据类型,Scala的基本数据类型与java中的基本数据类型是一一对应的,这是Scala ...

随机推荐

  1. Mouse Hunt CodeForces - 1027D(思维 找环)

    Medicine faculty of Berland State University has just finished their admission campaign. As usual, a ...

  2. tomcat 启用NIO

    从Tomcat6.0以后, Java开发者很容易就可以是用NIO的技术来提升tomcat的并发处理能力. <Connector port="8080" protocol=&q ...

  3. 沉迷AC自动机无法自拔之:[UVALive 4126] Password Suspects

    图片加载可能有点慢,请跳过题面先看题解,谢谢 一看到这么多模式串就非常兴奋,又是\(AC\)自动机 题目就是要求:经过 \(n\) 个节点,把所有单词都遍历一遍的方案数,和那道题差不多嘛 所以这样设: ...

  4. 【BZOJ3832】[POI2014]Rally(拓扑排序,动态规划)

    [BZOJ3832][POI2014]Rally(拓扑排序,动态规划) 题面 BZOJ,权限题 洛谷 题解 这题好强啊,感觉学了好多东西似的. 首先发现了一个图画的很好的博客,戳这里 然后我来补充一下 ...

  5. Java SSM框架之MyBatis3(五)MyBatis之ResultMap详解

    resultMap是Mybatis最强大的元素,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中. resultMap包含的元素: <!--column不做限制,可以为任意 ...

  6. JavaScript继承详解(四)

    在本章中,我们将分析Douglas Crockford关于JavaScript继承的一个实现 - Classical Inheritance in JavaScript. Crockford是Java ...

  7. Ionic -- css

    Header 固定在头部,可以包含标题标签,可以有左右按钮 样式:bar bar-header bar-light 第一个小节 第二个表示的是头部 第三个表示颜色 子头部,需要在ion-content ...

  8. 20155314 2016-2017-2 《Java程序设计》第7周学习总结

    20155314 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 了解Lambda语法 了解方法引用 了解Fucntional与Stream API 掌握Da ...

  9. 第12月第15天 mysqlx boost reswift

    1. INSTALL PLUGIN mysqlx SONAME 'mysqlx.so' https://yq.aliyun.com/articles/38288 2. boost boost::sha ...

  10. 第7月第19天 swift on linux

    1. https://github.com/iachievedit/moreswift http://dev.iachieved.it/iachievedit/more-swift-on-linux/ ...