首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在Java实例化过程中将类命名两次?

为什么在Java实例化过程中将类命名两次?
EN

Stack Overflow用户
提问于 2009-12-24 03:59:25
回答 11查看 2.8K关注 0票数 14

当您实例化一个对象时,为什么要两次指定这个类?

代码语言:javascript
复制
OddEven number = new OddEven();

你为什么不直接说number = new OddEven();呢?当我声明一个字符串时,我只说一次String

代码语言:javascript
复制
String str = "abc";

实际上,我的问题不是“你为什么要这样做”--很明显,你这么做是因为你必须这样做--而是为什么创建者选择让Java语法像这样工作?

我的想法是:

  1. Java在低级别运行的方式有一些基本的东西,需要输入两次名称,或者
  2. 创建者可以自由地选择这样做,以保持语法的某些方面的一致性--首先声明类型?还是说它更像它的前身?
EN

回答 11

Stack Overflow用户

发布于 2009-12-24 04:07:16

出现看似多余的类型名称的原因是,您正在执行两个单独的操作,每个操作都需要指定一个类型。

在左侧,您将声明一个具有特定类型的变量(存储位置)。在右侧,您正在创建一个具有特定类型的新对象。中间的'=‘导致对您创建的新对象的引用被放置在您创建的存储位置中。

两边的类型不必相同。例如,这就是法律法规:

代码语言:javascript
复制
Object number = new OddEven();

关键字字符串在第二个示例中只显示一次的原因是,类型字符串隐含在右侧,因为"xxx“是字符串常量。它只是以下几个词的简称:

代码语言:javascript
复制
String string = new String("xxx");
票数 5
EN

Stack Overflow用户

发布于 2009-12-24 08:24:32

当你写:

代码语言:javascript
复制
OddEven number = new OddEven();

您实际上做了两件事: 1)声明一个变量number类型为OddEven 2)为类OddEven的一个新实例分配一个引用。但是,由于变量可以容纳任何类型的子类型,编写number = new OddEven();不足以让编译器知道number变量的真实类型。所以,你也得声明一下。Java是一种强类型语言,这意味着每个变量和每个表达式都有一个在编译时已知的类型。您可能希望阅读的整个第4章.类型、值和变量来了解更多这方面的内容。

现在,当你写:

代码语言:javascript
复制
String str = "abc";

情况有点不同。括在双引号( "abc" )中的字符称为字符串文本,它已经是对String实例的引用,并且总是引用类String的同一个实例。引用JLS的3.10.5字符串文字节:

每个字符串文本都是对类(第4.3节) (第4.3.3节)的实例(第4.3.1节§12.5)的引用。String对象具有一个常量值。字符串文字--或者更普遍地说,字符串是常量表达式(第15.28节)-are "interned“的值,以便使用String.intern方法共享唯一的实例。

因此,String str = "abc";当然不会转换为String str = new String("abc");,这与我在一些评论和回答中看到的完全不同。运行以下类:

代码语言:javascript
复制
public class Test {
    public static void main(String[] args) {
        String one = "abc";
        String two = "abc";
        String abc = new String("abc");

        System.out.println(one == two);
        System.out.println(one == abc);
    }
}

产生以下输出:

代码语言:javascript
复制
true
false

并演示了onetwo是对同一个实例的引用,但是abc是对的引用,另一个实例(即创建了额外的不必要的对象)。

实际上,使用new String(String)是构造新字符串的一种效率低下的方法,应该只用于强制子字符串复制到新的底层字符数组,如

代码语言:javascript
复制
String tiny = new String(monster.substring(10,20))
票数 3
EN

Stack Overflow用户

发布于 2009-12-24 05:47:44

把'OddEven数字‘看作是定义对象,将’新OddEven();‘看作是填充对象。

我不打算详细讨论超类和子类,因为其他人已经解释过了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1956591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档