文档章节

闲谈实例化类的第六种方式

我叫小糖主
 我叫小糖主
发布于 05/20 11:40
字数 517
阅读 6
收藏 0

你知道几种实例化一个类的方式?

new?反射?还有呢?

笔者总结了一下大概有以下六种方式:

(1)通过构造方法实例化一个类;

(2)通过Class实例化一个类;

(3)通过反射实例化一个类;

(4)通过克隆实例化一个类;

(5)通过反序列化实例化一个类;

(6)通过Unsafe实例化一个类;

Let us 直接上代码:

public class InstantialTest {

    private static Unsafe unsafe;
    static {
        try {
            Field f = Unsafe.class.getDeclaredField("theUnsafe");
            f.setAccessible(true);
            unsafe = (Unsafe) f.get(null);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) throws Exception {
        // 1. 构造方法
        User user1 = new User();
        // 2. Class,里面实际也是反射
        User user2 = User.class.newInstance();
        // 3. 反射
        User user3 = User.class.getConstructor().newInstance();
        // 4. 克隆
        User user4 = (User) user1.clone();
        // 5. 反序列化
        User user5 = unserialize(user1);
        // 6. Unsafe
        User user6 = (User) unsafe.allocateInstance(User.class);

        System.out.println(user1.age);
        System.out.println(user2.age);
        System.out.println(user3.age);
        System.out.println(user4.age);
        System.out.println(user5.age);
        System.out.println(user6.age);
    }

    private static User unserialize(User user1) throws Exception {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D://object.txt"));
        oos.writeObject(user1);
        oos.close();

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D://object.txt"));
        // 反序列化
        User user5 = (User) ois.readObject();
        ois.close();
        return user5;
    }

    static class User implements Cloneable, Serializable {
        private int age = 20;

        public User() {
            this.age = 10;
        }

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

先不要急着往下看,你猜猜上面六种方式打印语句输出各是多少?

不要看!

不要看!

不要看!

最后打印的结果是这样:

10
10
10
10
10
0

意不意外?惊不惊喜?

最后一种通过Unsafe实例化的类,里面的age的值竟然是0,而不是10或者20。

这是因为调用Unsafe的allocateInstance()方法只会给对象分配内存,并不会初始化对象中的属性,所以int类型的默认值就是0。

还有其它方式实例化类吗?欢迎补充!

© 著作权归作者所有

我叫小糖主
粉丝 7
博文 46
码字总数 54334
作品 0
大渡口
私信 提问
Android 几种常用的设计模式之单例

一:单例模式 第一种(懒汉,线程不安全): public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instanc......

恒源祥
2016/12/02
9
0
Java设计模式之单例模式(七种写法)

第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: 第二种,懒汉式,lazy初始化,线程安全: 优点:第一次调用才初始化,避免内存浪费。 缺点:必须加锁 synchronized 才能保证单例...

SiberianDante
2018/01/02
0
0
单例模式是设计模式中最简单的形式之一

单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例...

飞你不可
2017/03/13
0
0
Java 单例模式 总结整理

分享总结常见的5种单例模式: 第一、单例模式的使用场景 A、Windows的任务管理器、回收站、文件系统如F盘,都是很典型的单例模式 ; B、项目中,读取配置文件的类,一般也是单例模式,没有必...

故新
2017/11/09
0
0
java 单列模式的7种写法

第一种(懒汉,线程不安全): 1 public class Singleton { 2 private static Singleton instance; 3 private Singleton (){} 4 public static Singleton getInstance() { 5 if (instance ==......

zh151832
2016/08/21
24
0

没有更多内容

加载失败,请刷新页面

加载更多

Knative Service 之流量灰度和版本管理

本篇主要介绍 Knative Serving 的流量灰度,通过一个 rest-api 的例子演示如何创建不同的 Revision、如何在不同的 Revision 之间按照流量比例灰度。 部署 rest-api v1 代码 测试之前我们需要...

阿里云云栖社区
35分钟前
2
0
代码管理平台git

22.5/22.6 单机上使用git 22.7 简历远程仓库 22.8 克隆远程仓库 22.9 分支管理 22.10 远程分支管理 22.11 标签管理 22.12 git别名 22.13 搭建git服务器 22.14/22.15 安装gitlab 22.16 使用g...

tobej
36分钟前
1
0
压测某HR系统,遇到的坑

遇到的问题:当多个线程组公用一个公共模块功能的时候(登录生成的cookies信息,文件的写入操作),此时出现跨域问题 场景分析: 跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的...

覃光林
37分钟前
2
0
学习k8s——基本架构

对部署流水线有了个大致的认知之后,开始学习k8s k8s的基本架构 kubernateskubernates这个单词起源于古希腊,是舵手的意思,所以它的logo既像一个渔网,又像一个罗盘。K8S是它的缩写,用“8...

啊哈关关
48分钟前
1
0
好程序员分享JavaScrip数组去重操作实例小结

好程序员分享JavaScrip数组去重操作实例小结,这篇文章主要介绍了JavaScrip数组去重操作,结合实例形式总结分析了javascript针对数组的遍历、判断、去重等相关操作技巧,需要的朋友可以参考下。...

好程序员IT
54分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部