Java Object 对象创建的方式 [ 转载 ]
Java Object 对象创建的方式 [ 转载 ]
@author http://blog.csdn.net/mhmyqn/article/details/7943411
显式创建
有4种显式地创建对象的方式:
1.构造器:用new语句创建对象,这是最常用的创建对象的方式。
2.反射:运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
3.克隆:调用对象的clone()方法。
4.序列化:运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法.
下面演示了用前面3种方式创建对象的过程。
- public class Customer implements Cloneable{
- private String name;
- private int age;
- public Customer(){
- this("unknown",0);
- System.out.println("call default constructor");
- }
- public Customer(String name,int age){
- this.name=name;
- this.age=age;
- System.out.println("call second constructor");
- }
- public Object clone()throws CloneNotSupportedException{
- return super.clone();
- }
- public boolean equals(Object o){
- if(this==o)return true;
- if(! (o instanceof Customer)) return false;
- final Customer other=(Customer)o;
- if(this.name.equals(other.name) && this.age==other.age)
- return true;
- else
- return false;
- }
- public String toString(){
- return "name="+name+",age="+age;
- }
- public static void main(String args[])throws Exception{
- //运用反射手段创建Customer对象
- Class objClass=Class.forName("Customer");
- Customer c1=(Customer)objClass.newInstance(); //会调用Customer类的默认构造方法
- System.out.println("c1: "+c1); //打印name=unknown,age=0
- //用new语句创建Customer对象
- Customer c2=new Customer("Tom",20);
- System.out.println("c2: "+c2); //打印name=tom,age=20
- //运用克隆手段创建Customer对象
- Customer c3=(Customer)c2.clone(); //不会调用Customer类的构造方法
- System.out.println("c2==c3 : "+(c2==c3)); //打印false
- System.out.println("c2.equals(c3) : "+c2.equals(c3)); //打印true
- System.out.println("c3: "+c3); //打印name=tom,age=20
- }
- }
以上程序的打印结果如下:
call second constructor
call default constructor
c1: name=unknown,age=0
call second constructor
c2: name=Tom,age=20
c2==c3 : false
c2.equals(c3) : true
c3: name=Tom,age=20
从以上打印结果看出,用new语句或Class对象的newInstance()方法创建Customer对象时,都会执行Customer类的构造方法,而用对象的clone()方法创建Customer对象时,不会执行Customer类的构造方法。(区别)
隐式创建
在程序中还可以隐含地创建对象,包括以下4种情况:
1.命令行参数:对于java命令中的每个命令行参数,Java虚拟机都会创建相应的String对象,并把它们组织到一个String数组中,再把该数组作为参数传给程序入口main(String args[])方法。
2.String类型:程序代码中的String类型的直接数对应一个String对象,例如:
- String s1="Hello";
- String s2="Hello"; //s2和s1引用同一个String对象
- String s3=new String("Hello");
- System.out.println(s1==s2); //打印true
- System.out.println(s1==s3); //打印false
执行完以上程序,内存中实际上只有两个String对象,一个是直接数,由Java虚拟机隐含地创建,还有一个通过new语句显式地创建。
3.字符串拼接:字符串操作符“+”的运算结果为一个新的String对象。例如:
- String s1="H";
- String s2=" ello";
- String s3=s1+s2; //s3引用一个新的String对象
- System.out.println(s3=="Hello"); //打印false
- System.out.println(s3.equals("Hello")); //打印true
4.字节码生成Class对象:当Java虚拟机加载一个类时,会隐含地创建描述这个类的Class实例.
Java Object 对象创建的方式 [ 转载 ]的更多相关文章
- Java Object 对象拷贝答疑
Java Object 对象拷贝答疑 @author ixenos 摘要:在对象的clone过程需要注意的几点.关于关键字this.super 关于clone[对象拷贝] 在实际编程过程,有时候我们会 ...
- Java Object 对象拷贝
Java Object 对象拷贝 @author ixenos JAVA 对象拷贝 Java里的clone分为: 1.浅拷贝:浅复制仅仅复制所考虑的对象,而不复制它所引用的对象,Object类里的c ...
- Javascript 对象创建多种方式 原型链
一.对象创建 1.new Object 方式 直接赋上属性和方法 var obj = new Object(); obj.name = '娃娃'; obj.showName = function(){ ...
- Java中对象创建过程
本文介绍的对象创建过程仅限于普通Java对象,不包括数组和Class对象. 1.类加载检查 虚拟机遇到一条new指令时,首先去检查该指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号引用 ...
- 关于Java String对象创建的几点疑问
我们通过JDK源码会知道String实质是字符数组,而且是不可被继承(final)和具有不可变性(immutable).可以如果想要了解String的创建我们需要先了解下JVM的内存结构. 1.JVM ...
- JVM系列之:详解java object对象在heap中的结构
目录 简介 对象和其隐藏的秘密 Object对象头 数组对象头 整个对象的结构 简介 在之前的文章中,我们介绍了使用JOL这一神器来解析java类或者java实例在内存中占用的空间地址. 今天,我们会 ...
- Java中对象创建时的内存分配
一.前言知识铺垫 1.逃逸对象:在一个方法内创建的对象没有被外界引用则称该对象为未逃逸的对象. 2.JDK1.6以后的HotSpot虚拟机支持运行时的对象逃逸分析. 3.JVM中的参数配置: 1) ...
- JS对象创建常用方式及原理分析
====此文章是稍早前写的,本次属于文章迁移@2017.06.27==== 前言 俗话说"在js语言中,一切都对象",而且创建对象的方式也有很多种,所以今天我们做一下梳理 最简单的 ...
- java Object对象的clone方法
参考copy链接:http://blog.csdn.net/bigconvience/article/details/25025561 在看原型模式,发现要用到clone这个方法,以前和朋友聊过,没怎 ...
随机推荐
- xtrabackup在线备份及还原
xtrabackup下载https://www.percona.com/downloads/XtraBackup/LATEST/xtrabackup文档https://www.percona.com/ ...
- nyoj 592 spiral grid(广搜)
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=592 解决以下问题后就方便用广搜解: 1.将数字坐标化,10000坐标为(0,0),这样就 ...
- php一些函数及方法...
- 四位len灯流水
#include <msp430x14x.h> //#include<intrins.h> #define uint unsigned int void delay(long ...
- PHP数组关于数字键名的问题
以下是对PHP数组数字键名的几点总结: 键名长度只能在 int 长度范围内,超过int 范围后将会出现覆盖等混乱情况 在键名长度为 int 范围内存取值时,PHP会强制将数字键名转换为 int 数值型 ...
- Form提交时隐藏Token验证
前端声称一个Token @Html.AntiForgeryToken() 后台对Token进行验证 AntiForgery.Validate();
- Ecstore安装篇-1.运行系统环境要求
运行系统环境要求 运行系统环境要求 author :James,jimingsong@vip.qq.com since :2015-03-01 支持的操作系统 支持的WEB服务器 支持的浏览器 支持的 ...
- xml文件查找重复元素(超简单版)
使用WPS,新建一个表格文件,将xml拖入表格,点数据,选中存在重复项的列,点高亮重复项,OK.
- 集线器(HUB),交换机,和路由器的区别
交换机与集线器的区别从大的方面来看可以分为以下三点: 1.从OSI体系结构来看,集线器属于OSI第一层物理层设备,而交换机属于OSI的第二层数据链路层设备.也就意味着集线器只是对数据的传输起到同步.放 ...
- MYSQL 命令行导入导出数据库文件
MYSQL命令行导入数据库 1.首先通过命令行进入到mysql安装目录的bin目录下,比如我输入的命令为: cd E:\MySQL\MySQL Server 5.5\bin,输入如下命令: mysql ...