Java 构造方法的执行过程(猜测)
先说明一点,这篇帖子的内容都是我自己思考的结果,如有误,请务必及时告诉我,非常感谢。
起由:
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 构造方法的执行过程(猜测)的更多相关文章
- 浅析java程序的执行过程
在研究任何一门语言时,无论是面向过程的c,c++(面向过程和面向对象),还是面向对象的.net,java等,弄清语言执行过程至关重要. 何为语言执行过程? 所谓语言执行过程,指对于任何一门语言,如j ...
- [转帖]浅析java程序的执行过程
浅析java程序的执行过程 转帖来源: https://www.cnblogs.com/wangjiming/p/10315983.html 之前学习过 这一块东西 但是感觉理解的不深刻. copy一 ...
- java的servlet执行过程是怎么样的?
java的servlet执行过程是怎么样 答: Servlet执行过程:程序第一次访问,会调用servlet的init()方法初始化(只执行一次),每次程序执行都会根据请求调用doGet()或者d ...
- Java程序的执行过程
Java程序的执行过程 编译器将 Java 源代码编译成字节码class文件 类加载到 JVM 里面后,执行引擎把字节码转为可执行代码 执行的过程,再把可执行代码转为机器码,由底层的操作系统完成执行
- java中继承条件下构造方法的执行过程
继承条件下构造方法的调用规则如下: 情况1:如果子类的构造方法中没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法.在这种 ...
- 一个Java程序的执行过程(转)
我们手工执行java程序是这样的: 1.在记事本中或者是UE的文本编辑器中,写好源程序: 2.使用javac命令把源程序编译成.class文件: 编译后的.class(类字节码)文件中会包含 ...
- 一个 java 文件的执行过程详解
平时我们都使用 idea.eclipse 等软件来编写代码,在编写完之后直接点击运行就可以启动程序了,那么这个过程是怎么样的? 总体过程 我们编写的 java 文件在由编译器编译后会生成对应的 cla ...
- 🏆【Java技术专区】「编译器专题」重塑认识Java编译器的执行过程(消除数组边界检查+公共子表达式)!
前提概要 Java的class字节码并不是机器语言,要想让机器能够执行,还需要把字节码翻译成机器指令.这个过程是Java虚拟机做的,这个过程也叫编译.是更深层次的编译. 在编译原理中,把源代码翻译成机 ...
- java 类 及其 执行过程
java 类 命名 java类文件中 只能有一个公开类 且 公开类类名与当前类文件的文件名一致 方法如果使用了static修饰,那么此方法是类方法,可以 类名.方法名 使用. 你的main方法在同 ...
随机推荐
- [转载]Class-AB Amplifier 笔记
Class-AB Amplifier 笔记 Reading Notes from Mikko Loikkanen “Design and Compensation of High Performanc ...
- python中如果函数后面有多于一个括号是怎么回事?
一般而言,调用一个函数是加一个括号.如果看见括号后还有一个括号,说明第一个函数返回了一个函数,如果后面还有括号,说明前面那个也返回了一个函数.以此类推. 比如fun()() def fun(): pr ...
- spring framework 4 源代码阅读(2)---从ClassPathXmlApplicationContext開始
Application初始化日志 15:23:12.790 [main] DEBUG o.s.core.env.StandardEnvironment - Adding [systemProperti ...
- ClickAndMoveTest
关于ccTouchesEnded看这个博客即可 http://blog.linguofeng.com/archive/2012/09/12/cocos2d-x-touch.html class Cli ...
- 重装Ubuntu系统
1.安装JDK参考:http://weixiaolu.iteye.com/blog/1401786jdk-6u31-linux-i586.bin莫名奇妙的安装失败.所以下载了jdk-7u45-linu ...
- 如何读取jar包外的properties文件和log4j.properties
http://jrails.iteye.com/blog/1705464 ***************************************' 一般在项目中使用properties配置文件 ...
- bootstrap内容太多表格撑破
增加样式 style="word-break:break-all; word-wrap:break-all;" 这样内容就会自动换行,表格就美观多了. <table cla ...
- 模板方法模式(Head first 设计模式——7)
一.模板方法模式定义 模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 从定义中,应该可以看出一部分,为 ...
- 爬取千万淘宝商品的python脚本
import time import leveldb from urllib.parse import quote_plus import re import json import itertool ...
- C语言 · 求圆面积表面积体积
算法提高 3-3求圆面积表面积体积 时间限制:1.0s 内存限制:256.0MB 问题描述 接受用户输⼊的数值,输出以该值为半径的(1)圆面积,(2)球体表面积,(3)球体体积.pi ...