`

scala object 与class 区别

 
阅读更多

原博客:http://dreamhead.blogbus.com/logs/60217908.html

准备涉水Scala的Java程序员请注意,Scala里没有static。

在大多数情况下,static真不该是static的。像Scala这样想在面向对象上更进一步的程序设计语言,取消static是一种进取的表现,这样得以保证了其面向对象模型的完整性。好吧,我承认,有时候,我们还是需要类一级的属性和操作的。在Scala里,我们还是有机会的,这便是伴生对象(Companion Object)的作用。

下面就是一个伴生对象的例子:

object Companion {
  def show = println("I am a companion")
}

class Companion {
  def shout = Companion.show
}
(Companion.scala)

这个object就是我们所说的伴生对象,如果读过《走进Scala——Singleton》,你会觉得这个伴生对象和Singleton异曲同工,实际上,是这样的。伴生对象本身就是一个Singleton,不同的是,它有一个与之同名的类(这里的class Companion),二者可以相互访问彼此的私有成员。在这里,我们暂且不关心私有成员的相互访问。

编译一下:
  scalac Companion.scala

同Singleton一样,我们也得到了两个文件:Companion.class和Companion$.class。我们还可以用javap查看反编译的结果,其中,Companion$.class与之前的Singleton$.class几近相同,这里就省略了。一起来看看Companion.class。
  javap Companion

public class Companion extends java.lang.Object implements scala.ScalaObject{
    public static final void show();
    public Companion();
    public void shout();
}

因为有了对应的class,object成了伴生对象。从结果可以看出,伴生对象和它对应的类在字节码层面走到了一起(Companion类)。换句话说,在Scala里面的class和object在Java层面里面合二为一,class里面的成员成了实例成员,object成员成了static成员。我们已经知道,这里的static成员只是一个简单的wrapper,封装了实际的操作。

对应到反编译的代码上,我们看到了与object相关的那个static方法——show。因为要构建Companion的实例,所以,生成的代码里有构造函数。此外,class Companion的实例方法shout在字节码层面上也体现到了Companion类里。

至此,我们已经对伴生对象有了一个基本的了解。在Scala的层面上,我们把分属于类和实例分开放置,从代码的组织而言,会更加清晰。在实现层面上,它们都是按照对象处理的(分别用Companion$和Companion),从而达到了对象模型的统一。

最后,我想说,请善用object。

 
分享到:
评论

相关推荐

    浅谈Scala的Class、Object和Apply()方法

    在Scala编程语言中,`Class`和`Object`扮演着重要的角色,它们是构建程序的基础。Scala的面向对象特性使得这两个概念与Java等其他语言有所不同。这篇文章将深入探讨`Class`、`Object`以及`Apply()`方法在Scala中的...

    Scala考试题1

    3. **object 和 class 的区别**: - `object` 单例对象,每个类只能有一个实例,常用于全局变量和静态方法。 - `class` 用于创建对象,可以实例化多个。 4. **case class 和 class 类的区别**: - `case class` ...

    Scala基础与实践

    Scala是一门现代的多范式编程语言,主要设计目的是为了结合面向对象编程(OO)和函数式编程(FP)的各种特性,同时通过静态类型系统以及与Java平台的互操作性,实现可伸缩的语言设计。Scala基于JVM运行,这意味着它...

    Scala编程详解 第13讲-Scala编程详解:面向对象编程之对象 共9页.pptx

    `object`和`class`可以形成伴生关系,当一个`class`有一个与它同名的`object`时,我们称`object`是`class`的伴生对象,反之亦然。伴生对的特性使得它们可以互相访问对方的`private`成员,增强了封装性。如下所示: ...

    Scala下载安装教程

    在右键“src”选项中,选择“New”->“scala class”,并将 kind 选项选择为“object”。然后,输入代码,点击三角符号运行即可。 后续学习 Scala 是一个强大且灵活的编程语言,它提供了广泛的应用领域。本教程...

    Scala样例类练习.docx

    ### Scala样例类详解与实践 #### 一、样例类基本概念 在Scala中,样例类(Case Class)是一种特殊类型的类,主要用于模式匹配和不可变数据结构的构建。它们提供了许多便利的功能,如自动实现`equals`、`hashCode`、...

    scala入门(仅供参考)

    这将在当前目录下生成`.class`文件,可以使用`scala`命令执行它们。 ### 2.2 运行Scala程序 编译完成后,可以使用`scala`命令运行程序: ```bash scala -classpath . HelloWorld ``` 程序将输出"Hello, world!...

    Scala语言入门

    - **`object`关键字**:在Scala中,`object`关键字用于定义单例对象。单例对象在整个程序中只有一个实例,通常用于替代Java中的静态方法和静态变量。在这个例子中,`HelloWorld`是一个单例对象。 - **`def`关键字**...

    Scala-升级版.docx

    3. **类和对象**:Scala的类使用`class`关键字定义,而单例对象(Singleton Object)使用`object`关键字,可以看作是静态类的替代品。 例如,以下是一个简单的Scala类和对象示例: ```scala class Person { val ...

    intellij的scala工具bin文件

    在IntelliJ IDEA中配置Scala插件后,你可以创建Scala项目,并通过IDE中的"New -> Scala Object"或"New -> Scala Class"来创建新的类或对象。插件还会帮助你进行Spark项目的配置,例如添加Spark库依赖,设置运行/调试...

    scala入门--文档版本

    #### 一、Scala简介与特点 **Scala**是一种融合了面向对象编程和函数式编程特性的现代编程语言。它被设计成一种可扩展的语言,旨在克服传统编程语言的一些限制,同时保持代码的简洁性和可读性。 - **语言特点**: ...

    Scala实操教程及演示

    1. **Java与Scala的互操作性**:Scala代码可以直接调用Java库,并且Scala和Java代码可以在同一个项目中混合编写。 2. **类型推断**:Scala允许程序员省略变量或方法的显式类型声明,编译器能够自动推断出正确的类型...

    scala编程入门教材

    单例对象是Scala的一个特色,它可以通过`object`关键字创建,作为全局的、静态的访问点。 3. **函数**:Scala中的函数是一等公民,可以作为变量赋值、作为参数传递和作为返回值。函数使用`def`关键字定义,支持高阶...

    基于maven的scala与java相互调用的简单实例

    标题"基于maven的scala与java相互调用的简单实例"揭示了这个示例的核心:在Maven项目中,使用Scala和Java代码互相调用。Scala是一种强大的静态类型编程语言,它在语法上兼容Java,并且提供了函数式编程和面向对象...

    scala零基础学习

    尽管没有列出具体的关键字列表,但通常包括`class`, `def`, `object`, `import`, `package`, `trait`, `type`, `val`, `var`, `if`, `else`, `while`, `for`, `try`, `catch`, `finally`, `throw`, `return`, `yield...

    Scala详细总结(精辟版++)

    #### 类(class)和对象(object) Scala中的类可以定义属性和行为。对象是类的实例,Scala还支持单例对象(`object`),类似于Java中的静态成员,但功能更加强大。 #### 抽象类和抽象成员 Scala支持抽象类和抽象成员,...

    Scala和设计模式.pdf

    ### Scala与设计模式 #### 一、概述 随着软件工程的发展,设计模式逐渐成为软件开发中的重要组成部分。《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software...

    Scala编程完整版

    `class MyClass` 和 `object MyObject` 是常见声明。 6. **特质(Trait)**:Scala的特质类似于Java的接口,但可以包含实现。这允许多重继承,避免了传统多继承的困境。 7. **集合库**:Scala的集合库强大且高效,...

Global site tag (gtag.js) - Google Analytics