Java Core - 创建对象的两种方式
一、通过new关键字创建对象
Hello hello = null; // 声明一个引用
hello = new Hello(); // 创建对象
以上两行代码相当于 Hello hello = new Hello();
这行代码实际上包含了四个动作:
1.new Hello指的是以Hello类为模板在堆中创建一个Hello对象。类实际上就是一个模板。
2.()指的是创建完对象后,调用该类的构造函数,对刚创建好的对象进行初始化。注意,new 是一个关键字。
3.Hello hello 指的是创建一个hello类型的引用,JVM为该引用在栈里分配了空间。
4. = 操作符表示把引用指向创建好的对象,也就是将对象的地址传给了左边的引用。
注意:很多教程中,将‘=’解释成赋值,而它实际上是一个传地址的过程。引用里存储的并不是对象本身,而是对象的地址。
这种方式的缺点:需要在当前类导入该对象对应的类,提高了代码的耦合度。
创建对象时,引用和对象的关系在JVM内存中关系如下:

参考文献:https://www.cnblogs.com/focusChen/articles/2497768.html
二、通过反射机制创建对象
在学习反射机制之前先了解Class类。Class类封装了一个对象或者接口运行时的状态,当一个类被装载时,该类的Class类的对象自动创建。它记录了有哪些对象是通过当前类创建。一个Class类只能创建一个对象。
1.Class类也是一个类,它的名字与class关键字很相似,但不是同一个东西。
2.Class类的对象内容是你创建的类的类型信息,比如你创建了一个Apple类,那么JVM会自动创建一个Apple类的Class类的对象。
3.Class类的对象不能用new的方式创建,它只能由JVM创建,因为Class类的构造方法是私有的。
4.Class类的作用是运行时提供或者获得某个对象的类型信息,这些信息可以用于反射。
假设现在有一个Apple类,那么获取Apple类的Class类的对象的方法:
1.用Class类的forName()函数
Class obj = Class.forName("Apple"); # obj为Apple类的Class类的对象
2.使用对象的getClass()函数
Apple apple = new Apple(); # apple为Apple对象的引用
Class obj = apple.getClass(); # obj为Apple类的Clas类的对象的引用
3.使用类字面量常量
Class obj = Apple.class; # obj为Apple类的Class类的对象的引用
获取到Apple类的Class类的对象有什么用呢?
答:通过Apple类的Class对象可以创建Apple类的一个对象,这种创建对象的方式叫做反射。
Hello hello = Hello.class.newInstance();
Hello hello = (Hello) Class.forName("Hello").newInstance();
// 若forName()的参数对应的类不存在则会抛出ClassNotFound的错误
以上两行代码都能通过Hellol类的Class类的对象的newInstance()方法来创建Hello类的对象。
有网友说,调用newInstanc()方法的前提是Hello类中必须有无参构造方法,否则会抛出java.lang.InstaniationException的错误,
对此我表示怀疑,因为在编码者没有在类中编写无参构造函数时,JVM也会自动生成一个无参构造函数。随后并删掉了Hello类的
无参函数,重新执行,没有抛出错误。第二次验证:我的怀疑是正确的。
通过new关键字和newInstance()分别创建对象的区别是:
前者在创建对象时,类可以是没有被加载的情况,而在调用newInstance()方法前,该类必须已经被加载。
当然我们还需要理解Class.forName()函数:
该函数返回的是一个类的Class类的对象,它的作用是要求JVM查找并加载指定的类,在加载过程中会执行该类的静态代码块。
关于类的加载原理参考:https://cloud.tencent.com/developer/article/1018594
newInstance()是实现IOC、反射、面对接口编程 和 依赖倒置 等技术方法的必然选择,new 只能实现具体类的实例化,不适合于接口编程。
Java Core - 创建对象的两种方式的更多相关文章
- Java反射获取class对象的三种方式,反射创建对象的两种方式
Java反射获取class对象的三种方式,反射创建对象的两种方式 1.获取Class对象 在 Java API 中,提供了获取 Class 类对象的三种方法: 第一种,使用 Class.forName ...
- Java中创建对象的几种方式
Java中创建对象的五种方式: 作为java开发者,我们每天创建很多对象,但是我们通常使用依赖注入的方式管理系统,比如:Spring去创建对象,然而这里有很多创建对象的方法:使用New关键字.使用Cl ...
- Java中创建对象的五种方式
我们总是讨论没有对象就去new一个对象,创建对象的方式在我这里变成了根深蒂固的new方式创建,但是其实创建对象的方式还是有很多种的,不单单有new方式创建对象,还有使用反射机制创建对象,使用clone ...
- 【转】Java中创建对象的5种方式
Java中创建对象的5种方式 作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有 ...
- C++创建对象的两种方式
C++创建对象有两种方式,在栈上创建对象(Objects on the Stack)和在堆上创建对象(Objects on the Heap). 假设我们有以下的类: #include <str ...
- 对Java代码加密的两种方式,防止反编译
使用Virbox Protector对Java项目加密有两种方式,一种是对War包加密,一种是对Jar包加密.Virbox Protector支持这两种文件格式加密,可以加密用于解析class文件的j ...
- Java新建线程的两种方式
Java新建线程有两种方式,一种是通过继承Thread类,一种是实现Runnable接口,下面是新建线程的两种方式. 我们假设有个竞赛,有一个选手A做俯卧撑,一个选手B做仰卧起坐.分别为两个线程: p ...
- Java实现多线程的两种方式
实现多线程的两种方式: 方式1: 继承Thread类 A: 自定义MyThread类继承Thread类 B: 在MyThread类中重写run() C: 创建MyThread类的对象 D: 启动线程对 ...
- [Java] HashMap遍历的两种方式
Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml第一种: Map map = new HashMap( ...
随机推荐
- python opencv SIFT,获取特征点的坐标位置
备注:SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向.SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点.边缘点.暗区的亮点及 ...
- layui中radio的动态加载(进入修改页面时,设置radio)
动态设置 radio 的值让它处于选中状态 效果图 : 前端代码: <div class="layui-form-item"> <label class=& ...
- June 3. 2018 Week 23rd Sunday
You only get one shot; do not miss your chance to blow. 机会只有一次,不要错过. From Eminem, "Lose Yoursel ...
- ES5-ES6-ES7_数值的扩展
二进制与八进制数值表示法: 二进制用0b, 八进制用0o console.log(0b1010) console.log(0o56) Number.isFinite(i) 判断是否是有限大的数 con ...
- python脚本后台启动
nohup python -u test.py > out.log 2>&1 & nohup python -u 文件路径 > 打印日志 2>&1 &a ...
- BFC原理剖析
本文讲了BFC的概念是什么: BFC的约束规则:咋样才能触发生成新的BFC:BFC在布局中的应用:防止margin重叠(塌陷,以最大的为准): 清除内部浮动:自适应两(多)栏布局. 1. BFC是什么 ...
- [JXOI2018]守卫
嘟嘟嘟 正如某题解所说,这题很有误导性:我就一直在想凸包. 随便一个数据,就能把凸包hack掉: 这样我们的点G就gg了. 所以正解是什么呢?dp. 题解看这位老哥的吧,我感觉挺好懂的:题解 P456 ...
- java通过百度AI开发平台提取身份证图片中的文字信息
废话不多说,直接上代码... IdCardDemo.java package com.wulss.baidubce; import java.io.BufferedReader; import jav ...
- ORA-16433 The database must be opened in read write mode故障解决
转 一.首先删除原有控制文件并新建控制文件 1.找到控制文件位置 SQL> show parameter control_files; NAME TYPE VALUE ------------- ...
- python中如何对待易过期的cookies
有时候,我们进行爬虫操作是,会使用reques的的post函数携带cookies访问目标网站已达到登录或者其他 目的,笔者最近就遇到了这样的案例,周六写好的代码,周一过来就不行了,重新登录访问目标网页 ...