当您实例化一个对象时,为什么要两次指定这个类?
OddEven number = new OddEven();你为什么不直接说number = new OddEven();呢?当我声明一个字符串时,我只说一次String:
String str = "abc";实际上,我的问题不是“你为什么要这样做”--很明显,你这么做是因为你必须这样做--而是为什么创建者选择让Java语法像这样工作?
我的想法是:
发布于 2009-12-24 04:07:16
出现看似多余的类型名称的原因是,您正在执行两个单独的操作,每个操作都需要指定一个类型。
在左侧,您将声明一个具有特定类型的变量(存储位置)。在右侧,您正在创建一个具有特定类型的新对象。中间的'=‘导致对您创建的新对象的引用被放置在您创建的存储位置中。
两边的类型不必相同。例如,这就是法律法规:
Object number = new OddEven();关键字字符串在第二个示例中只显示一次的原因是,类型字符串隐含在右侧,因为"xxx“是字符串常量。它只是以下几个词的简称:
String string = new String("xxx");发布于 2009-12-24 08:24:32
当你写:
OddEven number = new OddEven();您实际上做了两件事: 1)声明一个变量number类型为OddEven 和 2)为类OddEven的一个新实例分配一个引用。但是,由于变量可以容纳任何类型的子类型,编写number = new OddEven();不足以让编译器知道number变量的真实类型。所以,你也得声明一下。Java是一种强类型语言,这意味着每个变量和每个表达式都有一个在编译时已知的类型。您可能希望阅读的整个第4章.类型、值和变量来了解更多这方面的内容。
现在,当你写:
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");,这与我在一些评论和回答中看到的完全不同。运行以下类:
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);
}
}产生以下输出:
true
false并演示了one和two是对同一个实例的引用,但是abc是对的引用,另一个实例(即创建了额外的不必要的对象)。
实际上,使用new String(String)是构造新字符串的一种效率低下的方法,应该只用于强制子字符串复制到新的底层字符数组,如
String tiny = new String(monster.substring(10,20))发布于 2009-12-24 05:47:44
把'OddEven数字‘看作是定义对象,将’新OddEven();‘看作是填充对象。
我不打算详细讨论超类和子类,因为其他人已经解释过了。
https://stackoverflow.com/questions/1956591
复制相似问题