为啥JAVA中的lang包要叫"lang"包?啥意思?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥JAVA中的lang包要叫"lang"包?啥意思?相关的知识,希望对你有一定的参考价值。

是什么的缩写?

language
java.lang包是Java语言的核心类库,包括了运行Java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等。每个Java程序运行时,系统都会自动地引入java.lang包,所以这个包的加载是缺省的。
参考技术A language,语言包,Java语言的基本功能都在里面。
在news新闻组中语言相关都叫lang,XML和html中语言属性也都叫lang本回答被提问者采纳
参考技术B 想一想,大概是language的前4个字母吧.
这也暗示了这个包里的类都是JAVA的基础类.用户不用导入就可以直接使用的.
参考技术C 这是java的标准的包,系统当前类默认引用这个包。一般带用的System.*的类和方法都在这里。 具体是什么的缩写我也不知道,我个人认为这个不是什么的缩写。

为啥 java.lang.Cloneable 不覆盖 java.lang.Object 中的 clone() 方法?

【中文标题】为啥 java.lang.Cloneable 不覆盖 java.lang.Object 中的 clone() 方法?【英文标题】:Why does java.lang.Cloneable not override the clone() method in java.lang.Object?为什么 java.lang.Cloneable 不覆盖 java.lang.Object 中的 clone() 方法? 【发布时间】:2012-04-16 10:19:27 【问题描述】:

java.lang.Cloneable 接口的 Java 规范将其自身定义为表示扩展它的任何对象也实现了 clone() 方法,该方法在 java.lang.Object 中处于休眠状态。具体来说,它说:

一个类实现了Cloneable 接口,以向java.lang.Object#clone() 方法指示该方法对该类的实例进行逐个字段的复制是合法的。

对我来说,这意味着应该假设每个扩展 Cloneable 的类因此在其中也有一个 public Object clone() 方法。这使得很容易假设以下方法是有效的:

public static makeACloneFrom(Cloneable c)

  return c.clone();

然而,情况并非如此,因为整个 Cloneable 源代码(无 javadoc)只是

package java.lang;

public interface Cloneable 

这意味着Cloneable#clone() 不存在(并且尝试编译上面的示例方法会引发编译时错误,例如“cannot find symbol: method clone()”)。 Cloneable的源代码不应该包含public Cloneable clone();的效果吗?

为什么我们不允许假设实现 Cloneable 的类具有 public Cloneable clone() 方法?

【问题讨论】:

Java: Rationale of the Cloneable interface 的可能重复项 【参考方案1】:

因为它是一个设计糟糕的界面。

来自Effective Java(抱歉,Google 图书没有第二版的预览):

第 11 项:明智地覆盖 clone

Cloneable 接口旨在作为一个 mixin 接口(项目 18) 让对象宣传它们允许克隆。很遗憾, 它不能达到这个目的。它的主要缺陷是缺乏 clone 方法和Objectclone 方法受到保护。你 不能通过 reflection(第 53 项)调用clone 对象上的方法仅仅是因为它实现了Cloneable。甚至一个 反射调用可能会失败,因为不能保证 对象有一个可访问的clone 方法。

【讨论】:

...所以,差不多,这应该在 Java 1.8 中改变? 它应该在 很久 之前就已更改。然而,我认为它永远不会,因为它会引入向后不兼容。如果在 Java 1.8 中有一个“修复”,我想它会类似于 @Copyable 注释。 @SoboLAN 您希望如何更改?删除它会导致很多兼容性问题而收效甚微。添加到设计不佳且您不应该使用的东西,真的吗? ::sigh:: 尽管我很讨厌 Cloneableclone,但我宁愿看到它们被弃用,也不愿被彻底删除。 尽管如此,Oracle 不能完全重构所有 Java 用户的代码,它的策略是不惜一切代价基本上避免破坏外部代码。【参考方案2】:

呃。 cloneCloneable 已损坏,设计糟糕,不应在新代码中使用。 (请参阅有效的 Java 项目 11。)

造成这种特殊情况的原因是 Cloneable 是一个令人困惑的实现,神奇的接口,因此仅仅实现 Cloneable 的行为就会通过反射改变 Object.clone 的行为。有效的 Java 说:

...如果一个类实现了CloneableObjectclone 方法返回对象的逐字段副本;否则会抛出 CloneNotSupportedException。这是一种非常不典型的接口用法,不是要模拟的……

【讨论】:

我不认为反射与它有任何关系(它早于一件事的反射)。 天哪,这更邪恶。我猜clone的本机实现在内部做了相当于反射的事情? 根据Javadoc,“类Object的方法clone执行特定的克隆操作。首先,如果该对象的类没有实现接口Cloneable,则抛出CloneNotSupportedException。注意所有数组被认为实现了接口 Cloneable 并且数组类型 T[] 的克隆方法的返回类型是 T[] 其中 T 是任何引用或原始类型。否则,此方法会创建此类的新实例对象并使用该对象的相应字段的内容来初始化其所有字段,... ... 好像被分配了;字段的内容本身不会被克隆。因此,此方法执行此对象的“浅拷贝”,而不是“深拷贝”操作。” 是的,但它必须这样做 Cloneable 在本机而不是在 Java 中检查。

以上是关于为啥JAVA中的lang包要叫"lang"包?啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 java.lang.Object 中的 finalize() 方法是“受保护的”?

为啥我在代码中的线程“main”java.lang.StringIndexOutOfBoundsException 错误中收到异常?

为啥以及如何修复线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0 错误

为啥 java.lang.Cloneable 不覆盖 java.lang.Object 中的 clone() 方法?

为啥结构化流式处理因“java.lang.IncompatibleClassChangeError:Implementing class”而失败?

为啥我在 JavaFX 上收到 java.lang.IllegalStateException“不在 FX 应用程序线程上”?