原博客: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`扮演着重要的角色,它们是构建程序的基础。Scala的面向对象特性使得这两个概念与Java等其他语言有所不同。这篇文章将深入探讨`Class`、`Object`以及`Apply()`方法在Scala中的...
3. **object 和 class 的区别**: - `object` 单例对象,每个类只能有一个实例,常用于全局变量和静态方法。 - `class` 用于创建对象,可以实例化多个。 4. **case class 和 class 类的区别**: - `case class` ...
Scala是一门现代的多范式编程语言,主要设计目的是为了结合面向对象编程(OO)和函数式编程(FP)的各种特性,同时通过静态类型系统以及与Java平台的互操作性,实现可伸缩的语言设计。Scala基于JVM运行,这意味着它...
`object`和`class`可以形成伴生关系,当一个`class`有一个与它同名的`object`时,我们称`object`是`class`的伴生对象,反之亦然。伴生对的特性使得它们可以互相访问对方的`private`成员,增强了封装性。如下所示: ...
在右键“src”选项中,选择“New”->“scala class”,并将 kind 选项选择为“object”。然后,输入代码,点击三角符号运行即可。 后续学习 Scala 是一个强大且灵活的编程语言,它提供了广泛的应用领域。本教程...
### Scala样例类详解与实践 #### 一、样例类基本概念 在Scala中,样例类(Case Class)是一种特殊类型的类,主要用于模式匹配和不可变数据结构的构建。它们提供了许多便利的功能,如自动实现`equals`、`hashCode`、...
这将在当前目录下生成`.class`文件,可以使用`scala`命令执行它们。 ### 2.2 运行Scala程序 编译完成后,可以使用`scala`命令运行程序: ```bash scala -classpath . HelloWorld ``` 程序将输出"Hello, world!...
- **`object`关键字**:在Scala中,`object`关键字用于定义单例对象。单例对象在整个程序中只有一个实例,通常用于替代Java中的静态方法和静态变量。在这个例子中,`HelloWorld`是一个单例对象。 - **`def`关键字**...
3. **类和对象**:Scala的类使用`class`关键字定义,而单例对象(Singleton Object)使用`object`关键字,可以看作是静态类的替代品。 例如,以下是一个简单的Scala类和对象示例: ```scala class Person { val ...
在IntelliJ IDEA中配置Scala插件后,你可以创建Scala项目,并通过IDE中的"New -> Scala Object"或"New -> Scala Class"来创建新的类或对象。插件还会帮助你进行Spark项目的配置,例如添加Spark库依赖,设置运行/调试...
#### 一、Scala简介与特点 **Scala**是一种融合了面向对象编程和函数式编程特性的现代编程语言。它被设计成一种可扩展的语言,旨在克服传统编程语言的一些限制,同时保持代码的简洁性和可读性。 - **语言特点**: ...
1. **Java与Scala的互操作性**:Scala代码可以直接调用Java库,并且Scala和Java代码可以在同一个项目中混合编写。 2. **类型推断**:Scala允许程序员省略变量或方法的显式类型声明,编译器能够自动推断出正确的类型...
单例对象是Scala的一个特色,它可以通过`object`关键字创建,作为全局的、静态的访问点。 3. **函数**:Scala中的函数是一等公民,可以作为变量赋值、作为参数传递和作为返回值。函数使用`def`关键字定义,支持高阶...
标题"基于maven的scala与java相互调用的简单实例"揭示了这个示例的核心:在Maven项目中,使用Scala和Java代码互相调用。Scala是一种强大的静态类型编程语言,它在语法上兼容Java,并且提供了函数式编程和面向对象...
尽管没有列出具体的关键字列表,但通常包括`class`, `def`, `object`, `import`, `package`, `trait`, `type`, `val`, `var`, `if`, `else`, `while`, `for`, `try`, `catch`, `finally`, `throw`, `return`, `yield...
#### 类(class)和对象(object) Scala中的类可以定义属性和行为。对象是类的实例,Scala还支持单例对象(`object`),类似于Java中的静态成员,但功能更加强大。 #### 抽象类和抽象成员 Scala支持抽象类和抽象成员,...
### Scala与设计模式 #### 一、概述 随着软件工程的发展,设计模式逐渐成为软件开发中的重要组成部分。《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software...
`class MyClass` 和 `object MyObject` 是常见声明。 6. **特质(Trait)**:Scala的特质类似于Java的接口,但可以包含实现。这允许多重继承,避免了传统多继承的困境。 7. **集合库**:Scala的集合库强大且高效,...