我正在学习 Scala,我在Odersky的Programming Scala第二版中遇到了这个声明:

one way in which Scala is more object-orientated than Java is that classes in Scala cannot have static members.

我对Java或Scala没有足够的经验来理解这种比较.为什么静态成员使语言少于OO?

解决方法

奥德斯基的陈述是有效和重要的,但有些人不明白他的意思.

让我们说在Java中你有一个方法f的类Foo:

class Foo {
  int f() { /* does something great */ }
}

你可以编写一个接受Foo并在其上调用f的方法:

void g(Foo foo) { foo.f(); }

也许有一个类SubFoo扩展了Foo; g也适用于此.可以有一整套类,通过继承或接口相关,它们共享它们可以与g一起使用的事实.

现在让我们将f方法设为静态:

class Foo {
  static int f() { /* does something great */ }
}

我们可以使用这个新的Foo和g,也许是这样吗?

g(Foo);  // No,this is nonsense.

该死.好的,让我们改变g的签名,以便我们可以将Foo传递给它并让它调用f.

哎呀 – 我们做不到.我们无法传递对Foo的引用,因为Foo不是某个类的实例.这里评论的一些人对于Foo对应的Class对象这一事实感到困惑,但正如Sotirios试图解释的那样,Class对象没有f方法,而Foo不是该类的实例. Foo不是任何事物的例子;它根本不是一个对象. Foo的Class对象是类Class的一个实例,它包含有关Foo的信息(将其视为Foo的内部Wikipedia页面),并且与讨论完全无关. “老虎”的维基百科页面不是老虎.

在Java中,像“3”和“x”这样的“基元”不是对象.它们是Scala中的对象.为了提高性能,程序将在执行期间尽可能使用3和’x’的JVM原语,但在您编写的级别它们实际上是对象.事实上,它们不是Java中的对象,对于任何试图编写处理所有数据类型的代码的人来说都会产生相当不幸的后果 – 你必须有特殊的逻辑和其他方法来覆盖原语.如果您曾经见过或编写过这种代码,那么您就知道这很糟糕.奥德斯基的声明不是“纯粹主义”;离得很远.

在Scala中,没有任何运行时数据不是对象,并且没有东西可以调用不是对象的方法.在Java中,这些陈述都不是真的; Java是一种部分面向对象的语言.在Java中,存在不是对象的东西,并且存在不在对象上的方法.

Scala的新手经常认为对象Foo是Java静态的一些奇怪的替代品,但这是你需要快速通过的东西.相反,将Java的静态方法视为非OO wart,将Scala的对象Foo {…}视为以下内容:

class SomeHiddenClass { ... }
val Foo = new SomeHiddenClass  // the only instance of it

这里Foo是一个值,而不是一个类型,它确实是一个对象.它可以传递给一个方法.它可以扩展其他一些类.例如:

abstract class AbFoo { def f:Int }
object Foo extends AbFoo { def f = 2 }

现在,最后,你可以说

g(Foo)

确实,类的“伴随对象”是为类放置非实例方法和数据的好地方.但是该伴随对象是一个对象,因此通常的规则和功能适用.

事实上,在Java中,您将这些方法放在非对象上 – 限制它们的使用方式 – 是一种责任,而不是一种功能.当然不是OO.

java – 为什么静态成员使语言不像面向对象?的更多相关文章

  1. Swift 学习一

    国外开发者最近发现,WWDC2014上苹果发布的新语言Swift,和古老的Scala语言在语法上存在众多的相似之处。Swift语言从语法上来看,几乎是Scala的一个分支,在以下功能上几乎是等同的:类型继承、闭包、元组、协议、扩展、泛型等。不过Swift的运行环境和Scala的区别还是很大,这个概念才是Swift最重要的。但Swift最终编译到机器代码,使用引用计数机制,与Objective-C无缝整合。所以Swift和Scala在代码表象上的相似,应该并不太影响两种语言本质机理上的重大不一致。

  2. Swift中隐式懒惰的静态成员

    我只是注意到Swift结构的静态成员是隐式的.例如,这只会调用init一次:这背后的理由是什么?如果我想要相反的行为怎么办?

  3. Android上的Scala:java.lang.NoSuchMethodError:java.lang.String.isEmpty

    解决方法使用JRE/JDK1.5,它在String上没有isEmpty方法.这将避免Scala使用1.6的isEmpty而不是自己的情况.如果您也有Java库,请务必选择与1.5兼容的库.

  4. android – 如何管理来自调用Play2!-Scala REST服务的本地移动应用程序发送的用户请求的身份验证/授权

    我一直在挖掘Play2!这在纯粹的Web透视图中是有意义的:请求是从浏览器发送的,服务器可以在客户端上存储cookie.现在,如果我有一个本地的移动应用程序,而且我只是打一个Play2!Scala应用程序支持的REST服务.在这种情况下,我没有使用浏览器,所以服务器不能在客户端应用程序上存储cookie.我还可以使用像t2v’sPlay20-auth这样的模块进行授权/认证吗?处理这种事情的最佳做法是什么?

  5. python Scala函数与访问修辞符实例详解

    这篇文章主要为大家介绍了python Scala函数与访问修辞符实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  6. Springboot如何通过yml配置文件为静态成员变量赋值

    这篇文章主要介绍了Springboot如何通过yml配置文件为静态成员变量赋值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Python Scala中使用def语句定义方法的详细过程

    这篇文章主要介绍了Python Scala中使用def语句定义方法,Scala的方法是类的一部分,而函数是一个对象可以赋值给一个变量,下面来讲解Scala的方法,需要的朋友可以参考下

  8. php静态成员方法和静态的成员属性的使用方法

    这篇文章主要介绍了php静态成员方法和静态的成员属性的使用方法的相关资料,希望通过本文能帮助到大家,让大家使用的时候注意方法,需要的朋友可以参考下

  9. ZIO:ZIO光纤的生命周期和状态

    线程在任何时刻都处于所示状态之一:可运行的此路不通等待Timed等待终止下图表示线程在任何时刻的各种状态。请在此处输入图像描述那么,ZIO光纤的生命周期和状态是什么?它与线相似还是相同?

  10. 如何将连续列(0-1)分组为相等大小?斯卡拉火花

    我有一个数据帧列,希望将其拆分为大小相等的桶。此列中的值在0-1之间浮动。大多数数据是倾斜的,因此大多数值都在0.90和1之间。铲斗10:所有1铲斗2-9:任何值>;0和<;1铲斗1:所有0例子:continous_number_colBucket0.00120.95711001这应该是当我groupBy时的样子。

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部