1、创建数组时,不使用new操作符

Person [] a;
a[0]=new Person(); //Error:variable a might not have been initialized

  

  2、创建对象时,不使用new操作符

Person pe=Person();
pe.talk(); //Error: cannot find symbol
// symbol: method Person()
// location: class test.DataAbstract Person pe;
pe.talk(); //Error: variable pe might not have been initialized

  我一直有个困惑,书上说对象的创建3个部分,包括类的加载、对象内存的分配和变量的初始化。官方文档上关于new具体做了什么是这样描述的:

  The new operator instantiates a class by allocating memory for a new object and returning a reference to that memory.The new operator also invokes the object constructor.

  可以肯定的是,“new Person()”返回的是实例对象的内存空间首地址,可以打印出来的。new作为一个优先级很高的运算符,它的结合性是从右到左,这里它操作的是Person类的构造方法。

  好,让我们回到构造方法的定义。

  “构造方法是一类特殊的方法,它的名字必须与类名完全相同,且不返回任何数据类型,不能有任何非访问性质的修饰符,也不能用void修饰。”

  “构造方法通过new操作符创建对象时被调用。”

  书上还说,用一下代码,可以“先创建对象,后初始化对象”:

Person pe;
pe=new Person();

  所以到底是谁他妈创建了对象?pe不就是一个Person类型的引用变量吗,最终存储的也只是对象的内存地址啊。

  查了很久的资料,可以肯定了,构造方法不返回任何东西!不返回类的实例!不返回类的实例!!它的主要工作是初始化已经创建的实例(应该还为实例的创建提供了类的类型)。

  以下是选的部分回答:(StackOverflow

  "The Suns' Java tutorial stands that "The new operator is followed by a call to a constructor, which initializes the new object."Initialize does not mean create.“

  The AllocObject function documentation stands that "Allocates a new Java object without invoking any of the constructors for the object. Returns a reference to the object." So in JVM object is not allocated by constructor, but only initialized by it. Looking in constructors' bytecode we are seeing that no object is returned (exactly like in void methods).

  所以new操作符才是大哥,new操作符的操作数必须是Constructor,new负责动态分配内存,调用Constructor(并把参数传给它进行初始化),最后返回初始化后的instance的内存空间的首地址。

  构造器本质上是个"nonstatic method with name <init> and void return type",只不过这个函数已经不是java语言的一部分了。

  在另一个回答中,有人对用new创建类实例对象的的机器码(StackOverflow)。

  总结起来就是:new动态分配内存(应该根据类型),调用Constructor,Constructor进行初始化,返回内存首地址。

  至于调用操作和返回操作到底应不应该算在new头上(或者JVM?),已经不重要了。重要的是,构造器没有返回任何东西,只是初始化了已经创建的实例。

  最后贴一个来自bd知道的回答:

  例:Date date1 = new Date();

  1. 执行这段代码,虚拟机先查找Date.class文件是否已加载,如果已加载直接跳转到第3步,如果没有则从classPath和相对路径等查找,查找方式由classLoader决定。
  2. 找到Date.class文件,虚拟机将Date.class文件加载到内存,解析出class类和注解等元信息,虚拟机保证每个Date.class文件只加载一次。
  3. 在堆中申请内存空间存放Date的实例同时进行变量的初始化(类的不同实例只有变量部分不同,方法共享同一份内存),调用无参构造方法Date()进行初始化。
  4. 在栈中申请内存空间存放date1句柄变量,将初始化后的实例句柄赋予date1变量。

  

Java new运算符解析的更多相关文章

  1. Java 面试知识点解析(四)——版本特性篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  2. java jar包解析:打包文件,引入文件

    java jar包解析:打包文件,引入文件 cmd下: jar命令:package包打包 javac命令:普通类文件打包 Hello.java: package org.lxh.demo; publi ...

  3. Java构造和解析Json数据的两种方法详解二

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面接着介绍用org.json构造和解析Jso ...

  4. java集合框架之java HashMap代码解析

     java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/arti ...

  5. Java注解全面解析(转)

    1.基本语法 注解定义看起来很像接口的定义.事实上,与其他任何接口一样,注解也将会编译成class文件. @Target(ElementType.Method) @Retention(Retentio ...

  6. java移位运算符具体解释

    java移位运算符不外乎就这三种:<<(左移).>>(带符号右移)和>>>(无符号右移). 1. 左移运算符 左移运算符<<使指定值的全部位都左移 ...

  7. 单例模式——Java EE设计模式解析与应用

    单例模式 目录: 一.何为单例 二.使用Java EE实现单例模式 三.使用场景 一.何为单例 确保一个类只有一个实例,并且提供了实例的一个全局访问点 1.1 单例模式类图               ...

  8. Java XML Dom解析工具

    Java XML Dom解析工具 缩进等 transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); ...

  9. Java 面试知识点解析(二)——高并发编程篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

随机推荐

  1. Robot Framework自动化测试(一)--- 安装

    所需环境: 1.python 2.robotframework https://pypi.python.org/pypi/robotframework/2.8.5#downloads 3.wxPyth ...

  2. 微信小程序设置全局变量

    为了提高程序的可用性我们在做项目的时候一定要设置全局变量 微信小程序里面有个app.js,我们可以在这个里面设置全局变量, globalData:{ userInfo:null, test:" ...

  3. R语言:时间的转化

    一般使用R从数据库导出来的时间数据一般都不是我们能看的懂的(具体是什么格式的我也忘记了),需要做如下转化 as.Date(time,origin = '1970-01-01') 最近从网上爬下来的时间 ...

  4. java_切面日志

    切面日志举例 package com.keyba1; import java.lang.annotation.ElementType; import java.lang.annotation.Rete ...

  5. Android res之shape

    xml控件配置属性 android:background="@drawable/shape" 标签 corners ----------圆角gradient ----------渐 ...

  6. 1、WebSphere Application Server的下载以及安装

    最近在做农行相关的项目,我们的后台需要发布到农行WebSphere Application Server上,因此学习一下: 一.WebSphere 是什么? WebSphere 为 SOA (面向服务 ...

  7. background-color 属性

    background-color:transparent;是什么意思?? 把背景颜色设为透明色

  8. Redis常见报错之 Redis::CommandError (MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk)

    在Redis运行过程中,报错信息如下: Redis::CommandError (MISCONF Redis is configured to save RDB snapshots, but it i ...

  9. MySQL随机字符串函数批量插入数据

      简单举个例子: drop table if exists demo1 create table demo1 ( id int primary key auto_increment, name ) ...

  10. OpenID简介

    OpenID 是一个以用户为中心的数字身份识别框架,它具有开放.分散性.OpenID 的创建基于这样一个概念:我们可以通过 URI (又叫 URL 或网站地址)来认证一个网站的唯一身份,同理,我们也可 ...