java 里面的class和Object跟Scala中的class和Object有很大的差别,
首先,java里的class可以指一个编译后的.class文件,也是一个定义类的关键字,scala中的有两种class,一种是一般的class,如果在class前面加上case,那他就是一个final的javabean。
java里面的Object是所有类的父类,而且java里面class实例化后也可以称为一个Object,scala中Object是一个关键字,被Object关键字标注的都是一个单利对象,他是一个final的class,构造器是私有的。
scala中有一个半生类、半生对象的概念,具体对比看代码:
java中的一般类
public class JavaClass { public static void test1() { System.out.println("invoke static method test1"); } public void test2() { System.out.println("invoke method test2"); } } class JavaMainTest { public static void main(String args[]) { JavaClass.test1(); JavaClass javaClass = new JavaClass(); javaClass.test2(); JavaSingletonClass.getInstance().countAdd(1); JavaSingletonClass.getInstance().countAdd(2); JavaSingletonClass.getInstance().countAdd(3); JavaSingletonClass.getInstance().countAdd(4); } }
java中的单利
public class JavaSingletonClass { private static JavaSingletonClass ourInstance = new JavaSingletonClass(); public static JavaSingletonClass getInstance() { return ourInstance; } private int count = 0; private JavaSingletonClass() { } public void countAdd(int num) { count = count + num; System.out.println("Current count:" + count); } }
scala中的object
object ScalaObject { val parma = "" def oneMethod = println("00000000") }
编译后可以看到生成了两个class文件,ScalaObject和ScalaObject$两个文件,ScalaObject是对外报漏的对象,ScalaObject$是一个虚构对象。
反编译后:
public final class ScalaObject { public static void oneMethod() { ScalaObject..MODULE$.oneMethod(); } public static String parma() { return ScalaObject..MODULE$.parma(); } }
public final class ScalaObject$ { public static final MODULE$; private final String parma; static { new (); } public String parma() { return this.parma; } public void oneMethod() { Predef..MODULE$.println("00000000"); } private ScalaObject$() { MODULE$ = this;this.parma = ""; } }
ScalaObject反编译后是两个静态方法,静态方法通过ScalaObject$中的 MODULE$参数分别调用两个方法,ScalaObject$则是一个单利对象,MODULE$则是当前单例对象的一个引用
由此可见, 这个虚构类ScalaObject$是单例的。 一方面, 这个类是编译器默认生成的,在Scala代码中无法访问到。 另一方面, ScalaObject$构造器私有了, 只在内部创建了一个对象赋给了静态引用MODULE$ 。
所以, 在Scala里面称用object关键字修饰的对象是单例对象, 在实现的角度上看, 并不是十分确切。 虽然称之为对象, 但是编译器确实为他生成了一个类, 如上面例子中的object ScalaObject , 编译器确实生成了类ScalaObject。 但是这个类中只有静态方法, 即使是一个Scala中的字段, 也对应一个静态方法, 如上例中的字段a 。 这个类中的静态方法会访问虚构类ScalaObject $中的静态成员ScalaObject $ MODULE$ ,使用这个对象可以调用ScalaObject$中的其他成员方法,Test$中的成员和源码中的成员相对应, 只是会为源码中的字段添加同名方法。 主要的处理逻辑实际上是在虚构类Test$中完成的, ScalaObject类只是作为一个入口。
相关推荐
本示例着重讲解如何在Java和Scala之间进行互调用,这是基于Maven构建系统的。Maven是Apache开发的项目管理工具,它可以帮助开发者管理项目的构建、依赖关系以及文档的生成。在Java和Scala的混合开发环境中,Maven...
在Scala编程语言中,`Class`和`Object`扮演着重要的角色,它们是构建程序的基础。Scala的面向对象特性使得这两个概念与Java等其他语言有所不同。这篇文章将深入探讨`Class`、`Object`以及`Apply()`方法在Scala中的...
### Scala语言入门知识点详解 ...通过这些示例,我们可以看到Scala与Java之间的无缝集成,以及Scala的强大特性和简洁性。无论是作为初学者还是有经验的开发者,Scala都能提供一种高效且灵活的方式来编写代码。
这将生成一个名为`HelloWorld.class`的字节码文件,可以由Scala解释器`scala`或Java虚拟机JVM运行。 2.3 运行Scala程序 运行编译后的Scala程序,可以直接通过`scala`命令,如下: ```bash scala HelloWorld ``` ...
3. **object 和 class 的区别**: - `object` 单例对象,每个类只能有一个实例,常用于全局变量和静态方法。 - `class` 用于创建对象,可以实例化多个。 4. **case class 和 class 类的区别**: - `case class` ...
3. **类和对象**:Scala的类使用`class`关键字定义,而单例对象(Singleton Object)使用`object`关键字,可以看作是静态类的替代品。 例如,以下是一个简单的Scala类和对象示例: ```scala class Person { val ...
1. **Java与Scala的互操作性**:Scala代码可以直接调用Java库,并且Scala和Java代码可以在同一个项目中混合编写。 2. **类型推断**:Scala允许程序员省略变量或方法的显式类型声明,编译器能够自动推断出正确的类型...
Scala是一种多范式的编程语言,设计目标是融合面向对象编程和函数式编程的特性,它在Java虚拟机(JVM)上运行,因此可以无缝地与Java代码交互。本篇文章主要面向有一定Java开发经验的程序员,旨在帮助他们入门Scala。 ...
在右键“src”选项中,选择“New”->“scala class”,并将 kind 选项选择为“object”。然后,输入代码,点击三角符号运行即可。 后续学习 Scala 是一个强大且灵活的编程语言,它提供了广泛的应用领域。本教程...
#### 类(class)和对象(object) Scala中的类可以定义属性和行为。对象是类的实例,Scala还支持单例对象(`object`),类似于Java中的静态成员,但功能更加强大。 #### 抽象类和抽象成员 Scala支持抽象类和抽象成员,...
scala和Java一样,使用extends关键字来实现继承 可以在子类中定义父类中没有的字段和方法,或者重写父类的方法 类和单例对象都可以从某个父类继承 语法 class/object 子类 extends 父类 { .. } 示例 | 类继承 定义...
例如,`Any`, `AnyVal`, `AnyRef` 是Scala的基础类型,它们与Java的`Object`有类似但更精细的划分。源码中可以查看这些类型的实现,理解它们如何在运行时进行类型检查和转换。 2. **类和对象**:Scala的类和对象...
单例对象是Scala的一个特色,它可以通过`object`关键字创建,作为全局的、静态的访问点。 3. **函数**:Scala中的函数是一等公民,可以作为变量赋值、作为参数传递和作为返回值。函数使用`def`关键字定义,支持高阶...
在Scala中,工厂模式可以通过伴生对象(companion object)和应用方法(apply method)来实现: ```scala object Car { def apply(carType: String): Car = carType match { case "Race" => RaceCar() case ...
Scala是一门现代的多范式编程语言,主要设计目的是为了结合面向对象编程(OO)和函数式编程(FP)的各种特性,同时通过静态类型系统以及与Java平台的互操作性,实现可伸缩的语言设计。Scala基于JVM运行,这意味着它...
- **Class**: 类的定义与Java类似,用于封装数据和行为。 ```scala class MyClass { def helloWorld = println("Hello, Scala!") } ``` - **Object**: 用于定义单例对象,相当于Java中的静态方法。 ```scala ...
通过伴生对象(companion object)和伴生类(companion class),Scala实现了单例模式。 **3. 函数式编程** Scala深受函数式编程语言的影响,支持高阶函数、闭包、柯里化(currying)、函数组合以及不可变数据结构...