new表达式如何创建对象

前言

刚学java时曾一度认为,构造器中this指向是当前类型的对象,当我们调用new表达式时,由父类的构造器生成对象的一部分并初始化,然后再由子类的构造器补充成完整的对象并初始化。之后,当遇到下面这段代码时,实在颠覆了三观。明白之前实在是错乱的离谱。

这段代码通过反射从子类中获取到了泛型的信息,但是,构造器中的this到底指向的是哪个对象?如果指向的是当前所属类型的对象,是完全不可能获取到子类的泛型信息的。

在深入查找问题之前,首先来补充点知识,最初,是由C++引入了构造器(constructor)这一概念,是在创建对象时被自动调用的特殊方法。(说其特殊,是因为该方法没有返回值,与返回值为(void)是不同的,尽管后者还是可以返回一些东西,但前者完全是空的返回。)之后Java采用了构造器,并提供了”垃圾回收器”。构造器出现,可以确保当前的每一个对象都被初始化到,以正常地使用库等等,不然可以想象,到处都是需要初始化的变量或者没有初始化到的变量,以及一堆不知道如何初始化的构件对象。这样的,会使得编程更加的复杂,难以使用已有代码。

接着来看一句话:

In Java, creation and initialization are unified concepts-you can’t have one without the other.——《Think in Java》

就是说,Java的创建和初始化是捆绑在一起的。比如,如果我们把缺省的构造方法干掉,而不存在其他构造器。那么编译器就会告诉你,你错了,必须得有一个构造器来执行初始化的工作。那么当我们调用new表达式,便会有两个步骤,一是创建对象、二是初始化。或许你会想,这两个步骤是一起进行的,但是其实是分开,相对独立。进一步说,就是当我们调用new表达式,这个看似”整体”的表达式时,其实先后执行了两个步骤,创建对象、然后初始化。创建对象这个步骤在调用最顶层的父类构造器之前便完成了,如上面代码,Person()构造器中第1行输出的this指向的People类的实例对象。构造器所充当的角色是完成初始化,以防止”不安全”所带来的昂贵编程代价。

最新文章

  1. 主流 SQLServer 迁移到 MySQL 工具对比
  2. PAT 1003. 我要通过!(20) JAVA
  3. jquery轻松操作CSS样式
  4. truncate与delete 、drop的区别
  5. sys.argv[]用法
  6. Objective-C 字典、可变字典
  7. 常用Json
  8. BZOJ 2463: [中山市选2009]谁能赢呢?(博弈论)
  9. Navicat连接阿里云Mysql遇到的的坑
  10. [poj3904]Sky Code_状态压缩_容斥原理
  11. Java提高班(一)Thread详解
  12. 写个.net开发者的Linux迁移指南
  13. django.db.utils.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: ...
  14. django2 用iframe标签完成 网页内嵌播放b站视频功能
  15. lucene之中文分词及其高亮显示(五)
  16. LOJ 2546 「JSOI2018」潜入行动——树形DP
  17. Leetcode——258.各位相加【水题】
  18. zabbix系列(八)zabbix添加对web页面url的状态监控
  19. SPOJ - NSUBSTR(长度为1-len的字串出现的最大次数
  20. 浅谈sql中的in与not in,exists与not exists的区别以及性能分析

热门文章

  1. DLL 导出类
  2. AntData.ORM框架 之DBModel CodeGen如何使用
  3. 浅谈V8引擎中的垃圾回收机制
  4. 【openstack N版】——可视化服务horizon
  5. SQL Server 2008R2 企业版 百度云下载地址
  6. error LNK2001: unresolved external symbol __beginthreadex
  7. 数字化工厂ERP解决方案
  8. tp框架基础知识
  9. Java Trie树
  10. .NET中的repeater简介及分页效果