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方法在同 ...
随机推荐
- SICP 习题 (2.8) 解题总结:区间的减法
SICP 习题 2.8 须要我们完毕区间运算的减法.区间运算的加法书中已经有了,代码例如以下: (define (add-interval x y) (make-interval (+ (lower- ...
- Effective C++:条款33:避免遮掩继承而来的名称
(一) 以下这段代码: int x; void someFunc() { double x; //local variable std::cin>>x; //read a new valu ...
- Sql Server添加单引号
" ' "(单引号)的运用:在sql server中,两个" ' "(单引号)在拼接字符串的情况下运用,就是表示拼接上了一个" ' "单引号 ...
- jenkins 构建执行jmeter测试流程
性能测试使用maven工程说明1.依赖尽量用maven依赖管理2.添加jmeter maven依赖 <dependency> <groupId>org.apache.jmete ...
- ui-router路由控制器(一)
angularUI 在不断发展过程中已经被划分成了几个模块,你可以选择你需要的模块载入,我们今天要了解一下路由控制器 ui-router ,它就是angularUI划分出出来的一个独立模块. 此模块只 ...
- 网站的PV UV IP---网站常见软件性能
IP,衡量不同时间段的上网人数.00:00-24:00内相同的地址被计算一次.例:日300W IP,至少300W人访问PV,衡量页面受欢迎程度.每刷新一次,被记录一次(刷pv),网站被访问的页面的数量 ...
- Centos7安装TensorFlow
TensorFlow也火了一段时间,想想既然要研究NLP.为什么不好好应用一下Google开源的Deep Learning平台呢,一切还是先从搭建好开发环境開始. 非常多大神们也做了这方面的工作.汲取 ...
- PHP5.5四种序列化性能对照
json_encode,serialize,igbinary,msgpack四种序列化方式,在之前已经有过相关的測试,PHP5.5这方面的測试临时没有,这次測试基于PHP5.5,而且測试用例,http ...
- Mongodb查询引用
var result = db.users.findOne({"name":"Tom Wu"},{"address_ids":1,_id:0 ...
- java.net.Socket/java.net.ServerSocket-TCP Socket编程
TCP 的 Java 支持 协议相当于相互通信的程序间达成的一种约定,它规定了分组报文的结构.交换方式.包含的意义以及怎样对报文所包含的信息进行解析,TCP/IP 协议族有 IP 协议.TCP 协议和 ...