Java中有哪些创建对象的方法? java创建对象的方式有
lipiwang 2024-10-15 18:44 14 浏览 0 评论
面向对象程序设计(OOP)是当今主流的程序设计规范,它已经基本取代了结构化、过程化的程序设计。Java就是面向对象的,使用java开发程序,不管做什么样的操作,我们第一步都是从创建对象、获取对象开始,有了对象我们就可以完成一切我们所需要的程序了。
那怎么样才能创建对象?java中有哪些创建对象的方法?
我们今天就来详细了解一下。
一:new运算的方式创建对象
首先我们有一个关于宠物的类Dog
当我们程序中需要出现一只狗狗的时候,我们就可以使用new来创建一个具体的对象了
在这里我们就通过了new的方式获得了一个具体的对象,并且起名为小黑,年龄为3岁。
现在,dog1就带表了堆中刚才所实例化出来的对象。以后我们要操作刚才new出来的对象就可以通过dog1来操作了,例如我们让小狗打个招呼(调用Dog类的show方法):
二:通过反射的方式创建对象
Java的反射技术是java程序的特征之一,它允许运行中的Java程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。
反射的作用:1)可以通过反射机制发现对象的类型,找到类中包含的方法、属性和构造器2)可以通过反射创建对象并访问任意对象方法和属性
第二种创建java对象的方式就是通过反射来创建了。
还是我们之前用过的Dog类,首先JVM利用ClassLoader(类加载器)先将Dog类加载到内存,然后马上产生了一个Class类型的对象,该对象可以看成是一个模型,以后无论创建多少个Dog类的实例都是利用该模型来生成(一个类所对应的Class类型的对象只有一个)。
通过反射创建对象第一步:需要获得class对象
这样获取到类对象之后就可以通过newInstance()这个方法来获取具体的对象了,需要注意的是这个方法的返回值是Object类型,我们需要进行转型操作
这样我们就通过反射的方式创建好了java对象,newInstance()和new的区别如下:
newInstance: 弱类型。低效率。只能调用无参构造。new: 强类型。相对高效。能调用任何public构造。
在这里需要注意的是,newInstance()这个方法只能够调用无参的构造函数(其实这也符合javabean规范,一个类必须拥有一个无参构造函数),现在我们在Dog类中写有参构造函数(默认覆盖无参构造函数),值得注意的是,当我们写了有参构造函数之后,系统将不再提供默认的无参构造函数,如果需要的话,需要你自己写
现在再去调用newInstance()方法
现在程序运行结果为java.lang.InstantiationException,着就是程序没有无参构造函数而使用newInstance()方法引发的错误了
当然如果你需要调用有参构造函数的话,可以通过以下的办法:
程序的第二行我们调用Class对象的getConstructor方法,然后在参数列表中传入String和int,因为我们的有参构造函数的参数列表就是这样规定的,现在我们就获取到了前边定义好的Dog类的有参构造函数了
第三行我们通过获取的Constructor对象调用newInstance方法,然后在方法中传入Object类型的参数列表,因为我们的有参构造函数需要这些值,这样就可以通过反射的方式创建只有有参构造函数的对象了
三:通过对象反序列化的方式来创建
当我们使用反序列化一个对象的时候,JVM会给我们创建一个对象。但是,反序列化的时候JVM并不会去调用类的构造函数(前边两种方式都会去调用构造函数)来创建对象,而是通过之前序列化对象的字节序列来创建的。
序列化对象必须实现Serializable这个接口把对象转为字节序列的过程称为对象的序列化把字节序列恢复为对象的过程称为对象的反序列化
需要注意的是:Dog类需要实现Serializable这个接口才可以被序列化/反序列化,否则会出现java.io.NotSerializableException异常
对象序列化通常有两种用途:
1)将对象的字节序列永久的保存到硬盘上
例如web服务器把某些对象保存到硬盘让他们离开内存空间,节约内存,当需要的时候再从硬盘上取回到内存中使用
2)在网络上传递字节序列
当两个进程进行远程通讯的时候,发送方将java对象转换成字节序列发送(序列化),接受方再把这些字节序列转换成java对象(反序列化)
当Dog类实现了Serializable接口后,我们现在将Dog对象序列化
通过ObjectOutputStream的writeObject方法,我们就将一个对象完成了序列化
现在我们再次将刚才序列化后的对象反序列化回来,这次用到的是ObjectInputStream的readObject方法:
这样我们就使用了对象的序列化完成了java对象的创建
四:通过clone的方式来创建
clone方法来源于java中object类,在jdk中的解释为:该方法返回一个此对象的副本。clone顾名思义就是复制的意思。所谓复制对象就是在内存中分配一个和原一模一样的空间,在此创建新的对象。
我们现在就来完成clone的实验,首先我们需要在需要clone的类中实现Cloneable接口,
否则会出现java.lang.CloneNotSupportedException异常,由于Object类中clone方法是protected 修饰的,所以我们必须在需要克隆的类中重写克隆方法
现在进入实验1:
返回值为true,因为在这个地方只有d1是真实创建了对象,d2来源于d1的赋值,引用地址值一样(代表是同一个对象),所以==判断结果为true
现在进入实验2:
实验结果为false,因为clone是真实在内存中重新划分一块区域来存储新的对象,d1和d2是两个不同的对象所以返回结果值为false
这样我们就使用了对象的克隆的方式完成了java对象的创建。
如果大家有问题想了解更多的技术干货可以私信发送【微信】加朗妹儿微信哟~
相关推荐
- 前端入门——css 网格轨道详细介绍
-
上篇前端入门——cssGrid网格基础知识整体大概介绍了cssgrid的基本概念及使用方法,本文将介绍创建网格容器时会发生什么?以及在网格容器上使用行、列属性如何定位元素。在本文中,将介绍:...
- Islands Architecture(孤岛架构)在携程新版首页的实践
-
一、项目背景2022,携程PC版首页终于迎来了首次改版,完成了用户体验与技术栈的全面升级。作为与用户连接的重要入口,旧版PC首页已经陪伴携程走过了22年,承担着重要使命的同时,也遇到了很多问题:维护/...
- HTML中script标签中的那些属性
-
HTML中的<script>标签详解在HTML中,<script>标签用于包含或引用JavaScript代码,是前端开发中不可或缺的一部分。通过合理使用<scrip...
- CSS 中各种居中你真的玩明白了么
-
页面布局中最常见的需求就是元素或者文字居中了,但是根据场景的不同,居中也有简单到复杂各种不同的实现方式,本篇就带大家一起了解下,各种场景下,该如何使用CSS实现居中前言页面布局中最常见的需求就是元...
- CSS样式更改——列表、表格和轮廓
-
上篇文章主要介绍了CSS样式更改篇中的字体设置Font&边框Border设置,这篇文章分享列表、表格和轮廓,一起来看看吧。1.列表List1).列表的类型<ulstyle='list-...
- 一文吃透 CSS Flex 布局
-
原文链接:一文吃透CSSFlex布局教学游戏这里有两个小游戏,可用来练习flex布局。塔防游戏送小青蛙回家Flexbox概述Flexbox布局也叫Flex布局,弹性盒子布局。它决定了...
- css实现多行文本的展开收起
-
背景在我们写需求时可能会遇到类似于这样的多行文本展开与收起的场景:那么,如何通过纯css实现这样的效果呢?实现的难点(1)位于多行文本右下角的展开收起按钮。(2)展开和收起两种状态的切换。(3)文本...
- css 垂直居中的几种实现方式
-
前言设计是带有主观色彩的,同样网页设计中的css一样让人摸不头脑。网上列举的实现方式一大把,或许在这里你都看到过,但既然来到这里我希望这篇能让你看有所收获,毕竟这也是前端面试的基础。实现方式备注:...
- WordPress固定链接设置
-
WordPress设置里的最后一项就是固定链接设置,固定链接设置是决定WordPress文章及静态页面URL的重要步骤,从站点的SEO角度来讲也是。固定链接设置决定网站URL,当页面数少的时候,可以一...
- 面试发愁!吃透 20 道 CSS 核心题,大厂 Offer 轻松拿
-
前端小伙伴们,是不是一想到面试里的CSS布局题就发愁?写代码时布局总是对不齐,面试官追问兼容性就卡壳,想跳槽却总被“多列等高”“响应式布局”这些问题难住——别担心!从今天起,咱们每天拆解一...
- 3种CSS清除浮动的方法
-
今天这篇文章给大家介绍3种CSS清除浮动的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。首先,这里就不讲为什么我们要清楚浮动,反正不清除浮动事多多。下面我就讲3种常用清除浮动的...
- 2025 年 CSS 终于要支持强大的自定义函数了?
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!1.什么是CSS自定义属性CSS自...
- css3属性(transform)的一个css3动画小应用
-
闲言碎语不多讲,咱们说说css3的transform属性:先上效果:效果说明:当鼠标移到a标签的时候,从右上角滑出二维码。实现方法:HTML代码如下:需要说明的一点是,a链接的跳转需要用javasc...
- CSS基础知识(七)CSS背景
-
一、CSS背景属性1.背景颜色(background-color)属性值:transparent(透明的)或color(颜色)2.背景图片(background-image)属性值:none(没有)...
- CSS 水平居中方式二
-
<divid="parent"><!--定义子级元素--><divid="child">居中布局</div>...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)