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类的实例对象。构造器所充当的角色是完成初始化,以防止”不安全”所带来的昂贵编程代价。

new表达式如何创建对象的更多相关文章

  1. OGNL表达式介绍

    OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存 ...

  2. (转)OGNL表达式介绍

    OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存 ...

  3. Lambda表达式与函数式接口

    Lambda表达式的类型,也被称为目标类型(targer type),Lambda表达式的目标类型必须是"函数式接口(functional interface)".函数式接口代表只 ...

  4. 笔记《JavaScript 权威指南》(第6版) 分条知识点概要3—表达式和运算符

    [表达式和运算符]原始表达式,初始化表达式(对象和数组的),函数定义表达式,属性访问表达式,调用表达式,对象创建表达式,运算符概述,算术表达式,关系表达式,逻辑表达式,赋值表达式,表达式计算,其他运算 ...

  5. 7 -- Spring的基本用法 -- 12... Spring 3.0 提供的表达式语言(SpEL)

    7.12 Spring 3.0 提供的表达式语言(SpEL) Spring表达式语言(简称SpEL)是一种与JSP 2 的EL功能类似的表达式语言,它可以在运行时查询和操作对象图.支持方法调用和基本字 ...

  6. <JAVA8新增内容>关于匿名内部集合和lambda表达式

    要想说清楚JAVA中的Lambda表达式,必须想讲一下匿名内部类来帮助理解本质. 一.匿名内部类 匿名内部类适合创建那种只需要一次使用的类,例如前面介绍命令模式时所需要的Command对象,匿名内部类 ...

  7. 0036 Java学习笔记-多线程-创建线程的三种方式

    创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...

  8. Java基础必备 -- 堆栈、引用传值、垃圾回收等

     在Java中,对象作为函数参数的传递方式是值传递还是引用传递?String str = "abc" 与 String str = new String("abc&quo ...

  9. 简洁既是美—用while语句复制数组

    简洁既是美,程序员应尽量尝试编写简洁的表达式,争取用简单的代码来实现更多的功能,当然,这也要看情况了(有时候也得考虑程序运行的时间嘛). 在阅读C++Prime Plus到while语句时有一个讲一个 ...

随机推荐

  1. 一个想法(续六):IT联盟创业计划:如何进行找钱、寻人、做事?

    前言: 不知时间过的快,或是慢,一周过去了,在这一周,基本是围绕着创业这事在折腾. 也在看一些和创业相关的文章,不小心就看到了dudu在2007年呼喊创业的口号. 于是把他那一年的博文都给看了: 看着 ...

  2. 极光推送-Java后台实现方式一:Http API

    Java后台实现极光推送有两种方式,一种是使用极光推送官方提供的推送请求API:https://api.jpush.cn/v3/push,另一种则是使用官方提供的第三方Java APIjar包,这里先 ...

  3. Java Web(十) JDBC的增删改查,C3P0等连接池,dbutils框架的使用

    前面做了一个非常垃圾的小demo,真的无法直面它,菜的抠脚啊,真的菜,好好努力把.菜鸡. --WH 一.JDBC是什么? Java Data Base Connectivity,java数据库连接,在 ...

  4. 20155304田宜楠2006-2007-2 《Java程序设计》第一周学习总结

    20155304田宜楠2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 - 浏览教材,根据自己的理解每章提出一个问题 第一章 除了书上提到的开发工具还有什么适合 ...

  5. Python脚本收集腾讯云CDN日志,并入ELK日志分析

    负责搭建公司日志分析,一直想把CDN日志也放入到日志分析,前些日志终于达成所愿,现在贴出具体做法: 1.收集日志 腾讯云CDN日志一般一小时刷新一次,也就是说当前只能下载一小时之前的日志数据,但据本人 ...

  6. Java 内部类详解

    什么 定义在一个类内部的类,称为内部类(累不累),如下: public class A { private int c = 1; public class C { public void test() ...

  7. 使用postfix在debian上配置邮件服务器

    如果debian中安装了exim4,先卸载exim4: apt-get remove exim4 安装postfix apt-get install postfix 安装完成后就可以测试下,PHP代码 ...

  8. 巧用*_his表记录操作历史

    文章转载自「开发者圆桌」一个关于开发者入门.进阶.踩坑的微信公众号 许多OLTP应用的开发者都知道,一些重要的操作要记录操作历史,把操作前的数据备份到历史表,然后再执行相应的修改操作.这样可以获取某个 ...

  9. hibernate jar包介绍

    Hibernate3.jar            这个是hibernate最主要的jar包 ant-1.63.jar      Ant 的核心包,在构建Hibernate 时会用到 antlr-2. ...

  10. KoaHub平台基于Node.js开发的Koa的skip插件代码详情

    koahub-skip koahub skip middleware koahub skip Conditionally skip a middleware when a condition is m ...