一、通过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 - 创建对象的两种方式的更多相关文章

  1. Java反射获取class对象的三种方式,反射创建对象的两种方式

    Java反射获取class对象的三种方式,反射创建对象的两种方式 1.获取Class对象 在 Java API 中,提供了获取 Class 类对象的三种方法: 第一种,使用 Class.forName ...

  2. Java中创建对象的几种方式

    Java中创建对象的五种方式: 作为java开发者,我们每天创建很多对象,但是我们通常使用依赖注入的方式管理系统,比如:Spring去创建对象,然而这里有很多创建对象的方法:使用New关键字.使用Cl ...

  3. Java中创建对象的五种方式

    我们总是讨论没有对象就去new一个对象,创建对象的方式在我这里变成了根深蒂固的new方式创建,但是其实创建对象的方式还是有很多种的,不单单有new方式创建对象,还有使用反射机制创建对象,使用clone ...

  4. 【转】Java中创建对象的5种方式

    Java中创建对象的5种方式   作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有 ...

  5. C++创建对象的两种方式

    C++创建对象有两种方式,在栈上创建对象(Objects on the Stack)和在堆上创建对象(Objects on the Heap). 假设我们有以下的类: #include <str ...

  6. 对Java代码加密的两种方式,防止反编译

    使用Virbox Protector对Java项目加密有两种方式,一种是对War包加密,一种是对Jar包加密.Virbox Protector支持这两种文件格式加密,可以加密用于解析class文件的j ...

  7. Java新建线程的两种方式

    Java新建线程有两种方式,一种是通过继承Thread类,一种是实现Runnable接口,下面是新建线程的两种方式. 我们假设有个竞赛,有一个选手A做俯卧撑,一个选手B做仰卧起坐.分别为两个线程: p ...

  8. Java实现多线程的两种方式

    实现多线程的两种方式: 方式1: 继承Thread类 A: 自定义MyThread类继承Thread类 B: 在MyThread类中重写run() C: 创建MyThread类的对象 D: 启动线程对 ...

  9. [Java] HashMap遍历的两种方式

    Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml第一种: Map map = new HashMap( ...

随机推荐

  1. June 11. 2018 Week 24th, Monday

    Love is the beauty of the soul. 爱是灵魂之美. From Saint Augustine. The complete version of this quote goe ...

  2. python入门练习题

    1.使用while循环输入 1 2 3 4 5 6     8 9 10 num = 1 while num<=10: if num ==7: num += 1 continue print(n ...

  3. influxdb问题解决

    一.influxdb启动不了? 清空数据文件夹: cd /var/lib/influxdb/data rm -rf * 清除完就可以启动了,然后查看/var/lib/influxdb下data和met ...

  4. 1.02-get-params

    import urllib.request import urllib.parse import string def get_method_params(): url = "http:// ...

  5. 数据库事务的四大特性以及事务的隔离级别-与-Spring事务传播机制&隔离级别

    数据库事务的四大特性以及事务的隔离级别   本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ ...

  6. redis的过期时间和过期删除机制

    一:设置过期时间 redis有四种命令可以用于设置键的生存时间和过期时间: EXPIRE <KEY> <TTL> : 将键的生存时间设为 ttl 秒 PEXPIRE <K ...

  7. VMware15安装MAC(MAC OS 10.13)(OS X 10.14)原版可升级最新可解锁macOS Unlocker3.0(OS X 10.13)

      目录树 1.1.2安装环境: 1.1.3所需资源: 1.1.4 Unlocker 3.0解锁 1.1.5 配置环境 1.1.6开始安装 1.1.7开启虚拟机进入MAC安装界面 1.1.8 macO ...

  8. [BJOI2015]树的同构

    嘟嘟嘟 判断树的同构的方法就是树上哈希. 如果树是一棵有根树,那么只要从根节点出发dfs,每一个节点的哈希值等于按传统方式算出来的子树的哈希值的结果.需要注意的是,算完子树的哈希值后要先排序再加起来, ...

  9. 转载:遇到BITMAP CONVERSION TO ROWIDS 后解决与思考

    今天遇到一个案例,有点价值写下来,以后多看看 SQL: select t.order_id, t.spec_name, t.staff_code, t.staff_code as xxbStaffCo ...

  10. 初学Python——函数

    一.函数定义 def name( parameters): #没有参数括号内可以为空 "函数描述" #其实就是注释 <代码块> return [expression] ...