先说明一点,这篇帖子的内容都是我自己思考的结果,如有误,请务必及时告诉我,非常感谢。

起由:

public class NewThread implements Runnable{
Thread t;
NewThread(){
t = new Thread(this, "Demo Thread");
System.out.println("Child thread: " + t);
t.start(); // Start the thread
} @Override
public void run(){
System.out.println("the thread is running");
}
}

个中详情不必细说,总之我的第一反应就是:卧槽,构造方法中也可以使用this!!!为什么??

然后认真想了下,又想到C++中类的构造,还真可以。

C++中的构造过程是这样的:

  先按照成员的大小分配空间,再默认初始化(如果有显式初始化列表,那就通过初始化列表的数据进行初始化),最后执行构造体中的内容。

  如果构造体中有赋值语句,那么整个过程就等于初始化之后再进行赋值!!

举个栗子:

 #include <iostream>
#include <stdlib.h>
#include <string.h> using namespace std; class A
{
public:
int age;
char name[];
public:
A(){};
~A(){};
};
class B
{
public:
int age;
char name[];
public:
B():age(),name{'a','b','c'}{}; //c++11,非类类型的初始化列表必须没有()
~B(){};
};
class C
{
public:
int age;
char name[];
public:
C():age(),name{'a','b','c'}{ //c++11,非类类型的初始化列表必须没有()
age = ;
// name = "wahaha";
strcpy(name, "wahaha"); //还是使用C++的string方便啊
};
~C(){};
}; int main(int argc, char const *argv[])
{
A a;
B b;
C c;
cout<< a.age <<"--" <<a.name <<endl; //1875728040--
cout<< b.age <<"--" <<b.name <<endl; //10--abc
cout<< c.age <<"--" <<c.name <<endl; //18--wahaha return ;
}

我认为Java应该也是类似的:

  先按照成员的大小分配空间,对分配的空间进行默认操作,最后执行构造体中的内容。

  这里有两个地方可能引起疑惑:

    ① 对分配的空间进行默认操作,这个默认操作是什么?我认为Java是将所有空间内容全部置零!

      类似C的 memset() 操作。

    ② 对象中的引用类型怎么分配空间? 我在前面的文章有提到,Java的引用变量其实更像C++的指针。这样就能完美解释对象中的 默认类型和引用类型的初始化值:都是0,对指针来说就是NULL(C++概念)--Java里就是null。如果能观察Java对象的内存占用,就能直观的观察到这些,特别是引用类型变量的内存占用。(别忘了类的对象本身是在堆中)

    话又说回来,各种Java书籍中明确告知了独立的引用类型的变量是存储在栈空间,指向堆中的内容!所以完全可以将引用类型的变量看作指针!!!

举个栗子:

 public class A {
public A(){
System.out.println("A 默认构造");
}
}
//-------------
public class B {
private String name;
private int age;
private A a; public B(){
System.out.println(this);
System.out.println(name);
System.out.println(age);
System.out.println(a);
run();
System.out.println("B 无参构造");
} public void run(){
System.out.println("hehe from B.run()");
}
}
//-------------
import org.junit.Test;
public class Test1 { @Test
public void run1(){
B b = new B();
}
}

另外,得找个时间研究下Java的内存了。

  

Java 构造方法的执行过程(猜测)的更多相关文章

  1. 浅析java程序的执行过程

    在研究任何一门语言时,无论是面向过程的c,c++(面向过程和面向对象),还是面向对象的.net,java等,弄清语言执行过程至关重要.  何为语言执行过程? 所谓语言执行过程,指对于任何一门语言,如j ...

  2. [转帖]浅析java程序的执行过程

    浅析java程序的执行过程 转帖来源: https://www.cnblogs.com/wangjiming/p/10315983.html 之前学习过 这一块东西 但是感觉理解的不深刻. copy一 ...

  3. java的servlet执行过程是怎么样的?

    java的servlet执行过程是怎么样   答: Servlet执行过程:程序第一次访问,会调用servlet的init()方法初始化(只执行一次),每次程序执行都会根据请求调用doGet()或者d ...

  4. Java程序的执行过程

    Java程序的执行过程 编译器将 Java 源代码编译成字节码class文件 类加载到 JVM 里面后,执行引擎把字节码转为可执行代码 执行的过程,再把可执行代码转为机器码,由底层的操作系统完成执行

  5. java中继承条件下构造方法的执行过程

    继承条件下构造方法的调用规则如下: 情况1:如果子类的构造方法中没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法.在这种 ...

  6. 一个Java程序的执行过程(转)

    我们手工执行java程序是这样的:  1.在记事本中或者是UE的文本编辑器中,写好源程序:  2.使用javac命令把源程序编译成.class文件:    编译后的.class(类字节码)文件中会包含 ...

  7. 一个 java 文件的执行过程详解

    平时我们都使用 idea.eclipse 等软件来编写代码,在编写完之后直接点击运行就可以启动程序了,那么这个过程是怎么样的? 总体过程 我们编写的 java 文件在由编译器编译后会生成对应的 cla ...

  8. 🏆【Java技术专区】「编译器专题」重塑认识Java编译器的执行过程(消除数组边界检查+公共子表达式)!

    前提概要 Java的class字节码并不是机器语言,要想让机器能够执行,还需要把字节码翻译成机器指令.这个过程是Java虚拟机做的,这个过程也叫编译.是更深层次的编译. 在编译原理中,把源代码翻译成机 ...

  9. java 类 及其 执行过程

    java 类 命名 java类文件中  只能有一个公开类  且 公开类类名与当前类文件的文件名一致 方法如果使用了static修饰,那么此方法是类方法,可以 类名.方法名 使用. 你的main方法在同 ...

随机推荐

  1. centos部署supervisor

    #!/bin/bash yum -y install python-setuptools ping pypi.python.org -c 4 >/dev/null 2>&1 eas ...

  2. Python2 cmp() 函数

    描述 cmp(x,y) 函数用于比较2个对象,如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1. 语法 以下是 cmp() 方法的语法: cmp( ...

  3. Scanner类nextInt方法的使用注意点

    一.先看一段正常的代码 1. 一段用Scanner捕获键盘输入的代码: Scanner sc = new Scanner(System.in); // 先读取键盘输入的字符串 System.out.p ...

  4. Generalized Linear Models

    作者:桂. 时间:2017-05-22  15:28:43 链接:http://www.cnblogs.com/xingshansi/p/6890048.html 前言 主要记录python工具包:s ...

  5. swfupload详解

    前提: Ajax解决了不刷新页面提交表单,但是却没有解决文件上传不刷新页面,当然也有其它技术让不刷新页面而提交文件,该技术主要是利用隐藏的iFrame,较Ajax要麻烦许多,而且其提交方式依然在底层是 ...

  6. Javascript玩转继承(一)

    Javascript究竟是一门面向对象的语言,还是一门支持对象的语言,我想每个人都有着自己的看法.那些Javascript忠实的Fans一定讲Javascript是一门面向对象的语言,像<Jav ...

  7. [svc]Iaas Paas Saas区别

    https://www.zhihu.com/question/20387284

  8. Mysql 中创建索引和索引的使用问题

    在数据库中合理的使用索引是提升mysql数据库的一种高效和快捷的方式,但是在索引的使用上在我的使用中发现有很多坑,因为自己之前没有认识到,所以来总结一下 索引的介绍 索引是一种特殊的文件,其中包含着对 ...

  9. 在Windows上开发PHP扩展模块

    环境: window + php + apache + vc6 + cygwin 下载:php二进制文件: php-5.3.10-Win32-VC9-x86        php源码包:php-5.3 ...

  10. uboot的lds文件分析

    OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") ...