文档章节

Java创建对象的几种方法

王孟君
 王孟君
发布于 2016/11/19 16:02
字数 1287
阅读 1377
收藏 82
点赞 7
评论 2

有时候,也可能碰到这样面试题,如:

Java创建对象有哪几种方法

除了new之外,java创建对象还有哪几种方式

本文结合例子,给出几种Java创建对象的方法,Here we go~~~~

使用new创建

这是最常用的一种。如:

Book book = new Book();

示例如下:

package test;

import java.io.Serializable;
import java.util.List;

/**
 * @author wangmengjun
 *
 */
public class Book implements Serializable{

    private static final long serialVersionUID = -6212470156629515269L;

    /**书名*/
    private String name;

    /**作者*/
    private List<String> authors;

    /**ISBN*/
    private String isbn;

    /**价格*/
    private float price;

    public Book() {
    }

    /**
     * @param name
     * @param authors
     * @param isbn
     * @param price
     */
    public Book(String name, List<String> authors, String isbn, float price) {
        this.name = name;
        this.authors = authors;
        this.isbn = isbn;
        this.price = price;
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return the authors
     */
    public List<String> getAuthors() {
        return authors;
    }

    /**
     * @param authors the authors to set
     */
    public void setAuthors(List<String> authors) {
        this.authors = authors;
    }

    /**
     * @return the isbn
     */
    public String getIsbn() {
        return isbn;
    }

    /**
     * @param isbn the isbn to set
     */
    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }

    /**
     * @return the price
     */
    public float getPrice() {
        return price;
    }

    /**
     * @param price the price to set
     */
    public void setPrice(float price) {
        this.price = price;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "Book [name=" + name + ", authors=" + authors + ", isbn=" + isbn + ", price="
                + price + "]";
    }

}
        /**
         * 1. 使用new创建对象
         */
        Book book1 = new Book();
        book1.setName("Redis");
        book1.setAuthors(Arrays.asList("Eric", "John"));
        book1.setPrice(59.00f);
        book1.setIsbn("ABBBB-QQ677868686-HSDKHFKHKH-2324234");
        System.out.println(book1);

使用object.clone()

如果要调用clone方法,那么该object需要实现Cloneable接口,并重写clone()方法。

修改后的Book类如下:

package test;

import java.io.Serializable;
import java.util.List;

/**
 * @author wangmengjun
 *
 */
public class Book implements Serializable, Cloneable {

    private static final long serialVersionUID = -6212470156629515269L;

    /**书名*/
    private String name;

    /**作者*/
    private List<String> authors;

    /**ISBN*/
    private String isbn;

    /**价格*/
    private float price;

    public Book() {
    }

    /**
     * @param name
     * @param authors
     * @param isbn
     * @param price
     */
    public Book(String name, List<String> authors, String isbn, float price) {
        this.name = name;
        this.authors = authors;
        this.isbn = isbn;
        this.price = price;
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return the authors
     */
    public List<String> getAuthors() {
        return authors;
    }

    /**
     * @param authors the authors to set
     */
    public void setAuthors(List<String> authors) {
        this.authors = authors;
    }

    /**
     * @return the isbn
     */
    public String getIsbn() {
        return isbn;
    }

    /**
     * @param isbn the isbn to set
     */
    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }

    /**
     * @return the price
     */
    public float getPrice() {
        return price;
    }

    /**
     * @param price the price to set
     */
    public void setPrice(float price) {
        this.price = price;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "Book [name=" + name + ", authors=" + authors + ", isbn=" + isbn + ", price="
                + price + "]";
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return (Book) super.clone();
    }

}

测试代码

        /**
         * 1. 使用new创建对象
         */
        Book book1 = new Book();
        book1.setName("Redis");
        book1.setAuthors(Arrays.asList("Eric", "John"));
        book1.setPrice(59.00f);
        book1.setIsbn("ABBBB-QQ677868686-HSDKHFKHKH-2324234");
        System.out.println(book1);

        /**
         * 2. 使用clone创建对象
         */
        try {
            Book book2 = (Book) book1.clone();
            System.out.println(book2);
        } catch (CloneNotSupportedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

使用Class.newInstance()

可以直接使用Class.forName("xxx.xx").newInstance()方法或者XXX.class.newInstance()完成。

        /**
         * 3. 使用Class.newInstance();
         */
        try {
            Book book3 = (Book) Class.forName("test.Book").newInstance();
            System.out.println(book3);

            book3 = Book.class.newInstance();
            System.out.println(book3);
        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

使用Contructor.newInstance()

可以指定构造器来创建,如选择第一个构造器创建;也可以指定构造函数参数类型来创建。

 

        /**
         * 4. 使用Constructor.newInstance();
         */
        try {
            //选择第一个构造器创建Book
            Book book4 = (Book) Book.class.getConstructors()[0].newInstance();
            //Book [name=null, authors=null, isbn=null, price=0.0]
            System.out.println(book4);

            /**
             * 调用指定构造函数创建对象
             */
            book4 = (Book) Book.class.getConstructor(String.class, List.class, String.class,
                    float.class).newInstance("New Instance Example", Arrays.asList("Wang", "Eric"),
                    "abc1111111-def-33333", 60.00f);
            //Book [name=New Instance Example, authors=[Wang, Eric], isbn=abc1111111-def-33333, price=60.0]
            System.out.println(book4);
        } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
                | InvocationTargetException | SecurityException | NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

使用Class.newInstance()或者Contructor.newInstance(),其本质是一样的,都采用了反射机制。

使用反序列化


        /**
         * 5. 使用反序列化
         */
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("book.dat"));
                ObjectInputStream ois = new ObjectInputStream(new FileInputStream("book.dat"));) {
            oos.writeObject(book1);

            Book book5 = (Book) ois.readObject();
            System.out.println(book5);

        } catch (IOException | ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

 

当然了,除了上述几种方式之外,还可以使用JNI等方式来创建对象,这边就不一一列举了。

完整的示例代码如下:

Book.java

package test;

import java.io.Serializable;
import java.util.List;

/**
 * @author wangmengjun
 *
 */
public class Book implements Serializable, Cloneable {

    private static final long serialVersionUID = -6212470156629515269L;

    /**书名*/
    private String name;

    /**作者*/
    private List<String> authors;

    /**ISBN*/
    private String isbn;

    /**价格*/
    private float price;

    public Book() {
    }

    /**
     * @param name
     * @param authors
     * @param isbn
     * @param price
     */
    public Book(String name, List<String> authors, String isbn, float price) {
        this.name = name;
        this.authors = authors;
        this.isbn = isbn;
        this.price = price;
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return the authors
     */
    public List<String> getAuthors() {
        return authors;
    }

    /**
     * @param authors the authors to set
     */
    public void setAuthors(List<String> authors) {
        this.authors = authors;
    }

    /**
     * @return the isbn
     */
    public String getIsbn() {
        return isbn;
    }

    /**
     * @param isbn the isbn to set
     */
    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }

    /**
     * @return the price
     */
    public float getPrice() {
        return price;
    }

    /**
     * @param price the price to set
     */
    public void setPrice(float price) {
        this.price = price;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "Book [name=" + name + ", authors=" + authors + ", isbn=" + isbn + ", price="
                + price + "]";
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return (Book) super.clone();
    }

}

CreateObjectExample.java

package test;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.List;

/**
 * @author wangmengjun
 *
 */
public class CreateObjectExample {

    public static void main(String[] args) {
        /**
         * 1. 使用new创建对象
         */
        Book book1 = new Book();
        book1.setName("Redis");
        book1.setAuthors(Arrays.asList("Eric", "John"));
        book1.setPrice(59.00f);
        book1.setIsbn("ABBBB-QQ677868686-HSDKHFKHKH-2324234");
        System.out.println(book1);

        /**
         * 2. 使用clone创建对象
         */
        try {
            Book book2 = (Book) book1.clone();
            System.out.println(book2);
        } catch (CloneNotSupportedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        /**
         * 3. 使用Class.newInstance();
         */
        try {
            Book book3 = (Book) Class.forName("test.Book").newInstance();
            System.out.println(book3);

            book3 = Book.class.newInstance();
            System.out.println(book3);
        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        /**
         * 4. 使用Constructor.newInstance();
         */
        try {
            //选择第一个构造器创建Book
            Book book4 = (Book) Book.class.getConstructors()[0].newInstance();
            //Book [name=null, authors=null, isbn=null, price=0.0]
            System.out.println(book4);

            /**
             * 调用指定构造函数创建对象
             */
            book4 = (Book) Book.class.getConstructor(String.class, List.class, String.class,
                    float.class).newInstance("New Instance Example", Arrays.asList("Wang", "Eric"),
                    "abc1111111-def-33333", 60.00f);
            //Book [name=New Instance Example, authors=[Wang, Eric], isbn=abc1111111-def-33333, price=60.0]
            System.out.println(book4);
        } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
                | InvocationTargetException | SecurityException | NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        /**
         * 5. 使用反序列化
         */
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("book.dat"));
                ObjectInputStream ois = new ObjectInputStream(new FileInputStream("book.dat"));) {
            oos.writeObject(book1);

            Book book5 = (Book) ois.readObject();
            System.out.println(book5);

        } catch (IOException | ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

 

© 著作权归作者所有

共有 人打赏支持
王孟君

王孟君

粉丝 214
博文 94
码字总数 221044
作品 0
杭州
高级程序员
加载中

评论(2)

星一
星一
66
风中飘零
风中飘零
谢谢。支持下
Android———利用JDBC连接服务器数据库

1、Android平台下与服务器数据库通信的方法 在Android平台下,连接电脑服务器的MySQL、PostgreSQL、Oracle、Sybase、Microsoft SQLServer等数据库管理系统DBMS(database management system),...

xiahuawuyu
2012/10/10
0
1
14、Java并发性和多线程-Java ThreadLocal

以下内容转自http://ifeve.com/java-theadlocal/: Java中的ThreadLocal类可以让你创建的变量只被同一个线程进行读和写操作。因此,尽管有两个线程同时执行一段相同的代码,而且这段代码又有...

easonjim
2017/06/16
0
0
Objective-C入门(三)Foundation框架初探

Foundation之于Objective-C就好比Java中SDK类库之于Java。 这个框架提供了基本的Objective-C的类,最重要的根类,NSObject,它定义了基本的对象行为。 框架包括了各种基本数据类型、集合,操...

李海珍
2013/01/12
0
0
线上应用故障排查之二:高内存占用

搞Java开发的,经常会碰到下面两种异常: 1、java.lang.OutOfMemoryError: PermGen space 2、java.lang.OutOfMemoryError: Java heap space 要详细解释这两种异常,需要简单重提下Java内存模...

MZHS
2015/11/13
0
0
Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结

java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都出于以下原因:JVM内存过小、程序不严密,产生了过多的垃圾。 导致OutOfMemoryError异常的常见原因...

lcdmusic
2015/01/20
0
0
Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结

一,java开发中: java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都出于以下原因:JVM内存过小、程序不严密,产生了过多的垃圾。 导致OutOfMemory...

今日竹石
2014/04/17
0
0
Java虚拟机(JVM)(自动内存管理机制)

简介 Java虚拟机(JVM)是Java应用的运行环境,从一般意义上来讲,JVM是通过规范来定义的一个虚拟的计算机,被设计用来解释执行从Java源码编译而来的字节码。 体系结构 JVM主要有子系统和内存...

亚特兰缇斯
2015/03/05
0
0
115个Java面试题和答案——终极列表(上)

本文我们将要讨论Java面试中的各种不同类型的面试题,它们可以让雇主测试应聘者的Java和通用的面向对象编程的能力。下面的章节分为上下两篇,第一篇将要讨论面向对象编程和它的特点,关于Jav...

LCZ777
2014/04/23
0
0
【转】115个Java面试题和答案——终极列表

本文我们将要讨论Java面试中的各种不同类型的面试题,它们可以让雇主测试应聘者的Java和通用的面向对象编程的能力。下面的章节分为上下两篇,第一篇将要讨论面向对象编程和它的特点,关于Jav...

一只死笨死笨的猪
2014/09/30
0
0
【易错】对象锁 & 类锁(二)

一、synchronized关键字 synchronized关键字有如下几种用法: 非静态方法或静态方法上加入关键字synchronized; 使用synchronized(对象/this/类.class)静态快; 下面对上述两种情况进行区分。...

大白来袭
2017/07/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

(转)SQL语句的执行顺序

(7) SELECT (8) DISTINCT <select_list> (1) FROM <left_table> (3) <join_type> JOIN <right_table> (2) ON <join_condition> (4) WHERE <where_condition> (5) GROUP BY <group_by_list> (......

Avner
14分钟前
0
0
1.14 救援模式

确保开机启动时连接镜像文件,如果是真机服务器,就需要:U盘或光盘镜像启动进入BIOS 不同主板进入bios按键不同,一般是F12或Esc 光标:移动到Boot(开机启动项) 减号移动:光标选中行,按-...

小丑鱼00
21分钟前
0
0
ES11-全文检索

高级别全文检索通常用于在全文本字段(如电子邮件正文)上运行全文检索。 他们了解如何分析被查询的字段,并在执行之前将每个字段的分析器(或search_analyzer)应用于查询字符串。 1.term查...

贾峰uk
25分钟前
0
0
java 复制对象有哪些方式

java 复制对象有哪些方式 Apache的 Common beanutils库 org.apache.commons.beanutils.BeanUtils.copyProperties(dest,origin); Springframework 的BeanUtil 依赖: <dependency> ......

黄威
40分钟前
1
0
jstack的简单使用

公司测试反应, 一个java应用的机器, 即使不做交易, cpu始终是30%多, 于是想到了jstack, 实践步骤记录一下: 1, 找出java应用的进程号 ps -ef|grep 应用名|grep -v grep 2, 找出pid下的cpu占用...

零二一七
47分钟前
1
0
崛起于Springboot2.X之项目war打包部署(18)

将springboot项目打包步骤: 1、启动类 extends SpringBootServletInitializer 2、启动类添加覆盖方法 @Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder......

木九天
56分钟前
2
0
导入CSV文件就行数据整理分析

#-*-coding:utf-8-*-import csv,os,re,mathlocalPath=input("请输入所有群文件的根目录:") #所有QQ群文件的物理根目录路径def info(): info_dic=[] dirList=os.listdi...

Kefy
今天
5
0
CoreText进阶(六)-内容大小计算和自动布局

CoreText进阶(六)-内容大小计算和自动布局 其它文章: CoreText 入门(一)-文本绘制 CoreText入门(二)-绘制图片 CoreText进阶(三)-事件处理 CoreText进阶(四)-文字行数限制和显示更...

aron1992
今天
1
0
一个Unity高人的博客,涉猎范围很广,深度也很深。

https://blog.csdn.net/ecidevilin/article/list/

爽歪歪ES
今天
0
0
Spring Cloud Config-Git后端

EnvironmentRepository的默认实现使用Git后端,这对于管理升级和物理环境以及审核更改非常方便。要更改存储库的位置,可以在Config Server中设置“spring.cloud.config.server.git.uri”配置...

itcloud
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部