【问题标题】:Java constructor keywordS meaning [closed]Java构造函数关键字的含义[关闭]
【发布时间】:2020-06-04 14:32:39
【问题描述】:

我是一名 IT 专业的学生,​​从那时起我就一直在尝试编程......尽管这么长时间以来我仍然无法理解 许多 东西和概念。 最基本的一种是 Java(因为我应该主要研究它)构造函数。

好吧,我知道一个类是一个蓝图,我们使用构造函数来创建一个对象并将值分配给类变量,但它到底是如何工作的呢?

ExampleClass exampleClassObject = new ExampleClass()

好吧,当然,我已经尝试过为此寻找答案,但我想这太愚蠢了,甚至无法解释它......

有4个关键字,对吧?

ExampleClass - 是我们要为其创建对象的类

exampleClassObject - 是对象名称

= new - 实际上我并不知道它到底是做什么的

ExampleClass() - 这个。这该死的东西..它有什么作用?他的目的是什么?我们不是已经告诉 Java 用 first 关键字创建一个 ExampleClass 的对象了吗?

我认为它是我们 exampleClassObject 的类型,但是...为什么需要指定它?如果您可以更改对象的类型(正如我在其他代码中看到的那样),那有什么意义呢? 制作一个 ClassX 的对象,但属于 ClassY 类型......我真的不明白,抱歉,这只是冰山一角:')

感谢您的帮助。

编辑 1 感谢您的即时回复!但是..

@迈克尔

List<String> list = new ArrayList<>(); list = new LinkedList<>();

这有什么意义.. 为什么不立即制作 LinkedList?为什么要从已经存在的对象中创建一个新对象?

我感觉就像“1kg 钢对 1kg 羽毛”中的那个家伙……我不明白,非常感谢你的努力,哈哈

编辑 2 对于那些投反对票的人来说,并不是我在网上或文档上看的不够多,而是我不理解它:) StackOverflow 是我的最后一个资源,否则我不会问...

再次感谢您的帮助。

【问题讨论】:

  • new ExampleClass() 实际上这是一回事。它正在调用ExampleClass 类的构造函数。您可以在那里调用一些其他方法,或者只是将另一个对象分配给该变量,这就是 ExampleClass 重复的原因。
  • 一个关键字:new。您是否考虑过查阅文档?
  • 这个 ArrayList/LinkedList 只是一个例子,在实际代码中没有任何期望。它表明变量的类型不一定是创建对象的类型 - 它可能是超类型(通常是这样)。

标签: java object types constructor


【解决方案1】:

有4个关键字,对吧?

这不准确。关键字是a specific thing。在您的情况下,只有 new 是关键字。

你的意思是有 4 个令牌; 4 个不同的项目供解析器解释。

ExampleClass() - 这个。这该死的东西..它有什么作用?什么是 他的目的?我们不是已经告诉 Java 创建一个对象了吗? ExampleClass 与第一个关键字?

在某种程度上,你是对的。在这种特殊情况下,存在一种声明冗余。这就是人们有时说 Java 冗长的原因之一。

在 C++ 中你可以做这样的事情,其中​​包含更少的重复

ExampleClass exampleClassObject;
ExampleClass exampleClassObject(12);

在 Java 中相当于

ExampleClass exampleClassObject = new ExampleClass();
ExampleClass exampleClassObject = new ExampleClass(12);

这在 Java 中不是完全冗余的原因是因为您将变量的类型与变量最初保存的实例的类型分开指定。

例如

List<String> list = new ArrayList<>();
list.addAll(getSomeItems());
// some operations for a which an array-based list is most efficient
// ...

list = new LinkedList<>();
list.addAll(getSomeDifferentItems());
// some operations for a which a linked list is most efficient
// ...

在这种情况下,变量的类型比它最初持有的实例的类型更宽松。这使我们能够更多地依赖抽象而不是一个特定的实现,并可能在以后重新分配不同的实现。

more recent versions of Java 中,我们可以使用var(保留类型名称)来减少重复。在这种情况下,变量的类型是从它初始化的类型推断出来的,所以我们不必写两次。

var myclass = new ExampleClass();

【讨论】:

  • @Rannel 对不起,我不认为你会从字面上理解这个例子。当然,在声明后立即发生重新分配的示例中,您是对的,您也可能刚刚使用链表进行了初始化。我已将示例更改为更“现实”(它仍然很做作,但仍然)
  • 感谢最后一个关于隐式类型的例子。似乎很多较新的语言都采用推断 lhs 类型的方式,而不是 rhs。但事实上,Java 在某种程度上兼具了这两者,并为泛型类型添加了菱形运算符。
  • @kutschkem 自 Java 诞生以来,几乎所有的语言决策都受到保持向后兼容性的强烈影响。 var 能够以这样一种方式引入,它只会破坏那些已经定义了自己的名为 var 的类的人的代码——首先,不是 PascalCase。其次,完全无法描述。如果你这样做了,你应该得到发生在你身上的坏事。他们在(主要)保留 BC 的同时能够完成的工作令人印象深刻,但毫无疑问,如果没有这种限制,他们不能/不做与新语言相同的事情
  • @Michael 我认为这是错误的方式。我的意思是说其他语言也一样,比如最新的 Java 版本(或者我应该反过来说)做类似 var 关键字的事情并推断 lhs 类型。
  • 你显然不是这里的问题,迈克尔,别担心 :') 我想现在更清楚了.. 再次感谢。所以通过existingObject = new DifferentClass() 我们只是将对象从一个类转换到另一个类?那么我们可以使用不同的方法来管理该对象内部的数据吗?
猜你喜欢
  • 2018-05-06
  • 2020-11-16
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 2014-11-20
  • 1970-01-01
相关资源
最近更新 更多