当前位置: 首页 > news >正文

Java创建对象的方式

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);

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

相关文章:

Java创建对象的方式

Java创建对象的五种方式&#xff1a; &#xff08;1&#xff09;使用new关键字 &#xff08;2&#xff09;使用Object类的clone方法 &#xff08;3&#xff09;使用Class类的newInstance方法 &#xff08;4&#xff09;使用Constructor类中的newInstance方法 &#xff08;5&am…...

dom基本操作

1、style修改样式 基本语法&#xff1a; 元素.style.样式’值‘ 注意: 1.修改样式通过style属性引出 2.如果属性有-连接符&#xff0c;需要转换为小驼峰命名法 3.赋值的时候&#xff0c;需要的时候不要忘记加css单位 4.后面的值必须是字符串 <div></div> // 1、…...

如何将python训练的XGBoost模型部署在C++环境推理

当前环境&#xff1a;Ubuntu&#xff0c;xgboost1.7.4过程介绍&#xff1a;首先用python训练XGBoost模型&#xff0c;在训练完成后注意使用xgb_model.save_model(checkpoint.model)进行模型的保存。找到xgboost的动态链接库和头文件动态链接库&#xff1a;如果你在conda环境下面…...

About Oracle Database Performance Method

bottleneck&#xff08;瓶颈&#xff09;&#xff1a; a point where resource contention is highest throughput(吞吐量)&#xff1a; the amount of work that can be completed in a specified time. response time (响应时间)&#xff1a; the time to complete a spec…...

JavaScript 日期和时间的格式化大汇总(收集)

一、日期和时间的格式化 1、原生方法 1.1、使用 toLocaleString 方法 Date 对象有一个 toLocaleString 方法&#xff0c;该方法可以根据本地时间和地区设置格式化日期时间。例如&#xff1a; const date new Date(); console.log(date.toLocaleString(en-US, { timeZone: …...

【Python】缺失值可视化工具库:missingno

文章目录一、前言二、下载二、使用介绍2.1 绘制缺失值条形图2.2 绘制缺失值热力图2.3 缺失值树状图三、参考资料一、前言 在我们进行机器学习或者深度学习的时候&#xff0c;我们经常会遇到需要处理数据集缺失值的情况&#xff0c;那么如何可视化数据集的缺失情况呢&#xff1…...

【代码随想录二刷】Day18-二叉树-C++

代码随想录二刷Day18 今日任务 513.找树左下角的值 112.路径总和 113.路径总和ii 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树 语言&#xff1a;C 513.找树左下角的值 链接&#xff1a;https://leetcode.cn/problems/find-bottom-left-tree-va…...

制造业的云ERP在外网怎么访问?内网服务器一步映射到公网

随着企业信息化、智能化时代的到来&#xff0c;很多制造业企业都在用云ERP。用友U 9cloud通过双版本公有云专属、私有云订阅、传统软件购买三种模式满足众多制造业企业的需求&#xff0c;成为一款适配中型及中大型制造业的云ERP&#xff0c;是企业数智制造的创新平台。 用友U 9…...

zookeeper 复习 ---- 练习

zookeeper 复习 ---- 练习在同一节点配置三个 zookeeper&#xff0c;配置正确的是&#xff1f; A&#xff1a; zoo1.cfg tickTime2000 initLimit5 syncLimit2 dataDir/var/lib/zookeeper/zoo1 clientPort2181 server.1localhost:2666:3666 server.2localhost:2667:3667 serv…...

2023年全国最新道路运输从业人员精选真题及答案1

百分百题库提供道路运输安全员考试试题、道路运输从业人员考试预测题、道路安全员考试真题、道路运输从业人员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 11.在以下选项中关于安全生产管理方针描述正确的是&#xff08;…...

Java每日一练——Java简介与基础练习

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 文章目录 目录 系列文章目录 文章目录 前言 一、简述解释型语言与编译型语言 二、Java语言的执行流程 2.1、…...

解决Edge浏览器主页被篡改问题,或许可以帮你彻底解决

问题描述&#xff1a; 之前从一个第三方网站下载了一个不知名软件&#xff0c;接着电脑就各种下载360全家桶之类的软件&#xff0c;后来问题解决了&#xff0c;但是还残留了一些问题&#xff0c;前几天发现edge浏览器的主页被改成了360导航&#xff0c;就是那个该死的hao123&a…...

字符设备驱动基础(一)

目录 一、Linux内核对设备的分类 linux的文件种类&#xff1a; Linux内核按驱动程序实现模型框架的不同&#xff0c;将设备分为三类&#xff1a; 总体框架图&#xff1a; 二、设备号------内核中同类设备的区分 三、申请和注销设备号 四、函数指针复习 4.1、 内存四区 …...

将 Supabase 作为下一个后端服务

对于想快速实现一个产品而言&#xff0c;如果使用传统开发&#xff0c;又要兼顾前端开发&#xff0c;同时又要花费时间构建后端服务。然而有这么一个平台&#xff08;Baas Backend as a service&#xff09;后端即服务&#xff0c;能够让开发人员可以专注于前端开发&#xff0c…...

14:高级篇 - CTK 服务工厂 简述

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 一般情况下,服务对象在被注册之后,任何其它的 Plugin 在请求该服务时,CTK Plugin Framework 都返回的是同一个对象。倘若要为每一个 Plugin 消费者返回不同的服务对象,或者在真正需要该服务对象时才创建…...

Java中的链表实现介绍

Java中的链表实现介绍 学习数据结构的的链表和树时&#xff0c;会遇到节点&#xff08;node&#xff09;和链表&#xff08;linked list&#xff09;这两个术语&#xff0c;节点是处理数据结构的链表和树的基础。节点是一种数据元素&#xff0c;包括两个部分&#xff1a;一个是…...

演示Ansible中的角色使用方法(ansible roles)

文章目录一、ansible 角色简介二、roles目录结构三、role存放的路径&#xff1a;配置文件ansible.cfg中定义四、创建目录结构五、playbook中使用rolesplaybook变量会覆盖roles中的定义变量六、控制任务执行顺序七、ansible—galaxy命令工具八、安装选择的角色1.从网上下载&…...

Bash Shell 通过ls命令筛选文件

Bash Shell 通过ls命令及其管道根据大小名称筛选文件 最近参与的项目当中有需要用pyarmor加密项目的要求&#xff0c;听网上吹的pyarmor都那么神&#xff0c;用了一下感觉也一般&#xff0c;试用版普通模式下文件加密居然还有大小32KB的限制&#xff0c;加密到一半就失败了&am…...

2023-2-18 刷题情况

删列造序 III 题目描述 给定由 n 个小写字母字符串组成的数组 strs &#xff0c;其中每个字符串长度相等。 选取一个删除索引序列&#xff0c;对于 strs 中的每个字符串&#xff0c;删除对应每个索引处的字符。 比如&#xff0c;有 strs [“abcdef”,“uvwxyz”] &#xf…...

【Linux】进程控制

文章目录进程创建简单认识一下fork()函数为什么fork()会有两个返回值fork通过写时拷贝的方式创建子进程进程终止进程退出码进程退出的方式exit()和_exit()进程等待进程等待方法 -- wait()和waitpid()status参数解释waitpid()的pid参数waitpid()的options参数 - 阻塞和非阻塞进程…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...