scala和java对象的对比,Scala中对象和类之间的区别

我刚刚浏览了Internet上的一些Scala教程,并注意到在某些示例中,在示例开始时声明了一个对象。

Scala中的class和object什么区别?

#1楼

一个对象只有一个实例(您不能调用new MyObject )。 您可以有一个类的多个实例。

对象具有与 Java中的静态方法和字段相同 (和一些其他) 目的 。

#2楼

tl; dr

class C定义一个类,就像在Java或C ++中一样。

object O创建一个单例对象O作为某个匿名类的实例; 它可用于保存与某些类的实例不相关的静态成员。

object O extends T使对象O成为trait T的实例; 然后,您可以将O传递到任何一个预期为T位置。

如果有class C ,那么object C是类C的伴随对象 ; 请注意,伴随对象不是 C的实例。

另请参阅Scala文档以获取对象和类 。

用作静态成员的主机

通常,您需要一个object来保存无需首先实例化某个类的实例即可使用的方法和值/变量。 此用法与Java中的static成员密切相关。

object A {

def twice(i: Int): Int = 2*i

}

然后,您可以使用A.twice(2)调用上述方法。

如果twice是某个类A的成员,那么您需要首先创建一个实例:

class A() {

def twice(i: Int): Int = 2 * i

}

val a = new A()

a.twice(2)

您可以看到这是多么冗余,因为twice不需要任何特定于实例的数据。

用作特殊的命名实例

您也可以将object本身用作类或特征的某些特殊实例。 当您执行此操作时,您的对象需要扩展某些trait以使其成为其子类的实例。

考虑以下代码:

object A extends B with C {

...

}

该声明首先声明一个扩展B和C的匿名(不可访问)类,并实例化名为A的此类的单个实例。

这意味着A可以传递给期望对象类型为B或C或B with C 。

object附加功能

Scala中还存在一些对象的特殊功能。 我建议阅读官方文档 。

def apply(...)启用A(...)的常规方法无名称语法

def unapply(...)允许创建自定义模式匹配提取器

如果附带同名的类,则对象在解析隐式参数时将扮演特殊角色

#3楼

class是定义,描述。 它根据方法和其他类型的组成来定义类型。

object是单例-保证类的实例是唯一的。 对于代码中的每个object ,都会创建一个匿名类,该匿名类继承自您声明要实现的object任何类。 从Scala源代码中看不到此类,尽管您可以通过反射来了解。

object和class之间有关系。 如果对象共享相同的名称,则称它们为类的伴侣对象。 发生这种情况时,每个人都可以访问另一个人的private可见性方法。 但是,这些方法不会自动导入。 您要么必须显式导入它们,要么用类/对象名作为前缀。

例如:

class X {

// class X can see private members of object X

// Prefix to call

def m(x: Int) = X.f(x)

// Import and use

import X._

def n(x: Int) = f(x)

private def o = 2

}

object X {

private def f(x: Int) = x * x

// object X can see private members of class X

def g(x: X) = {

import x._

x.o * o // fully specified and imported

}

}

#4楼

在Scala中定义对象就像在Java中定义仅具有静态方法的类。 但是,在Scala中,对象可以扩展另一个超类,实现接口,并且可以像类的实例一样被传递。 (所以就像类上的静态方法一样,但效果更好)。

#5楼

类和对象:类是一个定义,它描述实体或对象的所有属性。 对象是类的实例。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值