对象是对类的实例化。对象具有状态和行为,变量用来表明对象的状态,方法表明对象所具有的行为。Java 对象的生命周期包括创建、使用和清除,本文详细介绍对象的创建,在 Java 语言中创建对象分显式创建与隐含创建两种情况。

显式创建对象

对象的显式创建方式有 4 种。

1. 使用 new 关键字创建对象

这是常用的创建对象的方法,语法格式如下:

类名 对象名 = new 类名();

2. 调用 java.lang.Class 或者 java.lang.reflect.Constuctor 类的 newlnstance() 实例方法

在 Java 中,可以使用 java.lang.Class 或者 java.lang.reflect.Constuctor 类的 newlnstance() 实例方法来创建对象,代码格式如下:

java.lang.Class Class 类对象名称 = java.lang.Class.forName(要实例化的类全称);
类名 对象名 = (类名)Class类对象名称.newInstance();

调用 java.lang.Class 类中的 forName() 方法时,需要将要实例化的类的全称(比如 com.mxl.package.Student)作为参数传递过去,然后再调用 java.lang.Class 类对象的 newInstance() 方法创建对象。

3. 调用对象的 clone() 方法

该方法不常用,使用该方法创建对象时,要实例化的类必须继承 java.lang.Cloneable 接口。 调用对象的 clone() 方法创建对象的语法格式如下:

类名对象名 = (类名)已创建好的类对象名.clone();

4. 调用 java.io.ObjectlnputStream 对象的 readObject() 方法

例 1
下面创建一个示例演示常用的前三种对象创建方法。示例代码如下:

public class Student implements Cloneable {   // 实现 Cloneable 接口private String Name;    // 学生名字private int age;    // 学生年龄public Student(String name,int age) {    // 构造方法this.Name = name;this.age = age;}public Student() {this.Name = "name";this.age = 0;}public String toString() {return"学生名字:"+Name+",年龄:"+age;}public static void main(String[] args)throws Exception {System.out.println("---------使用 new 关键字创建对象---------");// 使用new关键字创建对象Student student1 = new Student("小刘",22);System.out.println(student1);System.out.println("-----------调用 java.lang.Class 的 newInstance() 方法创建对象-----------");// 调用 java.lang.Class 的 newInstance() 方法创建对象Class c1 = Class.forName("Student");Student student2 = (Student)c1.newInstance();System.out.println(student2);System.out.println("-------------------调用对象的 clone() 方法创建对象----------");// 调用对象的 clone() 方法创建对象Student student3 = (Student)student2.clone();System.out.println(student3);}
}

对上述示例的说明如下:

  • 使用 new 关键字或 Class 对象的 newInstance() 方法创建对象时,都会调用类的构造方法。
  • 使用 Class 类的 newInstance() 方法创建对象时,会调用类的默认构造方法,即无参构造方法。
  • 使用 Object 类的 clone()方法创建对象时,不会调用类的构造方法,它会创建一个复制的对象,这个对象和原来的对象具有不同的内存地址,但它们的属性值相同。
  • 如果类没有实现 Cloneable 接口,则 clone。方法会抛出
    java.lang.CloneNotSupportedException 异常,所以应该让类实现 Cloneable 接口。

程序执行结果如下:

---------使用 new 关键字创建对象---------
学生名字:小刘,年龄:22
-----------调用 java.lang.Class 的 newInstance() 方法创建对象-----------
学生名字:name,年龄:0
-------------------调用对象的done()方法创建对象----------
学生名字:name,年龄:0

隐含创建对象

除了显式创建对象以外,在 Java 程序中还可以隐含地创建对象,例如下面几种情况。

1)String strName = “strValue”,其中的“strValue”就是一个 String 对象,由 Java 虚拟机隐含地创建。

2)字符串的“+”运算符运算的结果为一个新的 String 对象,示例如下:

String str1 = "Hello";
String str2 = "Java";
String str3 = str1+str2;    // str3引用一个新的String对象

3)当 Java 虚拟机加载一个类时,会隐含地创建描述这个类的 Class 实例。

提示:类的加载是指把类的 .class 文件中的二进制数据读入内存中,把它存放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class 对象,用来封装类在方法区内的数据结构。

无论釆用哪种方式创建对象,Java 虚拟机在创建一个对象时都包含以下步骤:

  • 给对象分配内存。
  • 将对象的实例变量自动初始化为其变量类型的默认值。
  • 初始化对象,给实例变量赋予正确的初始值。

注意:每个对象都是相互独立的,在内存中占有独立的内存地址,并且每个对象都具有自己的生命周期,当一个对象的生命周期结束时,对象就变成了垃圾,由 Java 虚拟机自带的垃圾回收机制处理。

1.7 Java创建对象详解(显式创建和隐含创建)相关推荐

  1. Java创建对象详解

    对象是对类的实例化.对象具有状态和行为,变量用来表明对象的状态,方法表明对象所具有的行为.Java 对象的生命周期包括创建.使用和清除, Java 语言中创建对象分显式创建与隐含创建两种情况. 显式创 ...

  2. Java创建对象详解:Java创建对象的几种方法

    对象是对类的实例化.对象具有状态和行为,变量用来表明对象的状态,方法表明对象所具有的行为.Java 对象的生命周期包括创建.使用和清除,本文详细介绍对象的创建,在 Java 语言中创建对象分显式创建与 ...

  3. java condition详解_Java使用Condition控制线程通信的方法实例详解

    Java使用Condition控制线程通信的方法实例详解 发布于 2020-4-20| 复制链接 摘记: 本文实例讲述了Java使用Condition控制线程通信的方法.分享给大家供大家参考,具体如下 ...

  4. Java泛型详解-史上讲解最详细的,没有之一

    目录 1. 概述 2. 一个栗子 3. 特性 4. 泛型的使用 4.1 泛型类 4.2 泛型接口 4.3 泛型通配符 4.4 泛型方法 4.4.1 泛型方法的基本用法 4.4.2 类中的泛型方法 4. ...

  5. Java虚拟机详解----JVM常见问题总结

    [正文] 声明:本文只是做一个总结,有关jvm的详细知识可以参考本人之前的系列文章,尤其是那篇:Java虚拟机详解04----GC算法和种类.那篇文章和本文是面试时的重点. 面试必问关键词:JVM垃圾 ...

  6. java 泛型详解、Java中的泛型方法、 java泛型详解

    本文参考java 泛型详解.Java中的泛型方法. java泛型详解 概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用. 什么是泛型?为什么要使用泛型? 泛型,即& ...

  7. 最详细的java泛型详解

    来源:最详细的java泛型详解 对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下. 本文参考java 泛型详解.Java中的泛型方法. ja ...

  8. Java异常详解及如何处理

    来源:Java异常详解及如何处理 简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?或者用C语言 ...

  9. flask与js交互的示例代码_Frida Java Hook 详解(安卓9):代码及示例(上)

    Frida Java Hook 详解(安卓9):代码及示例(上) 前言 1.1 FRIDA SCRIPT的"hello world" 1.1.1 "hello world ...

最新文章

  1. iOS架构-静态库.framework之资源文件打包bundle(6)
  2. 第18条:接口优于抽象类
  3. 【PC工具】github项目辅助下载工具,github高速下载
  4. 如何查他人【思科CCIE证书真伪、有效期】
  5. SAP最佳业务实践:重复制造(149)-4发料
  6. 关于高级导数的一个不等式估计
  7. BZOJ 3456: 城市规划(dp+多项式求逆)
  8. 安装redis3.2.4集群时出现的一些坑
  9. User breakpoint called from code at 0x771064f4
  10. mfc编程淘汰了吗_四种基本的编程命名规范(匈牙利命名法、驼峰式命名法、帕斯卡命名法、下划线命名法)...
  11. IMAXB6充电器使用教程
  12. 小红伞杀毒软件|小红伞杀毒软件下载
  13. 2017年电子设计大赛(B题 滚球控制系统)赛后总结
  14. can总线程序讲解_汽车can总线工作原理及测量方法详解
  15. 苏宁金科CTO肖军:如何让1000人+的团队持续打胜仗,从找人,到育人,到用人具体怎么做?...
  16. 爬虫-漫画喵的100行逆袭
  17. 简述linux的系统组成,简述Linux系统结构
  18. 【深入浅出指南:JVM知多少】一、JVM内存模型
  19. C# 和MsComm
  20. js apply call bind

热门文章

  1. Java基础学习-Collection体系结构和迭代测试
  2. Python3-笔记-E-001-库-随机数random
  3. [LintCode] Trailing Zeroes 末尾零的个数
  4. linux下的动态链接库和静态链接库到底是个什么鬼?(一)静态链接库的编译与使用...
  5. wcf 远程终结点已终止该序列 可靠会话出错
  6. 【软件工程】UML软件
  7. java常用类解析十:Date类和Calendar类示例
  8. ASP.NET 导出EXCEL
  9. C++ Primer 5th笔记(3)字符串、向量和数组:数组
  10. 机器学习(一)——熟悉tensorflow2.0