Java中创建对象的方式

news2025/2/28 6:07:53

文章目录

  • 一、使用new关键字
  • 二、使用反射机制
  • 三、使用clone方法
  • 四、使用反序列化

创建对象方式

一、使用new关键字

下面是使用 new 关键字创建对象的示例代码,同时演示了如何调用不同构造函数的方式:

public class Person {
    private String name;
    private int age;
    
    public Person() {
        this.name = "Unknown";
        this.age = 0;
    }
    
    public Person(String name) {
        this.name = name;
        this.age = 0;
    }
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public String getName() {
        return name;
    }
    
    public int getAge() {
        return age;
    }
    
    public static void main(String[] args) {
        // 调用无参构造函数
        Person person1 = new Person();
        System.out.println("Name: " + person1.getName());
        System.out.println("Age: " + person1.getAge());
        
        // 调用带有一个参数的构造函数
        Person person2 = new Person("John");
        System.out.println("Name: " + person2.getName());
        System.out.println("Age: " + person2.getAge());
        
        // 调用带有两个参数的构造函数
        Person person3 = new Person("Jane", 25);
        System.out.println("Name: " + person3.getName());
        System.out.println("Age: " + person3.getAge());
    }
}

在上述示例中,我们扩展了 Person 类,添加了不同的构造函数:无参构造函数、一个参数的构造函数和两个参数的构造函数。

🎯通过调用不同的构造函数,我们可以传递不同的参数来创建对象,并获取对象的属性值。🎯

二、使用反射机制

当使用反射机制创建对象时,可以通过以下步骤进行:

  1. 获取类的 Class 对象,可以使用 Class.forName() 方法,传入类的全限定名。

  2. 通过 Class 对象的 newInstance() 方法创建对象。这个方法会调用类的默认构造函数来创建对象。

下面是一个简单的示例代码:

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class ReflectionDemo {
    public static void main(String[] args) {
        try {
            // 获取类的Class对象
            Class<?> clazz = Class.forName("com.example.MyClass");

            // 使用newInstance()方法创建对象
            Object obj = clazz.newInstance();

            // 输出对象信息
            System.out.println(obj);

        } catch (ClassNotFoundException | IllegalAccessException |
                InstantiationException e) {
            e.printStackTrace();
        }
    }
}

class MyClass {
    // 默认构造函数
    public MyClass() {
        System.out.println("MyClass对象被创建");
    }
}

在上面的示例中,我们使用反射机制创建了一个名为 MyClass 的对象,并输出了对象信息。

✨除此之外✨,还可以使用 Constructor 类的 newInstance() 方法来创建对象。

下面是一个示例代码:

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class ReflectionDemo {
    public static void main(String[] args) {
        try {
            // 获取类的Class对象
            Class<?> clazz = MyClass.class;

            // 获取类的构造函数
            Constructor<?> constructor = clazz.getConstructor();

            // 使用构造函数的newInstance()方法创建对象
            Object obj = constructor.newInstance();

            // 输出对象信息
            System.out.println(obj);

        } catch (NoSuchMethodException | IllegalAccessException |
                InstantiationException | InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

class MyClass {
    // 默认构造函数
    public MyClass() {
        System.out.println("MyClass对象被创建");
    }
}

在上面的示例中,我们首先使用 MyClass.class 获取了类的 Class 对象,然后通过 getConstructor() 方法获取了默认构造函数的 Constructor 对象。最后,我们使用构造函数对象的 newInstance() 方法创建了一个 MyClass 对象,并输出了对象信息。

🎆需要注意的是🎆:使用 Constructor 类的 newInstance() 方法时,需要处理可能抛出的异常,如 NoSuchMethodException、IllegalAccessException、InstantiationException 和 InvocationTargetException。

  • Class 类的 newInstance() 方法和 Constructor 类的 newInstance() 方法都属于反射机制的一部分。

  • Class 类的 newInstance() 方法是一个方便的方法,它会调用类的默认构造函数来创建一个对象。该方法在 JDK 9 中已经被标记为过时(deprecated),并且在未来的版本中可能会被移除。推荐使用 Constructor 类的 newInstance() 方法来创建对象。

  • Constructor 类的 newInstance() 方法可以通过指定构造函数的参数来创建对象。这样可以灵活地调用不同的构造函数来创建对象。newInstance() 方法会抛出 InstantiationException、IllegalAccessException 和 InvocationTargetException 异常,需要进行异常处理。

三、使用clone方法

使用clone()方法可以创建一个对象的副本。clone()方法是Object类中的一个方法,它创建并返回一个与原始对象相同的新对象。

🎆具体步骤如下:🎆

  1. 首先,需要确保要克隆的类实现了Cloneable接口,该接口标记了类可以被克隆。

  2. 在要克隆的类中,重写clone()方法,调用父类的clone()方法,并将返回的对象进行强制转换。

以下是一个示例代码:

public class CloneExample implements Cloneable {
    private String name;

    public CloneExample(String name) {
        this.name = name;
    }

    // 重写clone()方法
    @Override
    public CloneExample clone() throws CloneNotSupportedException {
        return (CloneExample) super.clone();
    }

    public static void main(String[] args) {
        try {
            // 创建原始对象
            CloneExample original = new CloneExample("Original");

            // 克隆对象
            CloneExample clone = original.clone();

            // 修改原始对象的属性
            original.setName("Modified Original");

            // 输出结果
            System.out.println("Original: " + original.getName());
            System.out.println("Clone: " + clone.getName());
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

在上述示例中,首先创建了一个CloneExample类,它实现了Cloneable接口。然后,重写了clone()方法,调用父类的clone()方法,并将返回的对象进行强制转换。在main()方法中,创建了一个原始对象original,然后通过original.clone()方法克隆出一个新对象clone。修改原始对象的属性后,输出原始对象和克隆对象的属性值。

✨注意:✨

  • clone()方法是浅拷贝,即它只复制对象的引用,而不会复制对象的内容。如果对象中包含可变的引用类型成员变量,则修改其中一个对象的成员变量会影响另一个对象。

  • 如果要实现深拷贝,即复制对象及其所有引用类型成员变量的内容,需要在clone()方法中递归地克隆这些引用类型成员变量。

四、使用反序列化

使用反序列化可以创建一个对象,反序列化是将对象的序列化表示转换回对象的过程。

🎈具体步骤如下:🎈

  1. 首先,需要一个包含对象序列化数据的文件或字节数组。

  2. 创建一个ObjectInputStream对象,用于从文件或字节数组中读取对象的序列化数据。

  3. 使用ObjectInputStream对象的readObject()方法读取对象的序列化数据,并返回一个Object类型的对象。

  4. 将返回的Object对象强制转换为实际的对象类型。

  5. 以下是一个示例代码:

import java.io.*;

public class DeserializeExample {
    public static void main(String[] args) {
        try {
            // 从文件中读取对象的序列化数据
            FileInputStream fileIn = new FileInputStream("object.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);

            // 反序列化对象
            MyObject obj = (MyObject) in.readObject();

            // 关闭输入流
            in.close();
            fileIn.close();

            // 使用反序列化得到的对象
            System.out.println("Object: " + obj);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

class MyObject implements Serializable {
    private static final long serialVersionUID = 1L;

    private String name;

    public MyObject(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "MyObject [name=" + name + "]";
    }
}
  1. 在上述示例中,首先通过FileInputStream从文件中读取对象的序列化数据,然后创建一个ObjectInputStream对象in,使用in的readObject()方法读取对象的序列化数据,返回一个Object对象。接着将返回的Object对象强制转换为实际的对象类型MyObject,并使用该对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/862230.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超人PDF解密助手:pdf怎么解除编辑权限

PDF文件带有编辑权限&#xff0c;想要取消PDF文件的限制&#xff0c;该如何操作&#xff1f; 打开PDF编辑器&#xff0c;点击工具栏中的文件&#xff0c;选择属性按钮&#xff0c;进入到熟悉感界面之后&#xff0c;点击安全&#xff0c;然后我们点击权限下拉框&#xff0c;选择…

LaTeX基础学习笔记

LaTeX是一个文本编辑器。其类似于markdown&#xff0c;使用特殊标记和代码来修改文本格式&#xff0c;创建特殊字符等。可以使用overleaf在线LaTex编辑器编写LaTeX并转换为pdf文件&#xff08;https://www.overleaf.com/&#xff09; 同时推荐一个网站http://detexify.kirelab…

Mysql 复杂查询丨联表查询

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; JOIN&#xff08;联表查询&#xff09; 联表查询&#xff08;Join&#xff09;是一种在数据库中使用多个表进行关联查询的操作。它通过使用 JOIN 关键字将多个表连接在…

[保研/考研机试] KY163 素数判定 哈尔滨工业大学复试上机题 C++实现

题目链接&#xff1a; 素数判定https://www.nowcoder.com/share/jump/437195121691718831561 描述 给定一个数n&#xff0c;要求判断其是否为素数&#xff08;0,1&#xff0c;负数都是非素数&#xff09;。 输入描述&#xff1a; 测试数据有多组&#xff0c;每组输入一个数…

橡胶履带行业分析报告2023-2029

橡胶履带行业分析报告&#xff0c;2022年全球橡胶履带市场规模达到了19.2亿美元 橡胶履带是用橡胶和骨架材料制成的履带&#xff0c;它被广泛用于工程机械、农用机械和军用装备。橡胶履带行业产业链主要原材料包括橡胶、芯金、炭黑、钢丝、各类橡胶化学助剂等&#xff0c;上游…

python函数的传参

一、关键字参数 定义一个接受关键字参数的函数 def test_arg(**kargs):for key in kargs:print(f{key}{kargs[key]}) 这里的kargs是一个字典&#xff0c;但传入的参数是 **kargs, 而非 kargs. 可以试试&#xff1a; test_arg(A30,B"Chinese") 但你直接传入一个字…

将一组元素四舍五入到指定精度(小数位数)numpy.around()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 将一组元素四舍五入 到指定精度(小数位数) numpy.around() [太阳]选择题 关于以下代码说法错误的一项是? import numpy as np anp.array([21.3,9.67,8.5, -1.13, -2.67]) print(【显示】a为…

【Python机器学习】实验11 神经网络-感知器

文章目录 人工神经网络感知机二分类模型算法 1. 基于手写代码的感知器模型1.1 数据读取1.2 构建感知器模型1.3 实例化模型并训练模型1.4 可视化 2. 基于sklearn的感知器实现2.1 数据获取与前面相同2.2 导入类库2.3 实例化感知器2.4 采用数据拟合感知器2.5 可视化 实验1 将上面数…

学习笔记-JVM监控平台搭建

SpringBoot Actuator 1 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId> </dependency>2 开启配置 # 暴露所有的监控点【含Prometheus】 management.endpoin…

TIA博途软件无法搜索到CPU的解决办法汇总

TIA博途软件无法搜索到CPU的解决办法汇总 1. 检查电脑操作系统的兼容性 西门子对每个主要软件都会进行官方的兼容性测试过,其中重要一项是和 Windows 操作系统的兼容性,需要根据软件版本和 Windows 版本核对,如果不匹配,可能会有问题。 每个版本软件的安装条件可以参考以下…

网页爬虫中常用代理IP主要有哪几种?

各位爬虫探索者&#xff0c;你是否有想过在网页爬虫中使用代理IP来规避限制实现数据自由&#xff1f;在这篇文章中&#xff0c;作为一名IP代理产品供应商&#xff0c;我将为你揭示常见的网页爬虫代理IP类型&#xff0c;让你在爬虫的世界中游刃有余&#xff01; 一、免费公开代理…

Linux系统文件类型与文件权限

一、文件类型 &#xff08;1&#xff09;在windows系统中文件类型以文件的后缀名来区分&#xff0c;在Linux系统中文件类型不以后缀名来区分。注意编写c代码时必须写后缀名.c&#xff0c;不然C编译器不会编译该文件。 &#xff08;2&#xff09;在Linux系统中以文件的标志来区…

springboot在线小说阅读网站的设计与实现

网站首页&#xff1a; 用户登录/注册&#xff1a;用户注册时进行用户名及笔名存在的限制热门小说推荐&#xff1a;显示小说名及作者名&#xff0c;点击进入对应小说小说类别&#xff1a;玄幻&#xff0c;武侠&#xff0c;言情&#xff0c;历史等&#xff0c;点击对用分类到分类…

那些年的Java开发经验记录

Java同步锁(浅显易懂&#xff0c;精简讲解) 详细讲解可以看这篇文章Java对象锁和类锁全面解析&#xff08;多线程synchronized关键字&#xff09; 精简如下&#xff1a; 1.不管什么锁&#xff0c;都是属于对象锁(类也是一种对象) 2.一个对象只有一个锁 3.锁最大可以锁整个…

AcrelEMS-BP生物制药能效管理系统解决方案

安科瑞 崔丽洁 平台概述 AcrelEMS-BP生物制药能效管理系统集变电站综合自动化、电力监控、电能质量分析及治理、电气安全、能耗分析、照明控制、设备运维于一体。平台采用自动化、信息化技术和集中管理模式&#xff0c;对企业的生产、输配和消耗环节实行集中扁平化的动态监控和…

LTE鉴权失败原因分析

背景介绍&#xff1a;网络发鉴权加密申请后&#xff0c;收到用户响应后&#xff0c;同时又收到reject&#xff0c;reject code 是0x14&#xff0c;还不能确认是否鉴权参数设置问题引起的&#xff0c;欢迎各位专家来讨论及给建议。 reject code如下&#xff1a; 1、通过log&am…

赛码网-回文串 100%AC代码(C)

———————————————————————————————————— ⏩ 大家好哇&#xff01;我是小光&#xff0c;嵌入式爱好者&#xff0c;一个想要成为系统架构师的大三学生。 ⏩最近在准备秋招&#xff0c;一直在练习编程。 ⏩本篇文章对赛码网的回文串 题目做一个…

智慧家庭如何落地?三翼鸟把答案写在用户家里

近年来&#xff0c;学术界流行一句话&#xff0c;“把论文写在中国大地上”。 一项新技术从实验室到千万家&#xff0c;落地难、转化低&#xff0c;是技术创新经常碰到的问题。所以&#xff0c;如何让新技术扎根大地、扎根真实需求&#xff0c;普惠人间&#xff0c;是中国产学研…

Java并发编程第4讲——Java中的锁(知识扫盲)

目录 一、锁的相关概念 1.1 什么是锁 1.2 为什么需要锁 1.3 Java中锁的分类 二、synchronized关键字 2.1 三个特点 2.2 三种表现形式&#xff08;&#x1f64b;‍♂️&#xff09; 2.3 sychronized是怎么实现的&#xff08;&#x1f64b;‍♂️&#xff09; 2.4 JDK1.…

opencv基础52-图像轮廓学习05-凸包获取-cv2.convexHull()

逼近多边形是轮廓的高度近似&#xff0c;但是有时候&#xff0c;我们希望使用一个多边形的凸包来简化它。 凸包跟逼近多边形很像&#xff0c;只不过它是物体最外层的“凸”多边形。凸包指的是完全包含原有轮 廓&#xff0c;并且仅由轮廓上的点所构成的多边形。凸包的每一处都是…