一文总结使用Java创建对象的八种方式

 更新时间:2026年01月06日 08:22:06   作者:程序员大华  
这篇文章主要介绍了8种创建对象的方法,包括new关键字、反射机制、clone()方法、反序列化、静态工厂方法、Builder模式、匿名内部类和方法引用,每种方法都有其适用场景和优缺点,需要的朋友可以参考下

昨晚加班的时候,同事来旁边坐着跟我闲聊,不经意间看到屏幕上的new 对象代码,他说:“每次这样new 一个对象感觉好丑,有没有更好的方式方法!”。

我说:“有啊,不过也得看场景,简单的直接用 new 一把梭哈!复杂的再考虑其它的方式”

那有哪些方式呢?下面来分享一下。

1. new关键字

最直接的创建方式

// 就像我们平时说话:"来一辆新车"
Car car = new Car();

// 或者带参数的:"来一辆红色的宝马"
Car bmw = new Car("宝马", "红色");

使用场景:这是最常用的方式,适合90%的日常开发场景。

优点

  • 简单直观,一眼就能看懂
  • 性能好,直接调用构造方法

缺点

  • 不够灵活,创建逻辑与使用代码耦合

2. 反射机制

有时候我们需要在运行时才知道要创建什么类的对象,这时候反射就派上用场了。

// 传统方式:我知道要创建Car
Car car = new Car();

// 反射方式:运行时才知道要创建什么
try {
    Class carClass = Class.forName("com.example.Car");
    Constructor constructor = carClass.getConstructor();
    Car car = (Car) constructor.newInstance();
} catch (Exception e) {
    e.printStackTrace();
}

案例:Spring框架中,当我们配置了@Component注解的类,Spring就是通过反射来创建这些对象的。

// Spring内部大致是这样做的
Class beanClass = loadClass("com.example.UserService");
Object bean = beanClass.getDeclaredConstructor().newInstance();

3. clone()方法

假设你有一个配置好的对象,现在需要另一个一模一样的,这时候clone就很有用。

class UserSettings implements Cloneable {
    private String theme = "dark";
    private int fontSize = 14;
    
    @Override
    public UserSettings clone() {
        try {
            return (UserSettings) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
}

// 使用clone
UserSettings original = new UserSettings();
UserSettings cloned = original.clone(); // 得到一个完全相同的副本

注意点

  • 需要实现Cloneable接口,否则会抛出异常
  • 默认是浅拷贝,如果需要深拷贝要自己实现

4. 反序列化

当我们把对象保存到文件或通过网络传输后,需要重新把它变回对象。

// 对象需要实现Serializable接口
class GameSave implements Serializable {
    private static final long serialVersionUID = 1L;
    private int level;
    private int score;
}

// 保存对象到文件
try (ObjectOutputStream oos = new ObjectOutputStream(
        new FileOutputStream("save.dat"))) {
    oos.writeObject(gameSave);
}

// 从文件读取对象
try (ObjectInputStream ois = new ObjectInputStream(
        new FileInputStream("save.dat"))) {
    GameSave loadedSave = (GameSave) ois.readObject();
    // loadedSave就是原来那个gameSave的副本
}

5. 静态工厂方法

有时候直接new不够表达我们的意图,这时候工厂方法就很有用。

class Color {
    private int red, green, blue;
    
    private Color(int r, int g, int b) {
        this.red = r;
        this.green = g;
        this.blue = b;
    }
    
    // 静态工厂方法:语义更明确
    public static Color fromRGB(int r, int g, int b) {
        return new Color(r, g, b);
    }
    
    public static Color fromHex(String hex) {
        // 解析十六进制颜色码
        return new Color(/* 解析逻辑 */);
    }
    
    public static Color red() {
        return new Color(255, 0, 0);
    }
}

// 使用:这样读起来更自然
Color red = Color.red();
Color custom = Color.fromRGB(255, 128, 0);

优点

  • 方法名可以表达创建意图
  • 可以缓存对象,避免重复创建
  • 可以返回子类对象,更灵活

6. Builder模式

当对象有很多属性时,构造方法会变得很长很难读,Builder模式来解决!

class Computer {
    private final String cpu;          // 必须
    private final String ram;          // 必须  
    private final String storage;      // 必须
    private final String graphicsCard; // 可选
    private final String monitor;      // 可选
    
    // 私有构造方法,只能通过Builder创建
    private Computer(Builder builder) {
        this.cpu = builder.cpu;
        this.ram = builder.ram;
        this.storage = builder.storage;
        this.graphicsCard = builder.graphicsCard;
        this.monitor = builder.monitor;
    }
    
    public static class Builder {
        // 必须参数
        private final String cpu;
        private final String ram;
        private final String storage;
        
        // 可选参数
        private String graphicsCard = "集成显卡";
        private String monitor = "23寸显示器";
        
        // Builder构造方法包含必须参数
        public Builder(String cpu, String ram, String storage) {
            this.cpu = cpu;
            this.ram = ram;
            this.storage = storage;
        }
        
        // 设置可选参数的方法
        public Builder graphicsCard(String graphicsCard) {
            this.graphicsCard = graphicsCard;
            return this;
        }
        
        public Builder monitor(String monitor) {
            this.monitor = monitor;
            return this;
        }
        
        public Computer build() {
            return new Computer(this);
        }
    }
}

// 使用Builder模式:链式调用,非常清晰
Computer gamingPC = new Computer.Builder("i7", "16GB", "1TB SSD")
    .graphicsCard("RTX 3080")
    .monitor("27寸4K显示器")
    .build();

适用场景

  • 对象有很多属性,特别是可选属性很多时
  • 希望创建过程更清晰、易读
  • 需要创建不可变对象

7. 匿名内部类

当我们只需要某个接口的一次性实现时,匿名内部类很方便。

// 创建线程的传统方式
class MyTask implements Runnable {
    @Override
    public void run() {
        System.out.println("执行任务");
    }
}

Runnable task1 = new MyTask();

// 使用匿名内部类:更简洁
Runnable task2 = new Runnable() {
    @Override
    public void run() {
        System.out.println("执行任务");
    }
};

// Java 8以后,可以用lambda表达式进一步简化
Runnable task3 = () -> System.out.println("执行任务");

8. 方法引用

Java 8引入了函数式编程,让对象创建更加优雅。

class Person {
    private String name;
    
    public Person() {
        this.name = "匿名";
    }
    
    public Person(String name) {
        this.name = name;
    }
}

// 方法引用创建对象
Supplier defaultPerson = Person::new;
Function namedPerson = Person::new;

// 使用
Person p1 = defaultPerson.get();      // 调用无参构造
Person p2 = namedPerson.apply("张三"); // 调用有参构造

总结

场景推荐方式理由
日常开发new关键字简单直接,性能好
多参数对象Builder模式可读性好,灵活
需要封装创建逻辑静态工厂方法隐藏实现细节
框架开发反射机制动态性,灵活性
函数式编程方法引用代码简洁,表达力强
创建对象副本clone()方法语义明确,使用方便

简单场景用new,复杂对象用Builder,需要灵活性用工厂方法或反射。

到此这篇关于使用Java创建对象的八种方式的文章就介绍到这了,更多相关Java创建对象方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaMap两种遍历方式keySet与entrySet详解

    JavaMap两种遍历方式keySet与entrySet详解

    这篇文章主要介绍了JavaMap两种遍历方式keySet与entrySet,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-03-03
  • [Spring MVC]-详解SpringMVC的各种参数绑定方式

    [Spring MVC]-详解SpringMVC的各种参数绑定方式

    本篇文章主要介绍了SpringMVC的各种参数绑定方式 ,具有一定的参考价值,有需要的可以了解一下。
    2016-12-12
  • 使用opencsv文件读写CSV文件

    使用opencsv文件读写CSV文件

    这篇文章主要为大家详细介绍了用opencsv文件读写CSV文件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • SpringBoot快速搭建web项目详细步骤总结

    SpringBoot快速搭建web项目详细步骤总结

    这篇文章主要介绍了SpringBoot快速搭建web项目详细步骤总结 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • Java中四种引用类型详细介绍

    Java中四种引用类型详细介绍

    这篇文章主要介绍了Java中四种引用类型详细介绍的相关资料,需要的朋友可以参考下
    2017-03-03
  • 一文让你了解透彻Java中的IO模型

    一文让你了解透彻Java中的IO模型

    本文只是说明了IO模型,让你了解IO模型是什么,怎么区分IO模型,以及分析了Java中的三种IO模型,本文是纯理论知识,看完之后会让你对IO有更加深刻的理解,感兴趣的同学可以参考一下
    2023-05-05
  • Java JVM类加载器知识总结

    Java JVM类加载器知识总结

    本文介绍Java虚拟机(JVM)中的类加载器,包括类加载器的概述、作用、基本流程及JVM类加载器的类型和层次,文章探讨了类加载的实际应用和优化,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • Java Jwt库的简介及使用详解

    Java Jwt库的简介及使用详解

    JWT 是开放的行业标准RFC7591,用来实现端到端安全验证,就是通过一些算法对加密字符串和JSON对象之间进行加解密,下面通过本文给大家介绍Java Jwt库的简介及使用,感兴趣的朋友一起看看吧
    2021-11-11
  • Maven多模块项目调试与问题排查的完整指南

    Maven多模块项目调试与问题排查的完整指南

    在现代企业级Java开发中,Maven多模块项目因其清晰的代码组织,依赖管理和高效的构建流程已成为主流架构模式,本文深入剖析多模块项目的四大核心痛点解决方案,感兴趣的小伙伴可以跟随小编一起了解下
    2025-06-06
  • Java框架---Spring详解

    Java框架---Spring详解

    这篇文章主要介绍了Java的Spring框架并用其开始编写第一个程序Hellow world的方法,Spring是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2021-09-09

最新评论