一、创建对象的四种方法:

  a. new语句;

  b. 利用反射,调用描述类的Class对象的newInstance()实例方法;

  c. 调用对象的clone();

  d. 反序列化;

  其中new 和 newInstance()会调用类的构造方法,而clone()和反序列化不会;

Cloneable接口:

  Cloneable接口里没有定义方法,仅用于标记对象,clone()方法是Object类里面的方法,是一个protected native方法;

  如果对象实现Cloneable接口的话,需要覆盖clone方法;

  浅拷贝:只复制基本类型;

public class Person implements Cloneable{  

    private int age ;
private String name; public Person(int age, String name) {
this.age = age;
this.name = name;
} public Person() {} public int getAge() {
return age;
} public String getName() {
return name;
} @Override
protected Object clone() throws CloneNotSupportedException {
return (Person)super.clone();
}
}

  深拷贝:基本类型和引用类型都会复制;

static class Body implements Cloneable{
public Head head; public Body() {} public Body(Head head) {this.head = head;} @Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
} }
static class Head /*implements Cloneable*/{
public Face face; public Head() {}
public Head(Face face){this.face = face;} }
public static void main(String[] args) throws CloneNotSupportedException { Body body = new Body(new Head()); Body body1 = (Body) body.clone(); System.out.println("body == body1 : " + (body == body1) ); System.out.println("body.head == body1.head : " + (body.head == body1.head)); }

  可参考:Clone和New哪个更快

  

Serializable接口序列化

  String类、包装类、Date类都实现了这个接口;

  序列化写入对象:

    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("/objectFile")); //创建输出流
    out.writeObject("hello");
    out.writeObject(new Date()); //写入对象

  反序列化读取对象:

    ObjectInputStream in = new ObjectInputStream(new FileInputStream("/objectFile")); //创建输入流
    String str = (String)in.readObject();
    Date date = (Date)in.readObject(); //读取对象

  进一步控制:

    定义readObject() 和 writeObject()方法,当ObjectOutputStream对一个对象进行序列化时,如果该对象具有writeObject()方法,则会执行;

    private void writeObject(ObjectOutputStream stream) throws IOException{
stream.defaultWriteObject();
stream.writeObject(new Object());
} private void readObject(ObjectInputStream stream) throws ClassNotFoundException, IOException {
stream.defaultReadObject();
Object obj = stream.readObject();
}

    可参考:JAVA序列化基础知识Serializable与Externalizable的区别

        Serializable序列化时不会调用默认的构造器,而Externalizable序列化时会调用默认构造器的;

    

二、构造方法

  每个类都有一个不含参数的默认构造方法;

  若自定义了一个构造方法,则默认的构造方法会消失;

  子类在创建对象时,会自动先调用父类的默认构造方法;子类也可以显示的使用super()调用父类的构造方法;(所以定义类时都会显示的定义一个空构造方法,防止它丢失了子类调用不了)

  可参考:Java 构造方法和成员变量初始化顺序

Java对象 的创建与构造方法的更多相关文章

  1. 深入理解Java对象的创建过程:类的初始化与实例化

    摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类 ...

  2. (转)深入理解Java对象的创建过程

    参考来源:http://blog.csdn.net/justloveyou_/article/details/72466416 摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一 ...

  3. Java对象的创建过程:类的初始化与实例化

    一.Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化.在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象 ...

  4. 图解JAVA对象的创建过程

    前面几篇博文分别介绍了JAVA的Class文件格式.JVM的类加载机制和JVM的内存模型,这里就索性把java对象的创建过程一并说完,这样java对象的整个创建过程就基本上说明白了(当然你要有基础才能 ...

  5. Java对象的创建及使用

    Java对象的创建及使用 对象是类的具体实例(instance),是真实存在的个体:

  6. java --- 对象的创建过程

    java 对象创建的过程 存在了继承关系之后,对象创建过程如下: 1.分配空间.要注意的是,分配空间不光是分配子类的空间,子类对象中包含的父类对象所需要的空间,一样在这一步统一分配.在分配的空间的时候 ...

  7. [ Java学习基础 ] Java对象的创建和销毁

    类实例化可生成对象,实例方法就是对象方法,实例变量就是对象属性.一个对象的生命周期包括三个阶段:创建.使用和销毁. 创建对象 创建对象包括两个步骤:声明和实例化. 声明 声明对象与声明普通变量没有区别 ...

  8. Java对象的创建 —— new之后JVM都做了什么?

    Java对象创建过程 1. 类加载检查 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载.解析和初始化过.如果没 ...

  9. Java ——对象 类 方法重载 构造方法 封装 内部类

    本节重点思维导图 快捷键 生成代码:alt+shift+s 提取变量:alt+shift+L 快速复制行:alt+ctrl+向上或向下的箭头 删除行:ctrl+d 类:对同一种事物共同属性和行为的抽象 ...

随机推荐

  1. GIS可视化——热点格网图

    一.简介 原理:按照格网大小将区域进行划分,由一个矩形格网替代当前范围内的数据,由格网中心数字代替格网的权重(可以为格网中数据的数量,数据某权重的平均值.最大值.最小值等), 由格网之间颜色的不同表达 ...

  2. 读取配置文件包含properties和xml文件

    读取properties配置文件 /** * 读取配置文件 * @author ll-t150 */ public class Utils { private static Properties pr ...

  3. ClassPathXmlApplicationContext和FileSystemXmlApplicationContext区别

    ClassPathXmlApplicationContext 默认文件路径是src下那一级classpath:和classpath*:的区别: classpath: 只能加载一个配置文件,如果配置了多 ...

  4. C++必知必会(1)

    条款1数据抽象 抽象数据类型的用途在于将变成语言扩展到一个特定的问题领域.一般对抽象数据类型的定义须要准训下面步骤: 1.     为类型取一个描写叙述性的名字 2.     列出类型所能运行的操作 ...

  5. win下配置java环境变量

    系统变量→新建 JAVA_HOME 变量 . 变量值填写jdk的安装目录(本人是 E:\Java\jdk1.7.0)  系统变量→寻找 Path 变量→编辑 在变量值最后输入 %JAVA_HOME%\ ...

  6. 雕刻效果的实现【OpenCV+QT】

    雕刻能够区分为凸雕和凹雕. 凸雕基右下角的点减去左上角的点. 凹雕是左上角的点减去右下角的点. [效果图] 由于进行了缩放.效果看起来差一些.

  7. 调用聚合数据新闻头条API

    基于聚合数据新闻头条接口 支持阅读新闻类型包括: 各类社会.国内.国际.体育.娱乐.科技等资讯,更新周期5-30分钟. 新闻内容类型的多选,支持皮肤功能. 使用前需要有聚合数据账号,并实名制后通过 新 ...

  8. poj1270Following Orders(拓扑排序+dfs回溯)

    题目链接: 啊哈哈.点我点我 题意是: 第一列给出全部的字母数,第二列给出一些先后顺序. 然后按字典序最小的方式输出全部的可能性.. . 思路: 整体来说是拓扑排序.可是又非常多细节要考虑.首先要按字 ...

  9. docker创建私有仓库及存储image

    Docker官方的Docker hub尽管提供了有非常多image,也基本上包括了我们须要使用的,可是其訪问起来比較慢.假设自己要定制image.多台server之间的共享使用此image非常不方便. ...

  10. IDEA------Error:java:无效的目标发行版:1/7

    © 版权声明:本文为博主原创文章,转载请注明出处 使用IDEA发布java web项目时,报错.报错信息如下: 解决方案: 方案一:File-->Settings-->Build,Exec ...