对象的创建与克隆

  • 显示创建对象
package com.xing.test;

public class Name implements Cloneable{

    /**
     * @param args
     * 创建对象与对象克隆
     */
    private String name;
    private int age;
    public Name(){

    }
    public Name(String name, int age) {
        this.name=name;
        this.age=age;
    }
    public String toString(){
        return "学生姓名:"+name+",学生年龄:"+age;
    }
    public static void main(String[] args) throws Exception {
        System.out.println("----------new-------------");
        Name pp=new Name("小二",55);
        System.out.println(pp);
        System.out.println("----------调用对象的clone()方法创建对象-------------");
        Name pp3=(Name)pp.clone();
        System.out.println(pp3);
        System.out.println("----------调用java.lang.Class的newInstance()方法创建对象-------------");
        Class qq=Class.forName("com.xing.test.Name");
        Name pp2=(Name) qq.newInstance();
        System.out.println(pp2);

    }

}

注:

使用new和java.lang.Class的newInstance()方法创建对象时,都会调用类的构造方法。后者会调用类的默认构造方法即无参构造方法,如果新建的构造方法覆盖了原来的构造方法,必须在重新写一个无参构造。使用object类的clone()方法创建对象时,不会调用类的构造方法,他会创建一个复制的对象,这个对象和原来的对象具有不同的内存地址,但他们的属性值相同。

  • 隐含创建对象

1、String name="hah";"hah"就是一个String对象由java虚拟机隐含的创建。

2、字符串的+运算符的结果为一个新的String对象

string a1="a";

string a2="b";

string a3=a1+a2;这时a3就是一个新的String对象

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

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

  • 如何实现对象克隆
  • 有两种方式:

    ??1). 实现Cloneable接口并重写Object类中的clone()方法;

    ??2). 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆,代码如下。

package com.xing.test;

public class Clonetest {
     public static void main(String[] args) {
            try {
                Person1 p1 = new Person1("Hao LUO", 33, new Car("Benz", 300));
                Person1 p2 = Myutil.clone(p1);   // 深度克隆
                p2.getCar().setBrand("BYD");
                // 修改克隆的Person对象p2关联的汽车对象的品牌属性
                // 原来的Person对象p1关联的汽车不会受到任何影响
                // 因为在克隆Person对象时其关联的汽车对象也被克隆了
                System.out.println(p1);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
}
时间: 2024-10-23 12:03:24

对象的创建与克隆的相关文章

访问修饰限定符的简单总结、final/abstruct/interface对类的限制、自动加载机制、序列化与反序列化【数据持久化和对象的序列化问题】、对象的拷贝(按引用是因为对象标识)和克隆(__clone方法中的this指向)

1.针对访问修饰限定符的理解只需要两点:(1)针对的是类的概念和访问代码的位置来确定是否能够访问(2)对访问修饰限定符的使用时只需要对该成员的使用场景注意即可[也就是内部,继承类,外部进行访问的权限] 不需要对内部进行太多理解[需要对php底层理解时进行理解] [重点][用途]通过访问修饰限定符将内部成员的权限合理的限制,然后再使用公共接口来调用这个基本服务,保证外部不能访问其内部的构件[这样既能够通过类内的设置,将内部的功能实现更好的限制,只有最外层的接口可以正常被访问到,而不了解内部的业务]

JavaScript DOM实战:创建和克隆元素

DOM来创建和克隆元素. createElement()和createTextNode() createElement()和createTextNode()做的事情正如它们的名字所说的那样.最常见的JavaScript DOM方法实战-修改文档树中已经用过它们.当时的目的是把新创建的元素添加到文档树里,使它成为某个元素的最后一个子节点. 1. //创建一个li新元素 2. var newChild=document.createElement('li'); 3. //创建一个a 新元素 4. v

JavaScript日期时间对象的创建与使用(三)

时钟效果一: 代码: <html> <head> <meta charset="utf-8"/> <title>JavaScript日期时间对象的创建与使用</title> </head> <body> <h2 id="time"></h2> <script type="text/javascript"> function Cl

ajax之请求对象的创建以及它与服务器之间的4次“握手”(好吧其实只有3次)

request对象的创建 对于request对象的创建,我们总会第一时间反映到下列语句 var request=new XMLHttpRequest(); 不过因为各大浏览器之间的相互斗殴行为,事情是不会这么简单的. 比如非常经典的:IE浏览器没有XMLHttpRequest函数. 但这难不倒我们聪明机智的程序员,我们也有经典的应对措施: function createRequest(){     try{         request=new XMLHttpRequest();     }c

对象的创建

创建一个类,实际上是定义了一种新的复合数据类型.声明该类的一个变量,就是声明该类的对象过程.创建对象包括对象的声明和实例化两步. 1.对象的声明 对象的声明主要是声明该对象是哪个类的对象,语法如下: 类名 变量名列表: 注:变量名列表可包含一个对象名或多个对象名,如果含有多个对象名,对象名之间采用逗号分隔开.当声明一个对象时,就为该对象名在栈内存中分配内存空间,此时它的值为null ,表示不指向任何对象. 2.对象的创建 在声明对象时,并没有为该对象在堆内存中分配空间,只有通过new 操作才能完

Javascript我学之五对象的创建与使用

本文是金旭亮老师网易云课堂的课程笔记,记录下来,以供备忘. 对象的创建 JavaScript对象有两种类型 1).Native:在ECMAScript标准中定义和描述,包括JavaScript内置对象(数组,日期对象等)和用户自定义对象. 2).Host:在主机环境(如浏览器)中实现并提供给开发者使用,比如windows对象和所有的DOM对象 对象的含义 Object is an unordered collection of properties each of which contains

JVM学习:对象的创建和内存分配

1.对象的创建 java是面向对象的语言,因此对象的创建无时无刻都存在.在语言层面,使用new关键字即可创建出一个对象.但是在虚拟机中,对象创建的创建过程则是比较复杂的. 首先,虚拟机运到new指令时,会去常量池检查是否存在new指令中包含的参数,比如new People(),则虚拟机首先会去常量池中检查是否有People这个类的符号引用,并且检查这个类是否已经被加载了,如果没有则会执行类加载过程. 在类加载检查过后,接下来为对象分配内存当然是在java堆中分配,并且对象所需要分配的多大内存在类

图解java对象的创建过程

前面几篇博文分别介绍了JAVA的Class文件格式.JVM的类加载机制和JVM的内存模型,这里就索性把java对象的创建过程一并说完,这样java对象的整个创建过程就基本上说明白了(当然你要有基础才能真正看明白).经常有人问我为什么这么喜欢钻研底层的东西,首先,因为我以前的做硬件的和嵌入式的,兴趣使然:其次,我个人感觉,如果不把上下打通,心里老是有一堵墙过不去,说白了,这是个人因素,与好坏无关(当然,经常有人说,懂底层原理是成为高手的必经之路). 现在来说一下我当初学习JVM的原因,在学习JAV

.NET对象的创建、垃圾回收、非托管资源的手动处理

本篇用来梳理对象的创建.垃圾的回收,以及非托管资源的手动处理. →首先运行应用程序,创建一个Windows进程. →CLR创建一块连续的虚拟地址空间,这个地址空间就是托管堆.而且,这个地址空间最初并没有对应的物理存储空间. 虚拟地址空间分成2段.一个区段是普通堆,也叫GC堆,大小小于85000字节的引用类型对象的实例被分配在这里:另一个是大对象堆,大小大于等于85000字节的引用类型对象的实例被分配在这里. 对于客户端应用程序,每个区段的大小大致是16MB:对于服务端应用程序,每个区段的大小大致