创建对象的方式

Latex里面关于作者名字显示有灰色; 二级+三级标题斜体; Latex里面关于 作者名字显示有灰色; 二级+三级标题斜体,与正文的距离; 邮箱字体;ORCID字体设置(整理不易,请先关注,Thanks) 阅读详情

获得对象的方式

先定义一个Programmer类:

package com.zrt.pojo;

public class Programmer {
    private int id;
    private String name;
    private int age = 18;

    public Programmer(){
        
    }
    
    public Programmer(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

1、new一个对象

用关键字 new 进行对象的创建,几乎是写代码时最常用的操作之一,比如:

Programmer programmer01 = new Programmer(1,"zhangsan");
Programmer programmer02 = new Programmer();

通过new的方式,我们可以调用类的无参构造和有参构造来实例出一个Programmer对象。

由上可看出,对象简简单单地new一下就有了,可真相真的如此吗?其实不然,因为有JVM这个牵线红娘背后默默地帮我们做了很多的工作。

new出一个对象的过程大致可描述如图 1-1所示。

在这里插入图片描述

图 1-1
  1. 首先,当我们new一个对象的时候,例如 Programmer programmer02 = new Programmer() ,JVM 首先就会去检查 programmer02 这个引用所代表的Programmer类是否已经被加载过,如果没有的话就要执行对应类的加载过程。

  2. 声明类型引用很简单,例如 Programmer programmer02 = new Programmer() 就会声明一个Programmer类型的引用programmer02。

  3. 第1步的类加载完成以后,其实对象所需要的内存大小就已经确定下来了,接下来JVM就会在堆上为对象分配内存。单个对象的内存图如图 1-2所示。

    图 1-2
    1. 所谓的属性“ 0 ”值初始化,其实非常地好理解,就是实例化对象的各个属性并为其赋上默认初始值“ 0 ”值,比如 int 类型的初始值就是0,而一个对象的初始化“ 0 ”值就是null。
    2. 接下来JVM会进行对象头的设置,主要包括对象的运行时数据(如Hash码、分代年龄、锁状态标志、锁指针、偏向线程ID、偏向时间戳等等)以及类型指针(JVM通过该类型指针来确定该对象是哪个类的实例)。
    3. 属性的显示初始化也比较好理解,比如上述在定义Programmer类的时候,针对某个属性字段手动的赋值,如:“ private int age = 18“ , 就在这个时候初始化。
    4. 最后是调用类的构造方法,进行构造方法内描述的初始化动作。

应该说,经过了上述的一系列操作,一个新的对象才算是真正的诞生了。


2、反射出一个对象

通过Java的反射机制,只要能拿到Class对象,就可以通过强大的反射机制来创造出实例对象。

一般而言,拿到Class对象有三种方式:

  1. 类名.class
  2. 对象名.getClass()
  3. Class.forName(全限定类名)

有了 Class 对象之后,便可调用其 newInstance() 方法来创建一个对象,如:

Class pClass = Class.forName("com.zrt.pojo.Programmer");
Programmer programmer01 = (Programmer) pClass.newInstance();
        
Programmer programmer02 = Programmer.class.newInstance();

与此同时,这种方法的局限性也是很明显的,因为使用的是Programmer类的无参构造来创建对象的。

所以比上述的方法更进一步的方式是通过java.lang.relect.Constructor这个类的newInstance()方法来创建对象,因为它可以明确地指定通过某个构造器来创建对象。比如,当我们拿到了类的Class对象后,就可以通过**getDeclaredConstructor()**函数来获取到类的所有构造函数,这样我们便可指定其中一个来创建对象,就像这样:

Constructor[] constructors = Programmer.class.getConstructors();
Programmer programmer03 = (Programmer) constructors[0].newInstance();
Programmer programmer04 = (Programmer) constructors[1].newInstance(1, "zhangsan");

而且,如果我们想明确获取类的某个构造函数,便可以调用getDeclaredConstrutor(Class<?> … parameterTypes)函数里直接指定构造函数传参类型来准确控制,如:

Constructor constructor = Programmer.class.getConstructor(int.class, String.class);
Programmer programmer05 = (Programmer) constructor.newInstance();

3、对象克隆

Java中还支持对象的克隆操作,顾名思义,就是通过对象占有的堆内存空间的保存内容实现数据的赋值,利用已有对象克隆出一个成员属性内容完全相同的实例化对象。

对象的克隆可以使用Object类提供的clone()方法,此方法定义如下:

protected Object clone() throws CloneNotSupportedException

注意的是,进行克隆的对象必须实现一个Cloneable接口(此接口只是一个标识接口,只表示一种能力,接口中并没有任何方法),否则clone()方法会抛出一个CloneNotSupportedException(不支持克隆异常)。

Object类提供的clone()方法在类中使用protected设置了访问权限,所以该方法只能通过Object类的子类来进行调用。

public class CloneTestDemo {
    public static void main(String[] args) throws CloneNotSupportedException {
        // 实例化 User 对象
        User user01 = new User("张三",18);

        User user02 = (User)user01.clone();
        user02.setName("李四");
        user02.setAge(30);

        System.out.println(user01);
        System.out.println(user02);
    }
}

// 实现 Cloneable 接口,该对象可以克隆
class User implements Cloneable {
    private String name;
    private int age;

    public User() {
    }

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "[" + super.toString() + "]" + "{" + "name = " + this.name + ", age = " + this.age + "}";
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        // 调用父类 clone() 方法
        return super.clone();
    }
}

/*
输出结果:
[edu.zhku.test01.User@3f3afe78]{name = 张三, age = 18}
[edu.zhku.test01.User@47f6473]{name = 李四, age = 30}
*/

原来的对象克隆成功后,就会利用已有的对象构建一个全新的对象(此对象与原来的对象的成员属性内容完全相同,但是占有的堆内存空间不同),两个对象彼此之间的操作不会有任何的影响。


4、对象的隐式创建场景

除了上述几种显示地对象创建场景之外,还有一些我们并没有进行手动进行创造对象的隐式场景。

4.1、Class类实例隐式创建

我们都知道JVM虚拟机在加载一个类的时候,也会创建一个类对应的Class实例对象,很明显这一个过程是JVM虚拟机背着我们偷偷干的。

4.2、字符串隐式对象创建

典型的,比如定义一个String类型的字符变量,就可能引起一个新的String对象的创建,如:

String programmer = "Programmer";

再者,较常见的还比如String的**“+”号连接符也会隐式地导致新的String**对象的创建,如:

String str = str1 + str2;

4.3、自动装箱机制

这种例子较多,比如执行如下代码:

Integer programmerAge = 30;

会触发的自动装箱机制就会导致一个新的包装类型的对象在后台被隐式地创建出来。

4.4、函数可变参数

当我们使用可变参数语法int … nums来描述一个函数的形式参数时,如:

public double avg(int ... nums){
    double sum = 0;
    int length = nums.length;
    for(int i = 0; i < length; i++){
        sum += nums[i];
    }
    return sum / length;
}

avg(1, 2, 4);
avg(1, 2, 4, 8);
avg(1, 2, 4, 8, 16);

从表面来看,函数的调用处可以传入各种离散参数参与计算,背后可能会隐式地产生一个对应地数组对象进行计算。


5、反序列化出一个对象

当我们进行对象的序列化和反序列化的过程中,反序列化操作会返回序列化的实例化对象,也是相当于一种“隐式的”对象构造。

由于之前也发表过一篇有关序列化&反序列化的文章,此处便不再详细讲述。


注:此文章只是我在学习过程中做的个人笔记,若有错误,敬请指正。

直流无刷电机FOC控制算法 理论到实践 —— 实践 关于直流无刷电机FOC控制算法的理论章节,本人已经在前两章进行过详细说明,大家可以自行进行阅读,请务必了解过理论之后再来学习如何具体进行实现。直流无刷电机FOC控制算法 理论到实践 —— 理论(一)直流无刷电机FOC控制算法 理论到实践 —— 理论(二)本章节主要讨论采用MCU微控制器如何具体实现直流无刷电机的FOC控制。 阅读详情

相关推荐

逆变器专题(9)-基于dq坐标系的逆变器解耦控制建模与实时仿真分析

本文深入探讨了基于dq坐标系的逆变器解耦控制建模与实时仿真分析。通过生动的比喻和详细的数学推导,阐述了如何通过坐标变换和前馈补偿实现d轴与q轴的独立控制,从而提升系统动态性能与稳定性。文章还介绍了在MATLAB/Simulink中搭建仿真模型、分析动态响应与稳定性的方法,并展望了硬件在环(HIL)实时仿真的高级验证手段,为新能源并网与电机驱动领域的工程师提供了宝贵的实践指南。

gold的博客 547

五种创建Java对象的方法,你知道几种呢?

这个小伙伴自然就非常迅速地说出了new的方式,结果面试官又继续追问还有哪些别的方式,他就支支吾吾半天不知道了。但是大家要注意,使用该方法的前提是,我们必须先让类实现Cloneable接口,并重写Object的clone方法(因为Object中的这个方法是protected的,若不重写,外部也调用不了)。以上就是波哥为小伙伴们介绍的五种创建对象的方法,现在你知道都有哪些创建Java对象的方式了吗?由此我们就可以知道,这个User对象就是从之前的userFile.txt文件中获取到的。

Python专栏 5022

无刷直流电机计算转速

一个霍尔传感器周期(Tms)有两种模式输出方式(3FG/1FG),一个电周期是6个60°电角度,电机磁极数是P,磁极对数PP = P / 2 3FG模式: 1个电周期= 6 * T 1FG模式: 1个电周期= 2 * T 1秒钟电周期个数: 1分钟电周期个数: 1分钟转速: 举例: 假设电机磁极数是8,3FG模式下,霍尔周期700us,计算该条件下转速 ...

meimiaorenshengqq的博客 9671

Java对象的创建

应用:Java 中创建对象的 5 种方式! - SegmentFault 思否1、使用new关键字这是最常见也是最简单的创建对象的方式了。通过这种方式,我们可以调用任意的构造函数(无参的和带参数的)。 Employee emp1 = new Employee(); 0: new           #19          // class org/programm

qq_41134990的博客 2636

【深度解析】信息素养提升实践活动(附:历年获奖作品分析)

全国师生信息素养提升实践活动是由教育部教育技术与资源发展中心(中央电化教育馆)主办,面向全国师生的一项信息化交流展示活动。

m0_74417957的博客 2627

kaggle——信用卡欺诈检测项目实战

笔记第一步:了解题目,确定任务第二步:场景分析第三步:数据预处理看是否有缺失值查看样本类别分布数据不均衡解决办法数据值标准化/归一化第四步:特征工程1)查看特征分布情况,把不同类别下特征分布相差不大的特征删除掉2)特征缩放第五步:模型训练处理不平衡样本交叉验证求取最好的模型参数第六步:模型评估使用下采样数据训练与测试使用下采样数据训练与测试(不同的阈值对结果的影响)使用下采样数据训练,原始数据进行测试原始数据进行K折交叉验证使用原始数据进行训练和测试查看ROC曲线逻辑回归阈值选择过采样总结 第一步:了解题目

weixin_45942265的博客 1万+

Java中创建对象的多种方法

Java反射机制允许在运行时检查和操作类的属性和方法。通过反射,我们可以在运行时创建对象,即使我们不知道类的具体信息。Java中的序列化和反序列化允许我们将对象转换为字节流,并在需要时从字节流中恢复对象。通过反序列化,我们可以创建对象的副本。

xycxycooo的博客 2008

跨模型的 API 调用与集成:使用 Spring AI 构建可移植的 API 代码,支持多个 AI 模型(如 OpenAI、Anthropic 等)的调用

Spring AI 是 Spring 生态系统中的一部分,旨在提供一种简单、可扩展的方式来集成人工智能模型。Spring AI 使得开发者可以使用现有的 Spring 体系结构方便地访问多种 AI 模型和服务,例如 OpenAI、Anthropic、HuggingFace 等。

秋元的博客 2404

Java对象创建过程

java对象创建过程、对象的组成、对象头、实例数据、对齐填充、对象创建方式、new关键字、Class类的newInstance方法、Constructor类的newInstance方法、Object类的clone方法、反序列化、无父类的对象创建、有父类的对象创建......

骑个小蜗牛的博客 3万+

万字长文:YOLOv5+RK3588 NPU多线程加速全攻略——从理论到部署的终极优化

RK3588 NPU多线程加速优化教程摘要 本教程深入讲解了如何利用线程池技术优化RK3588 NPU上的YOLO目标检测模型推理性能。RK3588内置3个NPU核心,理论算力达6TOPS,为多线程优化提供了硬件基础。教程详细解析了线程池的核心组件(任务队列、工作线程、同步机制)和实现架构,包括类设计、初始化流程、工作线程逻辑(任务获取、NPU推理、结果存储三个阶段)以及任务提交/获取机制。通过预分配模型实例、线程绑定、流量控制等优化手段,实现了从单线程28FPS到多线程120FPS的显著性能提升,为边缘A

LXY_LOVE36的博客 1101

硬件学习手册【总目录】

欢迎大家来到《硬件学习手册》,专栏主要包括 《硬件经验手册》《电子元器件器件手册》《PCB手册》《CPU手册》《元器件选型手册》五个分册。在开始专栏的更新前,博主先列出专栏的大纲,以供大家参考。大家直接点击大纲中的蓝色标题即可轻松传送。

fydar的博客 5850

java创建对象的五种方式

5、使用反序列化(ObjectInputStream)的readObject()方法: try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILE_NAME))) { ObjectName obj = ois.readObject();2、使用反射的Class类的newInstance()方法: ObjectName obj = ObjectName.class.newInstance();

ngczx的博客 2411

xilinx原语及bank简介

图8是HP bank与HR bank的IO模块,其中PAD是FPGA的金属管脚,IOB是输入、输出引脚的控制模块。此时使用原语就可以只调用需要的组件,不需要去考虑其余组件参数设置,就方便很多,借助此次机会就对IDDR、ODDR、IDELAYE2、ODELAYE2、IDELAYCRTL、ISERDESE、OSERDESE等几个原语做了简要了解,并对原语的各个模式进行了仿真,本文最初是介绍IDDR的,但在介绍IDDR这些原语之前,还需要了解一下7系列FPGA bank的分类和区别,所以就有了本文。

qq_43416206的博客 412

spring创建对象的三种方式

我们紧接着上一篇博文https://blog.youkuaiyun.com/liuying1802028915/article/details/90344742 来研究spring创建对象的方式都有哪几种, 答案是一共有三种: 1.使用构造方式创建对象 2.使用静态工厂方法创建对象 3.使用实例工厂方法创建对象 接下来我们一一来讲解一下: 1.使用构造方法创建对象 我们上一篇写spr...

liuying1802028915的博客 2902

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Spring创建对象的几种方式

1.Spring中创建对象的方式 1.1使用无参构造创建对象(默认) spring中默认使用无参构造函数, package com.wshy.pojo; /** * @title: Hello * @Author: wshy */ public class Hello { private String str; public Hello(){ System.out.println ("spring无参构造函数!"); } public String

排长性感的小屁屁 2401

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java 创建对象的几种方式

我们总是讨论没有对象就去new一个对象,创建对象的方式在我这里变成了根深蒂固的new方式创建,但是其实创建对象的方式还是有很多种的,不单单有new方式创建对象,还有使用反射机制创建对象,使用clone方法去创建对象,通过序列化和反序列化的方式去创建对象。这里就总结一下创建对象的几种方式,来好好学习一下java创建对象的方式。一、使用new关键字这是我们最常见的也是最简单的创建对象的方式,通过这种方式

小小布的程序世界 2万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

javascipt创建对象的几种方式

javascript创建对象加单的说,无非就是使用内置对象的各种自定义对象,当然还可以用json,但是写法很多种,也能混合使用。 1.对象字面量的方式 person={firstmae:“mark”,lastname:“yun”,age:25,eyecolor:“black”}; 2.用function来模拟无参的构造函数 function person(){} var person=new pe...

weixin_45259914的博客 275

js创建对象的几种方式

js常用的几种创建对象的方式有: {} new Object() 使用字面量 工厂模式 构造函数模式(constructor) 原型模式(prototype) 构造函数+原型模式 还有一些不常用的方式,如动态原型,寄生构造函数,稳妥构造函数。 一、通过{}创建对象 demo1: 01.newObj-1.html <script> 'use strict'; //使用strict模式 /** 使用{}创建对象,等同于 new Object();

qq_41648408的博客 6226

Javascript——创建对象的三种方式

创建对象的三种方式 1.调用系统的构造函数创建对象 2.自定义构造函数创建对象(结合第一种和需求通过工厂模式创建对象) 3.字面量的方式创建对象 第一种方式: 实例化对象 var obj=new Object(); 对象有特征——属性和行为——方法 添加属性:对象.名字=值; obj.name="老王"; obj.age=30; obj.sex="男"; 添加方法:...

mintsolace的博客 370

【JavaScript】创建对象的方式详解

对象是一组键值对(key-value pair)的集合,其中键是字符串(ES6 之后也可以是 Symbol),值可以是任何数据类型,包括字符串、数字、数组、函数,甚至是另一个对象。对象是 JavaScript 处理数据的核心结构,可以看作是键值存储的容器。// 输出: Hello, my name is Alice`);// 输出: Hello, my name is Alice在这个例子中,personnameage和greet,其中greet。

lph159的博客 1053

Java创建对象的5种方式

这是最基本也是最常见的创建对象方式,通过调用类的构造函数来实例化对象。工厂模式是一种设计模式,通过工厂类来创建对象,隐藏对象创建的具体细节。因此,原始对象和克隆对象中的引用字段(引用类型属性也会被克隆,原始对象和克隆对象不共享引用类型实例。对象,它包含了类的所有元信息(构造函数、方法、字段等)。下面是一个简单的支付系统,支持支付宝和微信支付两种方式。引用类型属性在原始对象和克隆对象之间共享。(如果是基本类型),原始对象不会受影响。去访问,看到的都是同一个已经被修改了的。:先进行默认的浅拷贝,创建一个新的。

m0_74230209的博客 2936

Java中创建对象的方式

1 问题作为Java开发者,经常创建很多对象,你是否知道Java中创建对象有哪些方式呢?2 方法(1)new关键字使用new关键字创建对象,是最常见也是最简单的创建对象的方式。(2)Class.newInstanceClass类的Class.newInstance使用的是类的public的无参数构造方法。(3)Constructor.newInstance我们可以通过这个newInstance方法...

算法与编程之美 751

创建对象的方式有哪些

var person1 = new Person('张三', 30);var person2 = new Person('李四', 25);‌:工厂函数可以批量创建对象,通过函数返回一个包含所有必要属性和方法的新对象。‌:通过构造函数可以创建多个具有相同属性和方法的对象实例。var person1 = createPerson('赵六')‌:这是创建对象的最简单、最快的方法。中定义属性和方法,可以直接创建一个对象。创建一个空对象,然后为其添加属性和方法。obj.name = "王五";

lihaiting1的博客 452

Java创建对象有几种方式?

Java创建对象有几种方式?

java1234的博客 938

创建对象的七种方式

  Python语言提供了多种创建对象的方式,这里列出其中方式,比如下面有一个类: class Bar: def __init__(self,x): print(x) self.x=x 方式一:   传统方式构建,将类对象当成构造器使用 b1=Bar(4) 方式二:   把类名当成参数,使用eval()函数 b2=...

weixin_30802171的博客 128

JavaScript创建对象的几种方式

目录前言创建对象方法一·对象字面量的方式二·用function模拟无参的构造函数三·用function来模拟参构造函数来实现四·工厂方式(内置对象)五·原型六·混合方式 前言 JavaScript创建对象的方式有很多,但无非就是使用内置对象或各种内置对象或各种自定义对象,也可以用JSON;写法有很多种,也能混合使用。下面来一一展示。不做叙述,全靠意会。 创建对象方法 一·对象字面量的方式 pers...

liujiebahuang的博客 199
上一篇: 正则表达式(含范例)
下一篇: 还搞不清楚浅拷贝和深拷贝??那就点进来
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

窝在角落里学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值