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创建对象的五种方式: (1)使用new关键字 (2)使用Object类的clone方法 (3)使用Class类的newInstance方法 (4)使用Constructor类中的newInstance方法 (5&am…...

dom基本操作
1、style修改样式 基本语法: 元素.style.样式’值‘ 注意: 1.修改样式通过style属性引出 2.如果属性有-连接符,需要转换为小驼峰命名法 3.赋值的时候,需要的时候不要忘记加css单位 4.后面的值必须是字符串 <div></div> // 1、…...
如何将python训练的XGBoost模型部署在C++环境推理
当前环境:Ubuntu,xgboost1.7.4过程介绍:首先用python训练XGBoost模型,在训练完成后注意使用xgb_model.save_model(checkpoint.model)进行模型的保存。找到xgboost的动态链接库和头文件动态链接库:如果你在conda环境下面…...

About Oracle Database Performance Method
bottleneck(瓶颈): a point where resource contention is highest throughput(吞吐量): the amount of work that can be completed in a specified time. response time (响应时间): the time to complete a spec…...
JavaScript 日期和时间的格式化大汇总(收集)
一、日期和时间的格式化 1、原生方法 1.1、使用 toLocaleString 方法 Date 对象有一个 toLocaleString 方法,该方法可以根据本地时间和地区设置格式化日期时间。例如: const date new Date(); console.log(date.toLocaleString(en-US, { timeZone: …...

【Python】缺失值可视化工具库:missingno
文章目录一、前言二、下载二、使用介绍2.1 绘制缺失值条形图2.2 绘制缺失值热力图2.3 缺失值树状图三、参考资料一、前言 在我们进行机器学习或者深度学习的时候,我们经常会遇到需要处理数据集缺失值的情况,那么如何可视化数据集的缺失情况呢࿱…...
【代码随想录二刷】Day18-二叉树-C++
代码随想录二刷Day18 今日任务 513.找树左下角的值 112.路径总和 113.路径总和ii 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树 语言:C 513.找树左下角的值 链接:https://leetcode.cn/problems/find-bottom-left-tree-va…...

制造业的云ERP在外网怎么访问?内网服务器一步映射到公网
随着企业信息化、智能化时代的到来,很多制造业企业都在用云ERP。用友U 9cloud通过双版本公有云专属、私有云订阅、传统软件购买三种模式满足众多制造业企业的需求,成为一款适配中型及中大型制造业的云ERP,是企业数智制造的创新平台。 用友U 9…...
zookeeper 复习 ---- 练习
zookeeper 复习 ---- 练习在同一节点配置三个 zookeeper,配置正确的是? A: zoo1.cfg tickTime2000 initLimit5 syncLimit2 dataDir/var/lib/zookeeper/zoo1 clientPort2181 server.1localhost:2666:3666 server.2localhost:2667:3667 serv…...
2023年全国最新道路运输从业人员精选真题及答案1
百分百题库提供道路运输安全员考试试题、道路运输从业人员考试预测题、道路安全员考试真题、道路运输从业人员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 11.在以下选项中关于安全生产管理方针描述正确的是(…...

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

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

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

将 Supabase 作为下一个后端服务
对于想快速实现一个产品而言,如果使用传统开发,又要兼顾前端开发,同时又要花费时间构建后端服务。然而有这么一个平台(Baas Backend as a service)后端即服务,能够让开发人员可以专注于前端开发,…...
14:高级篇 - CTK 服务工厂 简述
作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 一般情况下,服务对象在被注册之后,任何其它的 Plugin 在请求该服务时,CTK Plugin Framework 都返回的是同一个对象。倘若要为每一个 Plugin 消费者返回不同的服务对象,或者在真正需要该服务对象时才创建…...

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

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

Bash Shell 通过ls命令筛选文件
Bash Shell 通过ls命令及其管道根据大小名称筛选文件 最近参与的项目当中有需要用pyarmor加密项目的要求,听网上吹的pyarmor都那么神,用了一下感觉也一般,试用版普通模式下文件加密居然还有大小32KB的限制,加密到一半就失败了&am…...
2023-2-18 刷题情况
删列造序 III 题目描述 给定由 n 个小写字母字符串组成的数组 strs ,其中每个字符串长度相等。 选取一个删除索引序列,对于 strs 中的每个字符串,删除对应每个索引处的字符。 比如,有 strs [“abcdef”,“uvwxyz”] …...

【Linux】进程控制
文章目录进程创建简单认识一下fork()函数为什么fork()会有两个返回值fork通过写时拷贝的方式创建子进程进程终止进程退出码进程退出的方式exit()和_exit()进程等待进程等待方法 -- wait()和waitpid()status参数解释waitpid()的pid参数waitpid()的options参数 - 阻塞和非阻塞进程…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...