`
shangboz
  • 浏览: 14177 次
文章分类
社区版块
存档分类
最新评论

Java VS Scala(二)Class和Object

阅读更多

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类只是作为一个入口。

分享到:
评论

相关推荐

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

    本示例着重讲解如何在Java和Scala之间进行互调用,这是基于Maven构建系统的。Maven是Apache开发的项目管理工具,它可以帮助开发者管理项目的构建、依赖关系以及文档的生成。在Java和Scala的混合开发环境中,Maven...

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

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

    Scala语言入门

    ### Scala语言入门知识点详解 ...通过这些示例,我们可以看到Scala与Java之间的无缝集成,以及Scala的强大特性和简洁性。无论是作为初学者还是有经验的开发者,Scala都能提供一种高效且灵活的方式来编写代码。

    面向Java开发者的Scala教程

    这将生成一个名为`HelloWorld.class`的字节码文件,可以由Scala解释器`scala`或Java虚拟机JVM运行。 2.3 运行Scala程序 运行编译后的Scala程序,可以直接通过`scala`命令,如下: ```bash scala HelloWorld ``` ...

    Scala考试题1

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

    Scala-升级版.docx

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

    Scala实操教程及演示

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

    scala入门(仅供参考)

    Scala是一种多范式的编程语言,设计目标是融合面向对象编程和函数式编程的特性,它在Java虚拟机(JVM)上运行,因此可以无缝地与Java代码交互。本篇文章主要面向有一定Java开发经验的程序员,旨在帮助他们入门Scala。 ...

    Scala下载安装教程

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

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

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

    Scala进阶_继承

    scala和Java一样,使用extends关键字来实现继承 可以在子类中定义父类中没有的字段和方法,或者重写父类的方法 类和单例对象都可以从某个父类继承 语法 class/object 子类 extends 父类 { .. } 示例 | 类继承 定义...

    scala-2.11.8源码

    例如,`Any`, `AnyVal`, `AnyRef` 是Scala的基础类型,它们与Java的`Object`有类似但更精细的划分。源码中可以查看这些类型的实现,理解它们如何在运行时进行类型检查和转换。 2. **类和对象**:Scala的类和对象...

    scala编程入门教材

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

    Scala和设计模式.pdf

    在Scala中,工厂模式可以通过伴生对象(companion object)和应用方法(apply method)来实现: ```scala object Car { def apply(carType: String): Car = carType match { case "Race" => RaceCar() case ...

    Scala基础与实践

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

    scala入门--文档版本

    - **Class**: 类的定义与Java类似,用于封装数据和行为。 ```scala class MyClass { def helloWorld = println("Hello, Scala!") } ``` - **Object**: 用于定义单例对象,相当于Java中的静态方法。 ```scala ...

    Scala编程(完整版)

    通过伴生对象(companion object)和伴生类(companion class),Scala实现了单例模式。 **3. 函数式编程** Scala深受函数式编程语言的影响,支持高阶函数、闭包、柯里化(currying)、函数组合以及不可变数据结构...

Global site tag (gtag.js) - Google Analytics