1. 首页
  2. 死磕java容器

第18篇:杂谈 论实例化类的第六种方式

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

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。

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


作者:彤哥读源码

来源:https://www.cnblogs.com/tong-yuan/p/Instantial.html


看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
  4. JS中文网,Javascriptc中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,是给开发者用的 Hacker News,技术文章由为你筛选出最优质的干货,其中包括:Android、iOS、前端、后端等方面的内容。目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。

    本文著作权归作者所有,如若转载,请注明出处

    转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com

    标题:第18篇:杂谈 论实例化类的第六种方式

    链接:https://www.javajike.com/article/1936.html

« 第19篇:死磕 java并发包之AtomicInteger源码分析
第17篇:死磕 java并发包之AtomicStampedReference源码分析(ABA问题详解)»

相关推荐

QR code