Java父类子类的对象初始化过程
摘要
1. 基本初始化过程:
对于一个简单类的初始化过程是:
static 修饰的模块(static变量和static 块) ---> 按照代码顺序依次执行。
|
实例变量 及非static模块---> 按照代码顺序依次执行。
|
构造函数 ---> 执行对应的构造函数。
子类的初始化过程。
父类static修饰的模块
|
子类static修饰模块
|
父类实例变量和非static块
|
父类对应构造函数。当子类对应构造函数中没有显示调用时调用的是父类默认的构造函数。
|
子类实例变量和非static块
|
子类构造函数
Class的static模块是唯一的,所以只初始化一次。所有类的实例公用Class的static模块。
static模块的初始化条件: ( From: 引用1 )
(1)遇到new、getstatic、putstatic 或 invokestatic这4条字节码指令时,如果类还没初始化,则触发初始化。对应场景是:new实例化对象时、读或设置一个静态字段时(被final修饰,已在编译器把结果放入常量池的静态字段除外),以及调用一个类的静态方法时
(2)对类进行反射调用时
(3)初始化子类。但父类还没有初始化时,先触发父类初始化
(4)当虚拟机启动时,需指定一个需要执行的主类(包含main方法),虚拟机会先初始化该类
2. 关于覆盖和隐藏
覆盖:被覆盖的方法相当于被擦除了,不可恢复(即使类型强制转换也无法调用)。
隐藏:一直保存的某个位置,等需要的时候可以继续使用(类型强制转换后可以调用)。
关于父类子类之间的覆盖和隐藏关系: (From :引用2)
1. 父类的实例变量和类变量能被子类的同名变量隐藏。
2. 父类的静态方法被子类的同名静态方法隐藏,父类的实例方法被子类的同名实例方法覆盖。
3. 不能用子类的静态方法隐藏父类的实例方法,也不能用子类的实例方法覆盖父类的静态方法,否则编译器会异常。
4. 用final关键字修饰的最终方法不能被覆盖。
5. 变量只能被隐藏不会被覆盖,子类的实例变量可以隐藏父类的类变量,子类的类变量也可以隐藏父类的实例变量。
涉及的典型情况:
前提:
-----------------------------------------
class B extends A{……}
-----------------------------------------
(1) B instanceB = new B();
instanceB的初始化过程如第一部分中:子类的初始化过程。
此时instanceB中实际上有一个super的全部信息(除了父类中被覆盖的实例方法),但是当前的引用是子类的信息(如果子类中没有的变量和方法则是从父类继承来)。
(2)A instanceA = new B();
此时父类A的变量和静态方法会将子类的变量和静态方法隐藏。instanceA此时唯一可能调用的子类B的地方就是子类B中覆盖了父类A中的实例方法。
执行 B instanceB = (B) instanceA; 后
此时instanceB相当于 B instanceB = new B();
注意:
(1) 这里唯一的覆盖的情况:父类的实例方法被子类的同名实例方法覆盖。
这里方法调用变量时,实际上是带有一个默认的this的。也就是此实例方法中调用的是当前Class的值。涉及到继承的情况时,要十分注意super,this的情况。
(2) 在初始化的时候,有两个阶段。第一步是申请空间,第二步是赋值。
具体见:
static的值和final static值在初始化时的区别。(引用1)
子类覆盖父类实例方法时,调用子类的实例方法,而此时子类的实例方法调用了子类中的变量(此时static变量已经初始化,但是实例变量并没有初始化)。(引用2)
这段代码来自引用2,如何精炼,如此有趣。值得一看。
class Parent{
int x=10;
public Parent(){
add(2);
}
void add(int y){
x+=y;
}
}
class Child extends Parent{
int x=9;
void add(int y){
x+=y;
}
public static void main(String[] args){
Parent p=new Child();
System.out.println(p.x);
}
}
引用 1. 类加载机制:
http://blog.csdn.net/kai_wei_zhang/article/details/8234146
引用 2. 隐藏和覆盖,以及一个好例子:
http://www.cnblogs.com/binjoo/articles/1585342.html
引用 3. 隐藏和覆盖
http://renyanwei.iteye.com/blog/258304
引用 4. 基本的初始化过程
http://www.cnblogs.com/miniwiki/archive/2011/03/25/1995615.html
Java父类子类的对象初始化过程的更多相关文章
- java中类的创建及初始化过程
java中类的创建及初始化过程无外乎两种情况,其一为单类的创建及初始化,其二具有继承关系的父子类创建及初始化过程. 首先说简单的,单类的创建及初始化过程.在java中我们都知道绝大部分对象的创 ...
- java基础---类加载和对象创建过程
类中可以存在的成员: class A{ 静态成员变量: 非静态成员变量: 静态函数: 非静态函数: 构造函数 A(..){...} 静态代码块 static{...} 构造代码块 {...} } 类加 ...
- java基础课程笔记 static 主函数 静态工具类 classpath java文档注释 静态代码块 对象初始化过程 设计模式 继承 子父类中的函数 继承中的构造函数 对象转型 多态 封装 抽象类 final 接口 包 jar包
Static那些事儿 Static关键字 被static修饰的变量成为静态变量(类变量) 作用:是一个修饰符,用于修饰成员(成员变量,成员方法) 1.被static修饰后的成员变量只有一份 2.当成员 ...
- Java 子类实例化对象的过程
子类实例化是否会实例化父类? 不会.父类在子类实例化过程中是并没有被实例化,java中new子类没有实例化父类,只是调用父类的构造方法初始化了,子类从父类继承来的属性,这个调用是子类的对象调用的父类的 ...
- Java的对象初始化过程
成员变量(字段)初始化顺序 在一个类里初始化的顺序是由成员变量在类里面的定义的顺序来决定的.即使成员变量大量散布于类的各个方法定义的中间,那些成员变量仍会在调用任何方法之前得以初始化,甚至在构造函数调 ...
- Java中对象初始化过程
Java为对象初始化提供了多种选项. 当new一个对象的时候,对象初始化开始: 1.首先,JVM加载类(只加载一次,所以,即使多次new对象,下面的代码也只会在第一次new的时候执行一次),此时, 静 ...
- 综合: Java 对象初始化过程
class Fu { Fu() { show(); } void show() { System.out.println("xixi"); } } class Zi extends ...
- [Think In Java]基础拾遗1 - 对象初始化、垃圾回收器、继承、组合、代理、接口、抽象类
目录 第一章 对象导论第二章 一切都是对象第三章 操作符第四章 控制执行流程第五章 初始化与清理第六章 访问权限控制第七章 复用类第九章 接口 第一章 对象导论 1. 对象的数据位于何处? 有两种方式 ...
- Java内存区域与对象创建过程
一.java内存区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区域则 ...
随机推荐
- objective-c相关知识点
1,objective-c中实现线程同步: Mutexlock (互斥锁).NSCondition lock (条件锁)消息传送 2,UDP和TCP: TCP :传输控制协议,可以提供面向连接的.可靠 ...
- nim
上帝创造了一个n*m棋盘,每一个格子都只有可能是黑色或者白色的. 亚当和夏娃在玩一个游戏,每次寻找边长为x的正方形,其中每个格子必须为黑色,然后将这些格子染白. 如果谁不能操作了,那么那个人就输了. ...
- swfupload上传文件问题
如果你的框架用到了struts2的话 可能会造成request冲突 那么解决的办法就是把该request排除出去 不让struts2拦截
- hold
嘿嘿,很久没写博客了.一懒一拖一浮躁就不行了. 果然烦心事太多,一直懒得编程.结果还是编程才能平复我啊! 明天那什么,别担心,平常心嘛! 还好,看了几部电影,不算没收获.自己有意思就看看电影,别瞎想啥 ...
- html中发送邮箱的链接
- 利用WebRequest类上传文件
说明:1.WebRequest类是一个抽象类,所以上传类实际使用的是其子类 2.打开Fiddler软件,监视正常网页的文件上传,可以看到http协议的请求和响应信息,简略说明 (第一行:请求说明 PO ...
- 高德地图关键字搜索删除上一次搜索的Marker
方法:Marker类的 setMap(null);方法 高德是通过循环调用addmarker(i,d)方法 创建marker标记,所以我们需要 把创建的marker标记压入到一个数组,再第二次搜索 ...
- 由Python的super()函数想到的
python-super *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !im ...
- [原创]用python写了一个简单的markdown编辑器
以前我常用openoffice记录东西,最喜欢它的当然是在linux上能用了,还有里面的公式输入,前几天才了解markdown这个东东,初步了解发现它正是我需要的东西,可以用它随心所欲地记录些东西,而 ...
- bzoj1855: [Scoi2010]股票交易
Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价 ...