我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java创建对象之显示创建与隐式创建

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java创建对象之显示创建与隐式创建

一. 对象简介

1. 概念

在之前的文章中,其实已经给大家解释过对象的概念了。在面向对象的编程规范中,“一切皆对象”,对象就是面向对象编程的核心。现实世界中的每一个物体都是对象!当然,这个“对象”不是你怀里撒娇的男/女朋友,而是指某个“类”的一个实例。

比如,“人”是一个“整体”的概念,它不是“个体”的概念,所以“人”是“类别(模板)”,而不是对象。但是在人这个“类别”中,有法外狂徒张三这个个体,张三就是一个具体的“对象”。每个对象都有自己的状态和行为,比如张三的状态有:身高、体重、爱好;行为有:吃、喝、piao、du、抽,坑、蒙、拐、骗、偷等。

2. 行为和特征

一个对象主要包括行为和特征(状态、属性)两个核心要素。

行为:一般是动词,指的是方法,代表一个对象能干什么,具有哪些功能或能力,例如人可以吃饭、睡觉、说话、工作等;在Java中,一般是用方法来表明对象所具有的行为。

特征:也可以叫做状态,一般是名词,指的是属性,代表一个对象有什么特点或参数,例如每个人的姓名、年龄、性别、体重等。在Java中,一般是用变量来表明对象的状态。

3. 对象的创建方式(重点)

对象就是类的实例化,也就是根据类来创建一个具体的对象,就好比我们使用一个手机壳模具制造出一个具体的手机壳。接下来就给大家讲一下,在Java中创建对象的两种主要方式:显式创建与隐式创建

3.1 显式创建

其中显式创建对象时,又有以下4种具体的创建方式:

  • 使用new关键字创建对象;
  • 使用newlnstance()实例方法创建对象;
  • 使用clone()方法创建对象;
  • 使用ObjectlnputStream对象的readObject()方法创建对象。

3.2 隐式创建

隐式创建对象主要是包括以下几种方式:

  • 给String字符串变量赋值;
  • “+”号拼接多个字符串;
  • JVM虚拟机加载类时隐式创建类对象。

接下来分别给大家讲解一下这几种创建对象的方式。受限于篇幅,今天主要是给大家讲解通过new关键字创建对象的方式,其他的方式我们以后再细讲。

二. 显式创建

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

1.1 new简介

我们知道,new是"新的"的意思。在Java中,new是一个关键字,它用于创建一个新的类实例,即新的类对象。所以在Java中,创建新对象也可以叫做实例化对象。 对于引用类型来说,如果该类型没有进行实例化,也就是没有进行对象的创建,那么该对象的属性、方法等在内存中都是不存在的。只有使用new关键字创建了对象之后,这个对象在内存中才会存在,才能使用。

1.2 new作用

当一个引用类型的变量被声明以后,如果没有进行初始化,那么它就不指向任何对象,我们也就没办法使用该变量。所以我们就可以通过new关键字对该变量进行初始化,具体地来说,new关键字的作用如下:

  • 为新对象及对象中的各实例变量分配内存空间;
  • 将新对象中的各实例变量自动初始化成对应类型的默认值;
  • 初始化对象,并给各实例变量赋予正确的初始值;
  • 调用引用类型对应的构造方法;
  • 返回对象的引用。

1.3 基本语法

new关键字创建对象的语法格式如下:

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

1.4 代码案例

为了让大家更好地理解new的用法,给大家设计了如下代码案例。


public class Demo01 {
    public static void main(String[] args) {
	// new关键字
	Person p1 = new Person();
    }
}

在这段简单的代码中,Person p1=new Person();,前半部分Person p1,表示是在内存中分配一个Person类型的变量p1。后半部分new Person();,表示利用new关键字和构造方法来创建一个Person类型的对象,Person()是构造方法的名字。当构造方法执行完,这个Person类型的对象就建造出来了,也就为其分配了对应的内存。

虽然p1是引用类型的变量,但p1自身会存储在栈内存中。而使用new关键字创造出来的对象,则被存储在堆内存(heap)中。且在new关键字真正创建出引用类型的对象之后,会把这个对象在内存中的地址返回给p1变量进行引用,这样我们就可以通过调用p1找到对内存中的Person对象。

所以Person p1=new Person();这行代码的作用就是,把Person对象在内存中的地址 赋值 给变量p1。在Java中,我们可以把p1变量叫做引用变量,或者简称为引用。又因为p1变量中存放的是引用类型的内存地址值,我们也可以把p1的值叫做引用地址。

2. newlnstance()方法

除了使用new关键字创建对象之外,我们还可以使用newInstance()方法创建对象。该方法是java.lang.Class 或 java.lang.reflect.Constuctor类中的实例方法,其语法格式如下:

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

类名 对象名 = (类名)Class类对象名称.newInstance();

我们在调用java.lang.Class类中的forName()方法时,需要将待实例化类的全限定名(如 com.yyg.Person)作为参数传递进来,然后再调用 java.lang.Class类对象的newInstance()方法创建对象。


public class Demo01 {
    public static void main(String[] args) {
	//newInstance()方法创建对象
	try {
            Class<?> clazz = Class.forName("com.yyg.Person");
            Person p2 = (Person) clazz.newInstance();
	} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
	}
    }
}

因为这一块的内容涉及到了反射的知识点,后面会专门讲解反射,这一块的内容大家先有所了解即可。

3. clone()方法

第三种显式创建对象的方法,就是利用实例对象的clone()方法进行对象的复制,也可以创建一个新对象出来。clone()方法创建对象时,不会调用类的构造方法,它会创建一个复制的对象,这个对象和原来的对象具有不同的内存地址,但它们的属性值却相同。

另外clone()方法是Java Object对象中被protected修饰的方法,可供子类调用以实现子类的克隆逻辑,但不能直接调用。并且我们使用该方法创建对象时,还要求待实例化的类必须实现 java.lang.Cloneable接口,否则会抛出 java.lang.CloneNotSupportedException异常,比较麻烦,所以该方法并不常用。 clone()方法创建对象的语法格式如下:

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

4. readObject()方法

我们还可以使用java.io.ObjectlnputStream对象的readObject()方法来创建一个新对象。ObjectlnputStream是IO流中的内容,以后会详细讲解Java中的IO流,大家对此先有一个大致的印象即可。

5. 小结

在上面给大家提到了4种显式创建对象的方式,在此我们进行一个小小的总结:

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

三. 隐式创建

在Java中,除了可以显式地创建对象之外,还可以隐式地创建对象。隐式创建对象主要是通过以下几种方式:

  • 给String字符串变量赋值;
  • “+”号拼接多个字符串;
  • JVM虚拟机加载类时隐式创建类对象。

1. 给String字符串变量赋值

我们经常给一个字符串变量赋值,如下所示:

String str = "Hello,壹哥";

上面的str变量,其实就是一个String对象,该对象会由JVM虚拟机隐式地创建出来。

2. “+”号拼接多个字符串

我们知道,“+”运算符有两个基本作用:加法运算和字符串拼接。当进行字符串拼接时,其运算的结果是一个新的 String对象,示例如下:

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

通过上面的语句,JVM会隐式地创建出第3个String对象。

3. JVM虚拟机加载类时隐式创建类对象

当Java的JVM虚拟机加载一个类时,会隐式地创建出一个可以描述这个类的Class实例对象。类的加载是指把类的.class字节码文件读到内存中,把它存放到运行时数据区的方法区中,然后会在堆区创建一个 java.lang.Class对象,用来封装类在方法区内的数据结构。

4. 小结

无论我们是釆用显式或是隐式方式创建对象,Java虚拟机都会在创建对象时包含以下步骤:

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

四. 对象的使用

1. 简介

我们在通过一系列方式创建好对象之后,那么这个对象该怎么用呢?我们知道对象中有状态和行为两个核心要素,那怎么来调用一个对象的行为和状态呢?Java中,一个普通的实例对象调用它的行为和状态,基本的语法格式如下:

//调用状态

对象.属性名;

//调用方法

对象.方法名();

接下来我们通过一个小案例给大家展示一下。

2. 使用


public class Demo02 {
    public static void main(String[] args) {
        // 对象的使用
	//先创建一个对象
	Person p1=new Person();
		
	//调用对象的属性(该属性不能是私有的,否则别的类中无法看到)--状态.
	String name = p1.name;
		
	//调用对象的方法
	p1.eat();
	p1.speak("一一哥", "男", 18);
    }
}

大家要注意,当我们在A类中调用B类对象时,B类对象的属性或方法不能是私有的,否则在A类中会无法看到该属性或方法。

五. 创建对象的内存分析(重点)

1. 内存简介

Java程序在运行时,操作系统会给程序分配三块主要的内存空间:栈内存、堆内存、方法区

  • 栈内存: 栈内存也叫做虚拟机栈,可以存放基本类型的数据和引用类型的地址,主要是局部变量。 这些 局部变量存放了编译期可知长度的各种基本数据类型和对象引用,方法执行完就会自动释放。栈内存具有先进后出、占用空间比较小、存取速度相对较快的特点。
  • 堆内存: 堆内存中可以存放各对象实例(所有new出来的对象都是)和数组都在堆中存放,即堆中存放的是引用类型的实际数据。 堆内存占用的空间比较大,存取速度相对较慢。
  • 方法区: 方法区主要用于存储类信息、常量、静态变量,静态代码块、即时编译器(JIT Compiler)编译后的代码数据等 简单言之就是存储类的结构信息。类的结构信息包括类的名称、方法信息、字段信息等。在方法区中,有一块空间叫做常量池(串池),用来存放字符串常量。还有一块空间叫做静态区,用来存储静态变量等静态数据。但在JDK 7之后,常量池、静态区作为堆中的一个子部分,方法区的概念被弱化。

2. 内存分析


public class Demo02 {
    public static void main(String[] args) {
        // 对象的使用
	//先创建一个Person对象
	Person p1=new Person();
        p1.name="一一哥";
        p1.age=18;
        p1.sex="男";

        //创建p2对象
        Person p2=new Person();
    }
}

在上述代码中,我们定义的Person类型p1变量实际上是一个引用,它会被存放在栈内存中,而存放实际数据的Person对象则存放在堆内存中。如下图所示:

根据上面的内存分析图可知:

  • Person类中包含了name、age、sex三个属性,它们分别是String、int、String类型。我们知道,它们的默认值分别是null、0、null。
  • 我们创建一个p1对象之后,p1会被存放在栈区,然后p1会通过堆中Person对象的内存地址,去找到该对象被实例化的内容(即name、age、sex等)。
  • Java代码中刚创建出来的对象属性都是采用默认值(null、0、null),等我们通过"对象.属性"的方式对属性进行重新赋值后,堆内存中存储的才是赋值后的内容。
  • 我们创建的另一个对象p2,p2依然在栈区,但并没有对p2进行初始化,所以p2的属性在堆内存中都是默认值。
  • 堆内存中的每一个对象,都有一个独立的内存空间。

六. 结语

至此,就给大家把Java的对象介绍完毕了,现在你知道几种创建对象的方式呢?最后再跟大家说一下,不管我们用哪种方式创建出来的对象,每个对象都是相互独立的。这些不同的对象在内存中会占有独立的内存地址,且每个对象都具有自己的生命周期。当一个对象的生命周期结束时,对象就变成了垃圾,这些垃圾对象会被JVM虚拟机自带的GC垃圾回收机制来处理。

以上就是Java创建对象之显示创建与隐式创建的详细内容,更多关于Java创建对象的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java创建对象之显示创建与隐式创建

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java创建对象之显示创建与隐式创建

在本篇文章中,小编会带大家学习面向对象中关于对象的创建之显示创建和隐式创建,其实类和对象作为面向对象中最基本的,也是最重要的,需要的朋友可以参考下
2023-05-20

怎么创建Java对象

这篇文章主要介绍“怎么创建Java对象”,在日常操作中,相信很多人在怎么创建Java对象问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么创建Java对象”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!一、
2023-06-16

java怎么创建对象

在Java中,可以使用关键字new来创建一个对象。创建对象的一般语法是: = new ();其中,是要创建对象的类名,是对象的引用变量名,new关键字用于创建对象,后面跟着的()用于调
java怎么创建对象
2024-02-29

Java对象的创建过程

Java对象创建过程1、JVM遇到一条新建对象的指令时首先去检查这个指令的参数是否能在常量池中定义到一个类的符号引用。然后加载这个类;推荐学习:java视频教程2、为对象分配内存。一种办法“指针碰撞”、一种办法“空闲列表”,最终常用的办法“本地线程缓冲分配(T
Java对象的创建过程
2019-04-12

java中怎么创建对象

这篇文章主要介绍了java中怎么创建对象的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java中怎么创建对象文章都会有所收获,下面我们一起来看看吧。1、检查类是否加载。当虚拟机遇到new指令时,首先检查该指令的
2023-06-30

java如何创建date对象

Java中可以使用以下几种方法来创建Date对象:1. 使用无参构造函数创建一个表示当前日期和时间的Date对象:```javaDate date = new Date();```2. 使用指定的毫秒数创建一个Date对象,该毫秒数表示从1
2023-09-13

JAVA对象创建与对象克隆的方法

这篇文章主要介绍了JAVA对象创建与对象克隆的方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JAVA对象创建与对象克隆的方法文章都会有所收获,下面我们一起来看看吧。一、对象的4种创建方式new 创建反射克隆
2023-06-29

java对象创建的过程

1、检查指令的参数是否能在常量池中定位到一个类的符号引用 2、检查此符号引用代表的类是否已被加载、解析和初始化过。如果没有,就先执行相应的类加载过程 3、类加载检查通过后,接下来虚拟机将为新生对象分配内存。 4、内存分配完成之后,虚拟机将分
2023-08-30

java创建对象的方式有哪些

在Java中创建对象的方式有以下几种:1. 使用 `new` 关键字:通过使用 `new` 关键字,可以实例化一个类,并在内存中分配空间来存储对象。例如:`MyClass obj = new MyClass();`2. 使用 `Class.
2023-09-13

Java中创建对象的5种方式

作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象。然而这里有很多创建对象的方法,我们会在这篇文章中学到。Java中有5种创建对象的方式,下面给出它们的例子还有它们的字节码使用new关键字} →
2023-06-03

word显示无法创建对象如何解决

如果在使用Word时出现无法创建对象的错误,可以尝试以下几种解决方法:1. 检查是否安装了Microsoft Office:确保已经正确安装了Microsoft Office套件,包括Word程序。2. 修复或重新安装Microsoft O
2023-09-09

怎么创建Java线程对象

本篇内容介绍了“怎么创建Java线程对象”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!默认情况下,主线程和垃圾回收线程都是由系统创建的,但是
2023-06-02

6种Java创建对象的方式总结

在Java中,创建对象可以使用多种方式,本文将详细介绍以下六种创建对象的方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
2023-05-18

java创建对象的方式有哪几种

在Java中,可以通过以下几种方式创建对象:1. 使用new关键字:通过使用new关键字,可以调用类的构造方法实例化一个对象。例如:```javaClassName object = new ClassName();```2. 使用反射:可
2023-10-10

如何使用java链式创建json对象

这篇文章主要为大家展示了“如何使用java链式创建json对象”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用java链式创建json对象”这篇文章吧。1、假设我们要创建一个json对象格
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录