Java创建对象的方式

article/2025/10/21 12:14:36

Java创建对象的五种方式:

(1)使用new关键字
(2)使用Object类的clone方法
(3)使用Class类的newInstance方法
(4)使用Constructor类中的newInstance方法
(5)使用序列化和反序列化

(1)使用new关键字创建对象:

使用new关键字是我们入门最常见的一种创建对象的一种方式,使用new关键字创建对象的核心是对象的声明和对象分配内存。

对象的声明:类的名字 对象名字;例如 People Zhangsan;
People为类的名字,而zhangsan则是对象名字。

对象分配内存:使用new关键字和构造方法为声明的对象进行内存分配。

People Zhangsan; //声明对象
Zhangsan = new People(); //对象分配内存

③对象的内存模型:

(1)People Zhangsan; //声明对象
声明对象声明对象后,此时对象是一个空对象,空对象是不能使用的,因为必须对对象进行内存分配后才可以使用这个对象,即我们常说的我们要为对象分配实体。

(2)Zhangsan = new People(); //对象分配内存

① 为对象分配内存,则是指开始对People类中的成员变量分配内存空间,然后执行构造方法中的语句。
注意:当成员变量在声明时如果没有指定初始数值,所使用的构造方法也没有对成员变量进行初始化操作,那么整形变量的默认初始值为0,浮点型默认变量为0.0,对于Boolean类型变量的默认数值为false,对于引用类型,则初始数值为null

②当分配完内存后,则返回一个引用变量Zhangsan,相当于一个号码,用于标明我们创建的内存属于Zhangsan这个实体的,也用来确保刚刚创建的这些变量将由Zhangsan来进行管理。

③并且需要注意一个类可以通过new关键字创建多个不同的对象,但是这些对象也会被分配到不同的内存空间,这就是等价于改变其中一个对象的状态不会影响其他对象的状态。

(2)使用Class类的newInstance()创建对象(核心思想利用反射的思想)

(1)什么叫做反射机制呢?我查了一下百度,个人理解看来反射相当能够检测类本身的属性、方法的一种能力。
在这里插入图片描述

package com.day20230217;public class People {String userName;Integer age;boolean isWedding;int number;People(){System.out.println("我是默认构造方法");}
}
package com.day20230217;public class ClassNewInstance {public static void main(String[] args) throws IllegalAccessException, InstantiationException {System.out.println("利用class中的newInstance()方法创建对象");People people = People.class.newInstance();System.out.println(people);people.age = 10;people.userName = "张三";System.out.println(people);}
}

①首先要注意使用Class.newInstance()方法要保证类中必须包含默认构造方法,如果对构造方法进行改动将会报错。

②注意区别Class.newInstance()创建对象和使用new关键字创建对象的区别:
https://blog.csdn.net/qq_39800695/article/details/104940040

在这里插入图片描述

在这里插入图片描述

(3)使用Constructor类中的newInstance方法

package com.day20230217;/*** @author 袁明兴*/
public class People {String userName;Integer age;boolean isWedding;int number;public People(){System.out.println("我是默认的构造方法进行修改");}}
        System.out.println("使用Constructor类中的newInstance方法");Constructor<People> constructor = People.class.getConstructor();People people = constructor.newInstance();System.out.println(people);people.userName = "张三";people.setAge(17);System.out.println(people);

需要注意使用Constructor类中的getConstructor()方法去获取构造器时,必须保证此时类中的构造方法的访问权限表示符为public,如果构造方法的访问权限符不是public的那么可以考虑使用getDeclaredConstructor()方法,参考下图:

在这里插入图片描述
补充:
在这里插入图片描述

①private是最小的访问权限控制符,其修饰的成员变量、构造方法和普通方法只能在定义它们的类中被操作或使用。

②默认修饰比private要大,它修饰的成员变量、构造方法和普通方法不仅可以在其定义类中使用,还可以在与定义类同包的其它类中调用,继承与非继承均可。

③protected的使用范围比友好的还要大一点,它修饰的成员变量、构造方法和普通方法不仅可以在同包中使用,还可以在不同包中使用,但前提是只能在定义类的子类中使用。

④public是访问权限修饰符中最大的,无论是否是一个包内的,无论是否是继承关系,只要是一个工程里的,就可以调用。

(4)序列化和反序列化创建对象:

什么叫做序列化呢?

简单来说将对象当前的状态信息转换成可存储或者是可运输的形式的过程,我们称之为序列化,相似反序列化则是其相反含义!!

在这里插入图片描述

package com.leetch;
import java.io.*;
class Student implements Serializable{private static final long serialVersionUID=1L;private String nameString ;private int ageInt;public String getname(){return this.nameString;}public int getage(){return this.ageInt;}public void setName(String name){this.nameString = name;}public void setAge(int age){this.ageInt=age;}
}
public class SerialTest {public static void main(String[] args){Student student = new Student(); //创建一个学生对象student.setAge(20);student.setName("Yifan");try {ObjectOutputStream ooStream=new ObjectOutputStream(new FileOutputStream("F:/文件/my Documents/Coder/JAVA/File/obj.txt"));//创建一个对象输出流ooStream.writeObject(student); //把对象写入输出流,序列化,又称串化,把java对象内存中的数据采编成一串二进制的数据,然后把这些数据//存放在可以持久的数据存储设备,如磁盘等ooStream.close();			  //关闭输出流 //创建一个对象输入流ObjectInputStream oisStream= new ObjectInputStream(new FileInputStream("F:/文件/my Documents/Coder/JAVA/File/obj.txt"));Object object = oisStream.readObject();   //读出已经序列化的对象Student stubac = (Student)object;         //进行类型转换//打印数据到控制台,检查序列化和反序列化是否成功?System.out.println("student name is"+stubac.getname());System.out.println("student age is"+stubac.getage());oisStream.close();} catch(Exception e){e.printStackTrace();}}
}

(5)通过clone(克隆)的方式来创建对象

clone方法来源于java中object类,在jdk中的解释为:该方法返回一个此对象的副本。复制对象就是在内存中分配一个和原一模一样的空间,在此创建新的对象。

在这里我们要注意浅拷贝与深拷贝的概念:
给大家一个链接:
https://blog.csdn.net/u014282578/article/details/127782511

利用克隆方式进行创建对象的步骤:

①首先我们需要在需要clone的类中实现Cloneable接口,否则会出现java.lang.CloneNotSupportedException异常。

②由于Object类中clone方法是protected 修饰的,所以我们必须在需要克隆的类中重写克隆方法。
(我们知道所有定义的类都是Object类的子类,protected的使用范围比友好的还要大一点,它修饰的成员变量、构造方法和普通方法不仅可以在同包中使用,还可以在不同包中使用,但前提是只能在定义类的子类中使用。)

③调用clone()方法开始进行对象的克隆

package com.day20230217;public class People implements Cloneable {String userName;Integer age;boolean isWedding;int number;public People() {System.out.println("我是默认的构造方法进行修改");}@Overridepublic String toString() {return "People{" +"userName='" + userName + '\'' +", age=" + age +", isWedding=" + isWedding +", number=" + number +'}';}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
    People people1 = new People();People people2 =(People) people1.clone();people1.userName = "张三";people2.userName = "李四";System.out.println(people1);System.out.println(people2);System.out.println(people1 == people2);

在这里插入图片描述
大家再细看一下这段程序代码和上面的程序代码之间的区别:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/1cY2hRHg.shtml

相关文章

Java创建对象的几种方式

java是一种面向对象语言,所以我们在写代码过程中会创建很多对象,那java创建的对象到底有多少种呢?其中每种的差别又有哪些呢?请允许我慢慢道来 1.使用new关键字 这是最常见也是使用最多的一种。 Test test = new Test();// 无参构造函数 如果我们想要在创建对象的时候,…

java 之创建对象

文章目录 前言创建对象new关键字的作用构造方法什么是初始化构造方法的作用构造方法的两种形式参考引用 前言 这是我学习过程中做的总结&#xff0c;如有不对见谅。 创建对象 我们用Demo类来创建一个对象。 Demo demonew Demo();这一条语句&#xff0c;其实包括了四个动作&a…

Java中创建对象的5种方法

将会列举5种方法去创建 Java 对象&#xff0c;以及他们如何与构造函数交互&#xff0c;并且会有介绍如何去使用这些方法的示例。 作为一个 Java 开发人员&#xff0c;我们每天都会创建大量的 Java 对象&#xff0c;但是我们通常会使用依赖管理系统去创建这些对象&#xff0c;例…

Java创建对象的四种方式

1. new 2. clone 3. 通过反射newInstance 4. 反序列化 5. String s “abc”&#xff08;这个是比较特殊的&#xff09; 以String类为例 String string null; Class class1 String.class;// 该方法最为安全可靠&#xff0c;程序性能更高。 Class class2 string.getClass(…

c# Topshelf创建linux与Windows服务

目录 Topshelf安装Topshelf包代码如下&#xff0c;简单粗暴卸载服务安装服务 Topshelf 讨厌创建.net 服务时的窗体怎么办&#xff1f;讨厌调试.net服务怎么办?调试.net服务还要自己建控制台怎么办? Topshelf 它来了&#xff01;&#xff01;&#xff01; Topshelf 是一个开源…

htop与top命令

安装htop yum -y install htop htop 类似于 top 命令&#xff0c;但可以让你在垂直和水平方向上滚动&#xff0c;所以你可以看到系统上运行的所有进程&#xff0c;以及他们完整的命令行。可以不用输入进程的 PID 就可以对此进程进行相关的操作 (killing, renicing)。 与 Lin…

使用Quartz.net实现多线程任务定时执行,动态配置Job,结合Topshelf构建Windows服务

几个月前有这么个需求&#xff1a;需要执行一些Job&#xff0c;这些Job会各自按照不同的时间频次执行&#xff0c;且它们做的事情也不同&#xff0c;有的是监控站点&#xff0c;有的是监控服务器存储情况&#xff0c;有的是监控报表PROCEDURE的执行状况… OK&#xff0c;当看到…

top命令参数详解

简介 top命令是Linux下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器。 top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直…

top命令参数详解(linux top命令的用法详细详解)

通过top命令可以有效的发现系统的缺陷出在哪里。是内存不够、CPU处理能力不够、IO读写过高。 top命令输出长这样&#xff1a; top命令参数详解&#xff08;linux top命令的用法详细详解&#xff09; 以下解析一下各个字段的意思&#xff1a; VIRT&#xff1a;virtual memory …

Topas命令详解

执行topas命令后如图所示&#xff1a; #topas 操作系统的最全面动态&#xff0c;而又查看方便的性能视图就是topas命令了&#xff0c;下面以topas输出为例&#xff0c;对AIX系统的性能监控做简要描述&#xff0c;供运维工程师和系统管理员们参考。 另&#xff1a;1.操作系统报…

Topshelf 打包部署Windows服务

1 创建项目(例&#xff1a;控制台程序) Nuget 引入Topshelf类库 using System; using System.Threading; using System.Threading.Tasks; using Topshelf;namespace LoginTypeInherit {public class Program{private static readonly log4net.ILog log log4net.LogManager.G…

Linux top命令参数详解

Linux top命令参数详解 生产环境系统运行慢&#xff0c;出现无法响应通常原因主要还在于分析CPU、内存、磁盘使用率情况&#xff0c;并结合命令查找出具体进程&#xff0c;并在进程中进一步分析主要因子情况&#xff0c;渗透到对于其中包含线程占用情况的分析。一般而言对于ja…

C#之TopShelf启动Windows服务

写了一两天&#xff0c;才发现组长给的原始代码原本就有Topshelf&#xff0c;还是写出来提示我topshelf不明确哪个版本的使用&#xff0c;莫名尴尬。 1、项目的主要运行代码 HostFactory.Run(x >{x.RunAsLocalSystem();x.SetDescription("topshelf测试");x.SetDi…

Linux下top命令用法详解

一、命令介绍 Linux top命令用于实时显示 process &#xff08;进程&#xff09;的动态。它用于监控正在运行系统负荷的信息&#xff0c;包括系统负载、CPU利用分布情况、内存使用、每个进程的资源占用情况等。 使用权限&#xff1a;所有使用者 二、命令详解 在命令行下输入…

【Linux】Top命令参数解释

TOP命令 这是一个Linux系统下 top 命令所输出的进程监控信息。以下是各列含义&#xff1a; top - 09:52:15&#xff1a;当前时间。 up 27 min&#xff1a;系统已经运行的时长。 2 users&#xff1a;当前有2个用户登录到系统上。 load average: 0.97, 0.41, 0.21&#xff1a;系…

Topshelf的使用

一、简介 Topshelf可用于创建和管理Windows服务。其优势在于不需要创建windows服务&#xff0c;创建控制台程序就可以。便于调试。 二、官方地址&#xff1a; 1、官网&#xff1a;http://topshelf-project.com/ 2、官方文档&#xff1a;https://topshelf.readthedocs.io/en/lat…

topshelf

topshelf和quartz topshelf和quartz内部分享 阅读目录: 介绍基础用法调试及安装可选配置多实例支持及相关资料quartz.net 上月在公司内部的一次分享&#xff0c;现把PPT及部分交流内容整理成博客。 介绍 topshelf是创建windows服务的一种方式&#xff0c;相比原生实现ServiceBa…

使用Quartz.net + Topshelf完成服务调用

概述&#xff1a; Quartz.NET 是一个开源作业调度库&#xff0c;可用于在 .NET 应用程序中调度和管理作业。它提供了一个灵活而强大的框架&#xff0c;用于调度作业在特定的日期和时间或以固定的时间间隔运行&#xff0c;并且还支持复杂的调度场景&#xff0c;例如 cron 表达式…

Linux中top命令参数详解

top命令用法 top命令经常用来监控linux的系统状况&#xff0c;是常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用情况。 top的使用方式 top [-d number] | top [-bnp] 参数解释&#xff1a; -d&#xff1a;number代表秒数&#xff0c;表示top命令显示…

linux 命令:top 详解

注&#xff1a;以下文档根据2019年10月的官方文档翻译。 名称&#xff1a;top - 展示linux进程信息 用法&#xff1a;top -hv|-bcEHiOSs1 -d secs -n max -u|U user -p pid -o fld -w [cols] 在top进程运行过程中&#xff0c;两个最重要的功能是查看帮助&#xff08;h 或 &…