首页 > Java > java教程 > 为什么创建`CaseInsensitiveString`对象时需要使用`new`而不是`String`对象?

为什么创建`CaseInsensitiveString`对象时需要使用`new`而不是`String`对象?

Mary-Kate Olsen
发布: 2024-11-13 08:23:02
原创
819 人浏览过

Why is it necessary to use `new` when creating a `CaseInsensitiveString` object but not a `String` object?

在 Java 中创建字符串:“String s = new String("silly")”的情况

在 Java 中创建字符串时,了解 String 类的行为至关重要。与 Java 中的许多其他类不同,字符串文字会自动创建 String 对象,而不需要 new 关键字。但是,明确不鼓励使用 new 运算符创建新的 String 对象,因为它可能会导致不必要的内存消耗。

为了说明这一点,请考虑以下代码:

String s = "No longer silly";
登录后复制

在此在这种情况下,文字“不再愚蠢”被直接分配给 s 变量,从而创建单个 String 对象。但是,以下代码片段:

String s = new String("silly");
登录后复制

创建了一个不必要的附加 String 对象。为了避免这种情况,建议尽可能使用文字赋值,如第一个示例所示。

但是,在某些情况下可能需要动态创建 String 对象。例如,考虑以下类:

public final class CaseInsensitiveString {
    private String s;
    
    public CaseInsensitiveString(String s) {
        if (s == null) {
            throw new NullPointerException();
        }
        this.s = s;
    }
}
登录后复制

在这种情况下:

  1. 为什么第一条语句可以?不是应该是 CaseInsensitiveString cis = "Polish"; 吗?
    第一个语句 CaseInsensitiveString cis = new CaseInsensitiveString("Polish"); 是正确的。虽然通常建议对 String 对象使用文字赋值,但此规则不适用于其他类的对象,例如 CaseInsensitiveString。在这种情况下,必须使用 new 关键字来创建 CaseInsensitiveString 类的新实例。
  2. 如何使 CaseInsensitiveString 表现得像 String,以便上述语句可以(无论是否扩展 String)? String 有何特点使得可以向其传递这样的文字?据我了解,Java 中没有“复制构造函数”概念?
    Java 中的 String 类与其他类相比具有独特的行为。具体来说,文字会隐式转换为 String 对象,从而无需显式构造。这允许像 String s = "Polish"; 这样的语句不调用 new 运算符。 Java 中没有等效的“复制构造函数”概念。相反,String 类提供了不变性和一个预定义的构造函数,该构造函数接受字符序列(例如文字字符串)来创建新的 String 对象。

以上是为什么创建`CaseInsensitiveString`对象时需要使用`new`而不是`String`对象?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板