面试官:在 Java 中 new 一个对象的流程是怎样的?彻底被问懵了。。(2)

简介: 面试官:在 Java 中 new 一个对象的流程是怎样的?彻底被问懵了。。

首先搞清楚 newInstance 两种方法区别:


Class.newInstance()只能够调用无参的构造函数,即默认的构造函数,我们在Class源码里也看到了其实最终还是调用了无参构造器对象 Constructor 的 newInstance 方法,举个栗子:Dog.class 中是没有无参构造方法,那么会直接抛出 InstantiationException 异常:


//Dog类中只有一个dog_name的有参构造方法
Class c = Class.forName("com.service.ClassAnalysis.Dog");
Dog dog = (Dog) c.newInstance();//直接抛InstantiationException异常


image.png



Constructor.newInstance()可以根据传入的参数,调用任意构造构造函数,也可以反射私有构造器(了解就行)


//Dog类中只有一个dog_name的有参构造方法

Constructor cs = Dog.class.getConstructor(String.class);

Dog dog = (Dog) cs.newInstance("小黑");//执行没有问题



但是这里面的 newInstance跟我们这次要说的 new 方法存在区别,两者创建对象的方式不同,创建条件也不同:


使用 newInstance 时必须要保证这类已经加载并且已经建立连接,就是已经被类记载器加载完毕,而 new 不需要

class对象的 newInstance 方法只能用无参构造,上面已经提到了,而 new 不需要

前者使用的是类加载机制,是一种方法,后者是创建一个新类,一种关键字

这个不能说newInstance 不方便,相反它在反射、工厂设计模式、代理中发挥了重要作用,后续我也会写下代理和反射,因为理解起来确实有点绕。还有一点需要注意,不管以哪种方式创建对象,对应的Class对象都是同一个


Dog dog1 = new Dog("旺财");
Dog dog2 = new Dog("小黑");
Class c = Class.forName("com.service.classload.Dog");//为了测试,加了无参构造
Dog dog3 = (Dog) c.newInstance();
System.out.println(dog1.getClass() == dog2.getClass());
System.out.println(dog1.getClass() == dog3.getClass());

image.png




连接和初始化

在此阶段首先为静态static变量内存中分配存储空间,设立初始值(还未被初始化)比如:


public static int i = 666;//被类加载器加载到内存时会执行,赋予一个初始值

public static Integer ii = new Integer(666);//也被赋值一个初始值


但请注意,实际上i 的初始值是0,不是666,其他基本数据类型比如boolean的初始值就是false,以此类推。如果是引用类型的成员变量 ii 那么初始值就是null。


Dog dog = new Dog("旺财");//在这里打个断点

执行,首先会执行静态成员变量初始化,默认值是0:


image.png


但有例外,如果加上了 final 修饰词那么初始值就是设定的值。


image.png


接着对已经分配存储空间的静态变量真正赋值,比如为上面的dog_max_age 赋值16,还有执行静态代码块,也就是类似下面的代码:


static {

   System.out.println("狗狗的静态代码块");

}



到这为止,类的加载过程才算完成。


创建实例

在加载类完毕后,对象的所需大小根据类信息就可以确认了,具体创建的步骤如下:


先给对象分配内存(包括本类和父类的所有实例变量,不包括上面的静态变量),并设置默认值,如果有引用对象那么会在栈内存中申请一个空间用来指向的实际对象。

执行初始化代码实例化,先初始化父类再初始化子类,赋予给定值(尊重长辈是java的传统美德)

对象实例化完毕后如果存在引用对象的话还需要把第一步的栈对象指向到堆内存中的实际对象,这样一个真正可用的对象才被创建出来。

说了这么多估计很多人都没概念,懵逼状态中,其实很简单,我们只要记住new的创建对象就两步:初始化和实例化,再给你们搞一张图:可以简单理解②③④为初始化⑤实例化(可恶,我这该死的责任感!)


image.png


本文不指望你能使劲弄懂java虚拟机底层加载创建对象的过程(其实有些步骤我都懒得讲了,因为说出来也都非常理论化,没多大意思),是想让你知道对象的诞生过程有哪几个重要概念参与了,弄懂这些概念比起单单知道对象创建的过程有意义的多:


类加载器,可以找找网上的资料,蛮多的,这块内容做个了解就行

Class类和Class对象的概念,请重点掌握,不然理解反射和动态代理很费劲,spring的源码也会难以理解

栈内存和堆内存以及对应的基本类型和引用类型,也很重要,争取能基本理解

来源:blog.csdn.net/qq_16887951/article/details/115872678



相关文章
|
3月前
|
Java 测试技术 微服务
最新技术栈下 Java 面试高频技术点实操指南详解
本指南结合最新Java技术趋势,涵盖微服务(Spring Cloud Alibaba)、响应式编程(Spring WebFlux)、容器化部署(Docker+Kubernetes)、函数式编程、性能优化及测试等核心领域。通过具体实现步骤与示例代码,深入讲解服务注册发现、配置中心、熔断限流、响应式数据库访问、JVM调优等内容。适合备战Java面试,提升实操能力,助力技术进阶。资源链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)
155 25
|
3月前
|
缓存 Java 关系型数据库
2025 年最新华为 Java 面试题及答案,全方位打造面试宝典
Java面试高频考点与实践指南(150字摘要) 本文系统梳理了Java面试核心考点,包括Java基础(数据类型、面向对象特性、常用类使用)、并发编程(线程机制、锁原理、并发容器)、JVM(内存模型、GC算法、类加载机制)、Spring框架(IoC/AOP、Bean生命周期、事务管理)、数据库(MySQL引擎、事务隔离、索引优化)及分布式(CAP理论、ID生成、Redis缓存)。同时提供华为级实战代码,涵盖Spring Cloud Alibaba微服务、Sentinel限流、Seata分布式事务,以及完整的D
158 1
|
2月前
|
缓存 Java API
Java 面试实操指南与最新技术结合的实战攻略
本指南涵盖Java 17+新特性、Spring Boot 3微服务、响应式编程、容器化部署与数据缓存实操,结合代码案例解析高频面试技术点,助你掌握最新Java技术栈,提升实战能力,轻松应对Java中高级岗位面试。
301 0
|
3月前
|
存储 安全 Java
常见 JAVA 集合面试题整理 自用版持续更新
这是一份详尽的Java集合面试题总结,涵盖ArrayList与LinkedList、HashMap与HashTable、HashSet与TreeSet的区别,以及ConcurrentHashMap的实现原理。内容从底层数据结构、性能特点到应用场景逐一剖析,并提供代码示例便于理解。此外,还介绍了如何遍历HashMap和HashTable。无论是初学者还是进阶开发者,都能从中受益。代码资源可从[链接](https://pan.quark.cn/s/14fcf913bae6)获取。
176 3
|
3月前
|
存储 安全 Java
2025 最新史上最全 Java 面试题独家整理带详细答案及解析
本文从Java基础、面向对象、多线程与并发等方面详细解析常见面试题及答案,并结合实际应用帮助理解。内容涵盖基本数据类型、自动装箱拆箱、String类区别,面向对象三大特性(封装、继承、多态),线程创建与安全问题解决方法,以及集合框架如ArrayList与LinkedList的对比和HashMap工作原理。适合准备面试或深入学习Java的开发者参考。附代码获取链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
689 48
|
3月前
|
算法 架构师 Java
Java 开发岗及 java 架构师百度校招历年经典面试题汇总
以下是百度校招Java岗位面试题精选摘要(150字): Java开发岗重点关注集合类、并发和系统设计。HashMap线程安全可通过Collections.synchronizedMap()或ConcurrentHashMap实现,后者采用分段锁提升并发性能。负载均衡算法包括轮询、加权轮询和最少连接数,一致性哈希可均匀分布请求。Redis持久化有RDB(快照恢复快)和AOF(日志更安全)两种方式。架构师岗涉及JMM内存模型、happens-before原则和无锁数据结构(基于CAS)。
89 5
|
3月前
|
Java API 微服务
2025 年 Java 校招面试全攻略:从面试心得看 Java 岗位求职技巧
《2025年Java校招最新技术要点与实操指南》 本文梳理了2025年Java校招的核心技术栈,并提供了可直接运行的代码实例。重点技术包括: Java 17+新特性(Record类、Sealed类等) Spring Boot 3+WebFlux响应式编程 微服务架构与Spring Cloud组件 Docker容器化部署 Redis缓存集成 OpenAI API调用 通过实际代码演示了如何应用这些技术,如Java 17的Record类简化POJO、WebFlux构建响应式API、Docker容器化部署。
114 5
|
3月前
|
缓存 NoSQL Java
Java Redis 面试题集锦 常见高频面试题目及解析
本文总结了Redis在Java中的核心面试题,包括数据类型操作、单线程高性能原理、键过期策略及分布式锁实现等关键内容。通过Jedis代码示例展示了String、List等数据类型的操作方法,讲解了惰性删除和定期删除相结合的过期策略,并提供了Spring Boot配置Redis过期时间的方案。文章还探讨了缓存穿透、雪崩等问题解决方案,以及基于Redis的分布式锁实现,帮助开发者全面掌握Redis在Java应用中的实践要点。
153 6
|
3月前
|
安全 Java API
2025 年 Java 校招面试常见问题及详细答案汇总
本资料涵盖Java校招常见面试题,包括Java基础、并发编程、JVM、Spring框架、分布式与微服务等核心知识点,并提供详细解析与实操代码,助力2025校招备战。
146 1
|
3月前
|
算法 Java 微服务
2025 年 Java 面试宝典社招春招秋招实操全方位攻略
2025年Java面试宝典涵盖核心技术及最新趋势,分为四大板块:1. Java基础:深入数据类型、多态等特性,结合学生信息管理等实例;2. JVM核心:解析内存模型与GC算法,附多线程转账等场景应用;3. 高并发方案:详解synchronized与线程池配置,提供Web服务器优化案例;4. Spring生态:剖析IoC/AOP原理,演示微服务架构实现。特别新增Java 17+特性实操,包括Record类、密封接口等语法糖,整合Spring Boot 3、响应式编程及云原生技术,通过订单状态机、API网关配置。
205 1