博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java创建对象的几种方式
阅读量:6231 次
发布时间:2019-06-21

本文共 2612 字,大约阅读时间需要 8 分钟。

由于java是一种面向对象的语言,万事万物皆对象,用户定义一个类,这是一个广泛的定义,需要用户具体化,实例化这个广泛的类,确定这个具体的对象。在java程序中,对象可以被显式创建和隐式创建,主要说一下显式的创建对象的方式。

在之前被问过创建对象有几种方式,当时就回答了有一种,用new关键字创建,这是最常见的方式,不管是谁都可以答出。

其实创建对象的方式有四种:

  • 用new关键字创建
  • 调用对象的clone方法
  • 利用反射,调用Class类的或者是Constructor类的newInstance()方法
  • 用反序列化,调用ObjectInputStream类的readObject()方法

接下来用一个程序演示前三种创建对象的方式对于第四种不说了,他是根据

ObjectInputStream in = new ObjectInputStream (new FileInputStream("CloneTest.obj"));

CloneTest cloneTest3= (CloneTest)in.readObject();创建

在程序中重写了toString方法和equals方法,还有最重要的clone方法

package demo;public class CloneTest implements Cloneable {    private int id;    private String name;    public CloneTest() {    }    public CloneTest(int id, String name) {        this.name = name;        this.id = id;    }    @Override    protected Object clone() throws CloneNotSupportedException {        return super.clone();    }    @Override    public String toString() {        return "CloneTest{" +                "id=" + id +                ", name='" + name + '\'' +                '}';    }    @Override    public boolean equals(Object obj) {        if (this == obj) {            return true;        }        if (!(obj instanceof CloneTest)) {            return false;        } else {            if (this.id == ((CloneTest) obj).id && this.name.equals(((CloneTest) obj).name)) {                return true;            }        }        return false;    }    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, CloneNotSupportedException {        CloneTest cloneTest = (CloneTest) Class.forName("demo.CloneTest").newInstance();        System.out.println(cloneTest);        CloneTest cloneTest1 = new CloneTest(1001, "li");        System.out.println(cloneTest1);        CloneTest cloneTest2 = (CloneTest) cloneTest1.clone();        System.out.println(cloneTest2);       System.out.println(cloneTest1 == cloneTest2);        System.out.println(cloneTest1.equals(cloneTest2));    }}
输出:

CloneTest{id=0, name='null'}

CloneTest{id=1001, name='li'}
CloneTest{id=1001, name='li'}
false
true

由于Object类中定义了clone()方法,但是权限修饰符为protected,保护类型,只有子类和本类可以访问,想要公开方法就要重写,改成public修饰,所以我们需要重写,底层调用的依然是Object类中的clone方法,

带着问题看输出:

通过反射,调用newInstance方法创建的对象,会调用类中无参的构造方法,可见通过toString方法输出的属性值都是默认值

通过new关键字创建的就不用多说了,想调哪个构造方法就调用哪个

通过调用clone方法我们要好好看看,先看他创建的对象的属性值和cloneTest2的一样,这里我们是通过cloneTest2这个对象调用的clone方法,通过比较两个对象的地址值,和equals得到的值,可以判断出,clone方法其实是复制了一个对象,把之前对象的属性值都复制过来,但是和原来的对象拥有不同的内存地址。

隐式的创建对象很常见,通过直接给String赋值,就是隐式创建了String对象,还有就是用过+连接两个String的引用其实也是隐式的创建String对象(详见另一篇文章:),只不过这是java虚拟机在做的,我们看不到。

转载于:https://www.cnblogs.com/duzhentong/p/7816559.html

你可能感兴趣的文章
ubuntu下安装Apache+PHP+Mysql
查看>>
Bootstrap 过渡效果(Transition)插件
查看>>
[Linux]-Linux 命令大全
查看>>
mysql将查询到的数据导出到Excel
查看>>
Android 切换系统语言源码分析
查看>>
API 调用次数限制实现
查看>>
我的网站搭建 (第十八天) 自定义用户模型
查看>>
排序应该在数据库还是在应用程序中进行?
查看>>
java过滤特殊字符的正则表达式,正则表达式学习
查看>>
VM VirtualBox安装CentOS 7 64位实践
查看>>
如何搭建一个独立博客——简明Github Pages与Hexo教程
查看>>
OC中Category的注意点
查看>>
OC中的布局-九宫格
查看>>
JAVA网络编程:计算机原理学习
查看>>
ARouter解析三:URL跳转本地页面源码分析
查看>>
git 常用操作
查看>>
iReport 中创建JavaBeanDataSource,用java类提供数据源给iReport
查看>>
大数据时代下的生活
查看>>
spring定时任务(方便轻巧)
查看>>
iOS的主要框架介绍
查看>>