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

起由:

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. Openresty增加waf配置

    Openresty增加waf配置 1. Ngx lua waf 说明 防止sql注入,本地包含,部分溢出,fuzzing测试,xss,SSRF等web攻击 防止svn/备份之类文件泄漏 防止Apach ...

  2. Python hex() 函数

    描述 hex() 函数用于将10进制整数转换成16进制整数. 语法 hex 语法: hex(x) 参数说明: x -- 10进制整数 返回值 返回16进制整数. 实例 以下实例展示了 hex 的使用方 ...

  3. 解决svchost占用内存过高问题

    摘抄自:https://jingyan.baidu.com/article/d169e1867cea7e436611d801.html svchost占用内存过高,会导致内存100%电脑卡住,CPU温 ...

  4. 封ip对爬虫的影响

    今天要聊的是封ip对爬虫的影响.我认为封ip能拒绝一部分网络请求,减轻服务器的压力,但是如果要是建立一个好的ip池,封对爬虫的影响不大. 爬取国内一个拍卖公司的网站,刚开始用多进程下载,每分钟能爬取 ...

  5. 获取Android运行apk的packagename 和activityname

    自动化测试中经常遇到这个问题,关于这个题目,方法众多,咱的目的是找个比较简单靠谱的: 方法一: 先进入cmd窗口,adb shell 后: cd /data/data ls 可以看到包名了吧,缺点很明 ...

  6. ecshop中ajax的调用

    1.首先ecshop是如何定义ajax对象的. ecshop中的ajax对象是在js/transport.js文件中定义的.里面是ajax对象文件.声明了一个var Ajax = Transport; ...

  7. 在ASP.NET MVC5中使用特性路由

    首先在RegisterRoutes时开启特性路由功能: routes.MapMvcAttributeRoutes(); 然后,就可以使用了. [Route("{productId:int}/ ...

  8. adobe acrobat 无效批注对象

    http://blog.csdn.net/pipisorry/article/details/40894881 adobe acrobat一直弹出 无效批注对象 检查后提示:"本页面上的全部 ...

  9. 【Android】3.6 地图基本控制方法

    分类:C#.Android.VS2015.百度地图应用: 创建日期:2016-02-04 一.简介 文件名:Demo05MapControl.cs 简介:介绍平移和缩放地图,双指操作地图,监听地图点击 ...

  10. java动态代理的两种方法

    动态代理,有两种情况,第一种是有接口的情况下,你可以选择为jdk自带的动态代理的方式来编写程序,但你想要为一个实在的类编写动态代理的方式的话,这时候就必须选择一些开源的lib包,如cglib包,同时还 ...