Java创建对象的方式

news2024/9/28 11:22:42

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("我是默认的构造方法进行修改");
    }
    @Override
    public String toString() {
        return "People{" +
                "userName='" + userName + '\'' +
                ", age=" + age +
                ", isWedding=" + isWedding +
                ", number=" + number +
                '}';
    }

    @Override
    protected 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://www.coloradmin.cn/o/354009.html

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

相关文章

[MySQL]初识数据库

哈喽&#xff0c;大家好&#xff01;我是保护小周ღ&#xff0c;本期为大家带来的是 MySQL 数据库&#xff0c;也是新的知识&#xff0c;首先我们会初步认识什么是数据库&#xff0c;什么是Mysql 数据库&#xff0c;以及我们 mysql 主要学什么&#xff0c;SQL 语句简单使用&…

如何使用Python创建一个自定义视频播放器

目录 1、安装vlc的64位版本。 2、安装python的vlc模块。 3、编写如下代码&#xff0c;包含了播放&#xff0c;暂停&#xff0c;停止、音量控制功能。 4、来看一看运行结果。 5、如果遇到播放不了的问题&#xff0c;解决方式如下&#xff1a; 这个例子使用VLC作为视频播放器…

【C#个人错题笔记1】

观前提醒 记录一些我不会或者少见的内容&#xff0c;不一定适合所有人 字符串拼接 int a3,b8; Console.WriteLine(ab);//11 Console.WriteLine("ab");//ab Console.WriteLine(a""b);//38 Console.WriteLine("ab"ab);//ab38 Console.WriteLine…

基于Hadoop搭建Flink集群详细步骤

目录 1.xftp上传flink压缩包至hadoop102的/opt/software/目录下 2.解压flink压缩包至/opt/module/目录下 3. 配置flink-conf.yaml 4.配置masters 5.配置workers 6.配置环境变量my_env.sh 7.重启环境变量 8.分发/opt/module/flink-1.13.0和/etc/profile.d/my_env.sh 9.…

三、NetworkX工具包实战1——创建图、节点和连接【CS224W】(Datawhale组队学习)

开源内容&#xff1a;https://github.com/TommyZihao/zihao_course/tree/main/CS224W 子豪兄B 站视频&#xff1a;https://space.bilibili.com/1900783/channel/collectiondetail?sid915098 斯坦福官方课程主页&#xff1a;https://web.stanford.edu/class/cs224w NetworkX…

RFID射频识别技术(四) RFID高频电路基础|课堂笔记|10月11日

2022年10月11日 week7 ​​​​​​​ 目录 ​​​​​​​ 第四讲: RFID高频电路基础 一、RLC(串联)电路的阻抗

人工智能时代- 是时候改变学习方法了!

一、背景 现在 ChatGPT 非常火爆&#xff0c;很多问题能够给出非常专业的回答&#xff0c;对我们的学习有一些帮助。 今天突发奇想&#xff0c;问问 ChatGPT 一个问题&#xff1a;“Java 程序员如何做到让自己的代码更具有拓展性&#xff1f;” 下面将贴出 ChatGPT 相关的人…

上市公司企业持续创新能力、创新可持续性(原始数据+计算代码+计算结果)(2008-2021年)

数据来源&#xff1a;自主计算 时间跨度&#xff1a;2008-2021年 区域范围&#xff1a;沪深A股上市公司 指标说明&#xff1a; 参考何郁冰&#xff08;2017&#xff09;[1]的做法&#xff0c;将持续创新作为独立研究变量&#xff0c;同时采用创新投入指标(研发经费) 和创新…

【AHK】打开网络连接/打开wifi列表/打开蓝牙列表

需求&#xff1a;打开wifi列表检查自动连接的wifi&#xff0c;打开蓝牙列表查看蓝牙设备电量&#xff0c;并通过快捷键激活&#xff0c;能像wink那样打开连接列表。 同时也是一种思路&#xff0c;就是一般是输入 Windows打开xx的快捷键&#xff0c;一般是找不到的&#xff0c;那…

Apache Flink 实时计算在美的多业务场景下的应用与实践

摘要&#xff1a;本文整理自美的集团实时数据负责人、资深数据架构师董奇&#xff0c;在 Flink Forward Asia 2022 主会场的分享。本篇内容主要分为四个部分&#xff1a;实时生态系统在美的的发展和建设现状核心传统业务场景 Flink 实时数字化转型实践新兴业务场景 Flink 实时数…

Ubuntu最新版本(Ubuntu22.04LTS)安装nfs服务器及使用教程

目录 一、概述 二、在Ubuntu搭建nfs服务器  &#x1f449;2.1 安装nfs服务器  &#x1f449;2.2 创建nfs服务器共享目录  &#x1f449;2.3 修改nfs服务器配置文件  &#x1f449;2.4 重启nfs服务器 三、客户端访问nfs服务器共享目录  &#x1f388;3.1 在nfs客户端挂载服…

Tile防丢器引入全新防盗模式,苹果Find My功能拓展到大众消费电子

Tile 宣布引入全新的防盗模式&#xff0c;Tile 配件启用之后&#xff0c;反跟踪扫描和安全功能就无法检测到该配件。Tile 为了遏制其物品追踪产品用于追踪某人&#xff0c;此前推出了 Scan and Secure 功能。iPhone 和安卓用户可以通过该功能扫描附近的 Tile 设备&#xff0c;以…

【C++之容器篇】map和set常见函数接口的使用与剖析

目录前言一、set1. 简介2. 成员类型3. 构造函数(1) set()(2)set(InputIterator first,InputIterator last)(3)使用4. 拷贝构造函数和赋值运算符重载5. empty()6. size()7. insert()(1)pair<iterator,bool> insert(const K& key)(2)iterator insert(iterator pos,cons…

零信任-Cisco思科零信任介绍(10)

​目录 ​思科零信任介绍 思科零信任所涉及产品 思科零信任架构拓扑介绍 ​思科零信任框架VS零信任安全框架 思科零信任架构的应用场景 思科零信任解决方案的优势 思科零信任的未来发展展望 思科零信任介绍 Cisco Zero Trust是思科公司推广的一种安全模型&#xff0c;旨…

实现qq群消息接收和发送功能

QQWebsocketClient是什么 实现qq群消息接收和发送功能&#xff0c;基于websocket技术和cqhttp服务开发 一、 效果截图 二、实现思路 使用cqhttp进行socket反向代理&#xff0c;获取qq聊天的所有消息 编写java客户端&#xff0c;连接至cqhttp服务器获取聊天消息 获取聊天消…

spring boot 自动配置类,详细过程

springboot version(v2.7.8)启动类SpringBootApplication public class SecurityApplication { public static void main(String[] args) {SpringApplication.run(SecurityApplication.class, args);} }1 点击 SpringBootApplication进入&#xff0c;EnableAutoConfiguration 开…

把Typora图片自动上传网

闲话少说 总共三步下载PicGohttps://github.com/Molunerfinn/PicGo/releases/download/v2.3.1/PicGo-Setup-2.3.1-x64.exe直接点就行这里略过Gitee我们需要使用 Git 来保存我们的图片&#xff0c;又因为国内访问 Github 速度比较慢&#xff0c;所以这里推荐使用国内的 Git 托管…

Blazor入门100天 : 身份验证和授权 (1) - 建立带身份验证工程

目录 建立默认带身份验证 Blazor 程序角色/组件/特性/过程逻辑DB 改 Sqlite将自定义字段添加到用户表脚手架拉取IDS文件,本地化资源freesql 生成实体类,freesql 管理ids数据表初始化 Roles,freesql 外键 > 导航属性完善 freesql 和 bb 特性 知识点 Microsoft.AspNetCore.…

数据结构与算法之数组寻找峰值分而治之

这一篇分享一道在数组中寻找峰值的题目&#xff0c;使用到分而治之&#xff0c;二分查找等思想。本文章会讲解这个二分查找的本质&#xff0c;以及为什么要用二分查找&#xff0c;它能解决哪一类题目&#xff1f;目录&#xff1a;一.题目及其要求1.分而治之2.题目思路3.具体做法…

渗透测试实战 - 外网渗透内网穿透(超详细)

文章目录实验环境Target1 - Centos7 &#xff08;web服务&#xff09;Target2 - Ubuntu &#xff08;内网web服务&#xff09;Target3 - Windows7 (客户端)实验目的实验步骤测试Target1信息收集22/21端口 弱口令爆破(MSF&#xff0c;hydra)3306端口8888端口80端口主机信息收集反…