文档章节

java 实例化对象的几种姿势

viakiba
 viakiba
发布于 2017/07/23 15:40
字数 358
阅读 8
收藏 0
点赞 0
评论 0

代码里面有注释:

import java.io.*;
import java.lang.reflect.Constructor;

public class Hello implements  Cloneable,Serializable{
    private String str;

    public Hello(String str){
        this.str = str;
    }

    public  Hello(){
        this.str = "class";
    }

    public static void main(String[] args) throws Exception{
        Hello hello = Hello.getInstanceByNew();
        System.out.println(hello.str);
        System.out.println("=============================");
        try{
            Hello instanceByClone = Hello.getInstanceByClone(hello);
            System.out.println(instanceByClone.str);
            System.out.println(hello == instanceByClone);
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("=============================");
        Hello instanceByClass = Hello.getInstanceByClass();
        System.out.println(instanceByClass.str);
        System.out.println("=============================");

        System.out.println("使用无参构造");
        Hello instanceByConstructor = Hello.getInstanceByConstructor();
        System.out.println(instanceByConstructor.str);
        System.out.println("使用有参构造");
        Hello instanceByConstructor2 = Hello.getInstanceByConstructor("有参构造");
        System.out.println(instanceByConstructor2.str);
        System.out.println("=============================");

        /**
         * 首先 设置一个序列化文件位置
         */
        String path = "hello.obj";
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(path));
        Hello xlh = new Hello("序列化");
        objectOutputStream.writeObject(xlh);
        objectOutputStream.close();
        /**
         * 反序列化拿到对象
         */
        Hello instanceBySerializable = Hello.getInstanceBySerializable(path);

        System.out.println(instanceBySerializable.hashCode()+"******************");
        System.out.println(xlh.str);
        System.out.println(instanceBySerializable.str);

        System.out.println("结束");
    }


    /**
     * 使用 new
     */
    public static Hello  getInstanceByNew(){
        return new Hello("new");
    }

    /**
     * 使用 clone 使用此方法 class类需要继承 cloneable 接口
     */
    public static  Hello getInstanceByClone(Hello hello) throws CloneNotSupportedException{
        Hello clone1 = (Hello) hello.clone();
        return clone1;
    }

    /**
     * 使用Class的 newInstance 这个newInstance方法调用无参的构造函数创建对象
     */
    public static Hello getInstanceByClass() throws Exception{
        Hello hello = (Hello) Class.forName("Hello").newInstance();
        return hello;
    }

    /**
     * 使用 构造器 无参函数
     */
    public static Hello getInstanceByConstructor() throws Exception{
        Constructor<Hello> constructor = Hello.class.getConstructor();
        Hello hello = constructor.newInstance();
        return hello;
    }

    /**
     * 使用 构造器 有参函数
     */
    public static Hello getInstanceByConstructor(String str) throws Exception{
        Constructor<Hello> constructor = Hello.class.getConstructor(String.class);
        Hello hello = constructor.newInstance(str);
        return hello;
    }

    /**
     * 使用反序列化 获取实例化对象  对象的类要继承 Serializable 接口表示可以进行序列化
     */
    public static Hello getInstanceBySerializable(String path) throws  Exception{
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(path));
        Object o = objectInputStream.readObject();
        objectInputStream.close();
        System.out.println(o.hashCode()+"******************");
        return  (Hello) o;
    }
}

 

© 著作权归作者所有

共有 人打赏支持
viakiba
粉丝 4
博文 104
码字总数 57889
作品 0
昌平
后端工程师
14、Java并发性和多线程-Java ThreadLocal

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

easonjim ⋅ 2017/06/16 ⋅ 0

java面试必备之ThreadLocal

按照传统的经验,如果某个对象是非线程安全的,在多线程环境下对象的访问需要采用synchronized进行同步。但是模板类并未采用线程同步机制,因为线程同步会降低系统的并发性能,此外代码同步解...

编程老司机 ⋅ 05/16 ⋅ 0

java编程新手入门学习的基础语法

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/28 ⋅ 0

Java 8 停止维护,Java 9 难产,IDEA 2018 发布,还有……

祝大家五一劳动节快乐,工作顺利! 又到了总结上个月干货的时候了,这个月我们带来了各种Java技术干货,各种送书抽奖福利,各种面试题分享,各种最新动态资讯等。 - 5.1重磅活动 区块链免费送...

Java技术栈 ⋅ 04/30 ⋅ 0

两道面试题,带你解析Java类加载机制

文章首发于【博客园-陈树义】,点击跳转到原文《两道面试题,带你解析Java类加载机制》 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: 请写出最后的输出字符...

陈树义 ⋅ 06/12 ⋅ 0

Java堆和栈的区别和介绍以及JVM的堆和栈

Java堆和栈的区别和介绍以及JVM的堆和栈 一、Java的堆内存和栈内存 Java把内存划分成两种:一种是堆内存,一种是栈内存。 堆:主要用于存储实例化的对象,数组。由JVM动态分配内存空间。一个...

代金券优惠 ⋅ 05/24 ⋅ 0

Java堆和栈的区别,JVM的堆和栈的介绍

一、Java的堆内存和栈内存 Java把内存划分成两种:一种是堆内存,一种是栈内存。 堆:主要用于存储实例化的对象,数组。由JVM动态分配内存空间。一个JVM只有一个堆内存,线程是可以共享数据的...

光明辉煌 ⋅ 05/21 ⋅ 0

12、Java并发性和多线程-Java同步块

以下内容转自http://ifeve.com/synchronized-blocks/: Java 同步块(synchronized block)用来标记方法或者代码块是同步的。Java同步块用来避免竞争。本文介绍以下内容: Java同步关键字(s...

easonjim ⋅ 2017/06/15 ⋅ 0

如何计算Java对象所占内存的大小

摘要 本文以如何计算Java对象占用内存大小为切入点,在讨论计算Java对象占用堆内存大小的方法的基础上,详细讨论了Java对象头格式并结合JDK源码对对象头中的协议字段做了介绍,涉及内存模型、...

阿里云云栖社区 ⋅ 05/24 ⋅ 0

两道面试题带你解析 Java 类加载机制

在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Grandpa{ } class Father extends Grandpa{ }class Son extends Father{ }public class Initialization...

⋅ 06/13 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 1

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

CentOS开机启动subversion

建立自启动脚本: vim /etc/init.d/subversion 输入如下内容: #!/bin/bash## subversion startup script for the server## chkconfig: 2345 90 10# description: start the subve......

随风而飘 ⋅ 昨天 ⋅ 0

Nginx + uwsgi @ubuntu

uwsgi 安装 sudo apt-get install python3-pip # 注意 ubuntu python3默认没有安装pippython3 -m pip install uwsgi 代码(test.py) def application(env, start_response): start_res......

袁祾 ⋅ 昨天 ⋅ 0

版本控制工具

CSV , SVN , GIT ,VSS

颖伙虫 ⋅ 昨天 ⋅ 0

【2018.06.19学习笔记】【linux高级知识 13.1-13.3】

13.1 设置更改root密码 13.2 连接mysql 13.3 mysql常用命令

lgsxp ⋅ 昨天 ⋅ 0

LVM

LVM: 硬盘划分分区成物理卷->物理卷组成卷组->卷组划分逻辑分区。 1.磁盘分区: fdisk /dev/sdb 划分几个主分区 输入t更改每个分区类型为8e(LVM) 使用partprobe生成分区的文件:如/dev/sd...

ZHENG-JY ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部