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方法在同 ...
随机推荐
- struts2每次访问都会创建一个新的session
1.第一次 项目在测试过程中,突然发现登陆之后再去访问其他菜单时都会提示未登录: 查看日志之后发现是因为很多次请求时都会自动创建一个新的session,这就费解了, 因为之前也没改动什么session ...
- ThreadLocal 类说明
1 ThreadLocal 不是一个线程,而是保存线程本地化对象的容器.当运行于多线程环境的某个对象使用 ThreadLocal 维护变量时,ThreadLocal 为每一个使用该变量的线程分配一个独 ...
- js获取日期实例之昨天今天和明天、后天
本文介绍了js获取日期的方法,可以获取前天.昨天.今天.明天.后天. 代码: <html> <head> <meta http-equiv="Content-T ...
- [k8s]kube-router替代kube-proxy实现svc网络和pod网络
本文讲解了kube-router部署,无需在部署kube-proxy了. kube-router采用lvs实现svc网络,采用bgp实现pod网络. kube-router也是基于cni网络,本文是容 ...
- informatica 参数文件配置
Informatica 中 parameter file 参数文件配置规则: 参数文件的头部内容 [Global] All Integration Services, Integration Serv ...
- [LeetCode][Java] Search Insert Position
题目: Given a sorted array and a target value, return the index if the target is found. If not, return ...
- compiled inline cache
http://cr.openjdk.java.net/~jrose/pres/200910-VMIL.pdf https://wiki.openjdk.java.net/display/HotSpot ...
- markdown 语法简要备忘
标题 # 一级标题 ## 二级标题 ### 三级标题 无序列表 前面加 - 或 * 即可变为 有序列表 直接用数字即可 1. 2. 3. 添加引用 > 图片与链接 插入链接与插入图片的语法很像, ...
- 命令运行带参数的jar
一.打包(此处用的是eclipse) 代码如下,此如引用了某博主的代码,因忘记地址,如博主发现此文,可私信我 package com.example.Open; import java.io.File ...
- python学习笔记(22)--漫画生成html最终版
说明(2017.3.14): 1. 在主文件夹生成一个main.html作为目录 2. 在每个子文件夹生成一个index.html作为看图网页 3. 通过python批量生成html网页,js配合进行 ...