String 对象的几种创建方法和它的特殊性

/**
 * Created by Dale on 2017/5/27.
 * 字符串创建的几种方式
 * 1.字面值常量
 * 2.String()    空参构造:创建一个空的字符串对象
 * 3.public String(String original) 使用给定的字符串常量创建一个字符串对象
 * 4.public String(byte[] bytes) 给定一个字节数组,根据字节数组的内容翻译成字符串
 * 5.public String(char[] value) 给定一个字符数组,将数组翻译成字符串
 *
 */
public class Demo {

    public static void main(String[] args){
        //1.
        String s = "abc";
        System.out.println(s);

        //2.
        String s2 = new String();
        System.out.println(s2);

        //3.
        String s3 = new String("123");
        System.out.println(s3);

        //4.
        byte[] bytes = new byte[]{100,99,98,97};
        String s4 = new String(bytes);
        System.out.println(s4);
    }

}



package com.xyf.string;

/**
 * Created by Dale on 2017/5/27.
 * 字符串为常量,字符串值一旦初始化便不可以修改,即字符串对象内容不变,字符串的引用可以指向其他对象
 *
 */
public class Demo2 {
    public  static void main(String args[]){
        String s = "abc";
        s="bcd";
        System.out.println(s);

//        Person p = new Person("嬴渠梁");
//        p.setName("嬴驷");
//        p = new Person("赢荡");
//        System.out.println(p);


        //面试题:问比较的结果是多少
        String str = "abc";
        String str2 = new String("abc");
        String str3  = "abc";
        System.out.println(str==str2);   //false
        System.out.println(str==str3);   //true

        //比较的是字面量
        System.out.println(str.equals(str2));  //true
        System.out.println(str.equals(str3));  //true


    }
}
String string2 = new String("abc");实际上是"abc"本身就是常量池中的一个对象,在运行 new String()时,把常量池中的字符串"abc"复制到堆中,并把这个对象的引用交给string2 。所以创建了两个String对象,一个在常量池中,一个在堆中。


### 创建对象几种方法及其实现方式 在不同的编程语言中,创建对象的具体方式可能有所不同。以下是常见的几种创建对象方法及其实现细节: #### 1. 使用 `new` 关键字 这是最常见的创建对象的方式之一,在许多面向对象的语言(如 Java C++)中都支持这种方式。通过调用类的构造函数并分配内存空间来创建对象。 ```java // Java 示例 Employee emp = new Employee(); ``` 这种方法会显式调用指定的构造函数[^1]。 --- #### 2. 反射机制 反射允许程序动态地加载类、获取类的信息以及创建对象实例。这种技术通常用于框架开发或需要灵活性的应用场景。 ```java // Java 反射示例 Class<?> clazz = Class.forName("com.example.Employee"); Object obj = clazz.getDeclaredConstructor().newInstance(); ``` 此方法不依赖于硬编码的类名,而是通过字符串形式指定类名称[^1]。 --- #### 3. Clone 方法 某些情况下可以通过克隆现有对象的方式来生成新的对象副本。需要注意的是,使用该方法不会触发任何构造函数执行,并且目标类需实现特定接口(例如 Java 的 `Cloneable` 接口)。 ```java // Java 克隆示例 Employee emp4 = (Employee) emp2.clone(); ``` 这里强调一点:如果未正确覆盖父类中的 `clone()` 方法,则可能导致运行时异常;另外,默认浅拷贝行为也可能带来潜在风险[^2]。 --- #### 4. 序列化与反序列化 当一个对象被写入到某种持久存储介质后再读取回来时即完成了重新构建过程——这就是所谓的“反序列化”。它适用于保存状态后恢复使用的场合。 ```java // Java 序列化/反序列化示例 try { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("file.ser")); oos.writeObject(emp); ObjectInputStream ois = new ObjectInputStream(new FileInputStream("file.ser")); Employee loadedEmp = (Employee) ois.readObject(); } catch(Exception e){ System.out.println(e.getMessage()); } ``` 值得注意的是只有实现了 Serializable 接口的对象才能参与这一流程[^1]。 --- #### 5. 工厂模式或其他设计模式辅助创建 工厂模式属于结构型设计模式的一种,旨在封装对象创建逻辑从而简化客户端代码复杂度。除此之外还有单例模式等多种涉及对象生产的概念可供选用。 ```csharp public class FactoryExample{ public static IProduct CreateProduct(string type){ switch(type.ToLower()){ case "a": return new ProductA(); break; case "b": return new ProductB(); break; default : throw new ArgumentException("Invalid product type."); } } } IProduct prodInstance = FactoryExample.CreateProduct("A"); ``` 虽然严格意义上讲这并不算一种独立的基础操作手段,但从应用层面看确实提供了额外便利途径。 --- #### 6. 拷贝构造函数(仅限 C++) 对于 C++ 而言还存在另一种特殊情形下的初始化形式叫做 **copy constructor** ,每当基于已有实体建立另一个同类型的新变量时候便会自动调用之。 ```cpp class MyClass { private: int value; public: // 默认构造函数 MyClass(int v):value(v){ } // 拷贝构造函数 MyClass(const MyClass& other):value(other.value){} }; MyClass original(10), copy(original); ``` 上述例子展示了如何定义自己的版本以便控制复制过程中发生的事情[^3]。 --- ### 总结 综上所述,至少可以列举出五种主要用来制造实例的技术方案,它们分别是借助关键字指令(`new`)、运用反射特性、实施深浅不同程度上的仿制动作(clone),经历数据流转换环节完成重建工作(serialize/deserialize),最后再加上遵循一定规则体系指导下的间接生产策略(factory pattern etc.) 。每种都有各自适用范围优缺点考量因素。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值