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. 检查浏览器url改变,处理ajax前进和后退键

    在用ajax获取数据,不刷新页面情况下,保持前进后退按钮功能,网页端兼容性最好的方式如下: 首先url后面参数用#  如http://www.xxx.com/#txf; 使用改变location.ha ...

  2. MASM32快速起步

    MASM32是一个免费的软件程序,让您编辑Microsoft宏汇编程序(MASM)代码从一个基本的文本界面.它强调MASM代码各部分以不同的颜色,使其更容易扫描和检测错误.它提供了一个简单的布局程序员 ...

  3. shell-3

    每天学习一篇:利用跑代码或者空闲思考时间,启动环境时间等闲杂时间: http://blog.csdn.net/junjieguo/article/category/880326/2

  4. Zigbee折腾之旅:(一)CC2530最小系统

    最近在倒腾Zigbee,准备参加物联网全国大赛,学校有给我们发Zigbee开发板,但是对于喜欢折腾的我来说,用开发板还是不过瘾,起码也得知道怎么去画一块板子.于是乎,在百度一番后就有了下面这篇文章. ...

  5. JQuery和Ajax在ASP.NET MVC中的基本应用

    当我们在开发Web应用程序中使用JQuery和Ajax异步调用来实现很多功能时,不仅提高了程序的性能,而且给用户一个更好的交互式界面操作体验.接下来我们依旧用简单的实例来学习下它们的应用. 创建一个A ...

  6. Log日志规范

    Overview 一个在生产环境里运行的程序如果没有日志是很让维护者提心吊胆的,有太多杂乱又无意义的日志也是令人伤神.程序出现问题时候,从日志里如果发现不了问题可能的原因是很令人受挫的.本文想讨论的是 ...

  7. hibernate中save()、update()、saveOrUpdate()的区别

    save()方法很显然是执行保存操作的,如果是对一个新的刚new出来的对象进行保存,自然要使用这个方法了,数据库中没有这个对象. update()如果是对一个已经存在的托管对象进行更新那么肯定是要使用 ...

  8. CK editor 制作 ”小“plugin

    ckeditor 是什么? http://ckeditor.com/ 这工具里有大量他人写好的功能(plugin),如果要求不高,会找到的.但是我就是没有找到... 需求: ·自己制作一个小功能,可以 ...

  9. C++ 友元函数的函数指针

    成员函数的指针 讲友元之前先讲普通的成员函数的函数指针 class Std_interface { public: virtual void suspend() = 0; }; // define t ...

  10. Javascript中关于作用域和闭包和域解释的面试题

    <script type="text/javascript"> function fn() { var i = 10; return function (n) { co ...