黑马程序员--03.Java面向对象--05.子类对象初始化的过程【个人总结】
来源:互联网 发布:mac 图片尺寸修改 编辑:程序博客网 时间:2024/05/16 00:32
子类对象初始化过程
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
1. 子类对象的初始化过程
1). 执行顺序
有继承的时候,调用子类构造方法之后,运行到子类构造函数第一行之后, 执行顺序如下:
(1). 父类静态相关初始化(仅仅执行一次)
{1}. 父类的静态成员显式初始化(仅执行一次)--->
{2}. 父类的静态成员隐式初始化(仅执行一次)
//静态成员也是子类继承的对象
{3}. 父类static代码块(仅执行一次)--->
//执行的原理就是静态代码块可能初始化子类要继承的父类的静态变量
(2). 子类静态相关初始化(仅仅执行一次)
{1}. 子类的静态成员初始化(仅执行一次)--->
{2}.子类的静态成员初始化(仅执行一次)--->
{3}. 子类static代码块(仅执行一次)--->
//静态先执行的原因就是随着相应的类加载而加载,并且静态代码块没有名字,不能被调用,//所以也要立刻执行。
(3). 父类非静态相关初始化
{1}. 父类成员变量隐式初始化--->
{2}. 父类成员变量显式初始化--->
{3}. 父类构造代码块 ---> //这步可能涉及到父类成员变量的初始化,所以要执行
{4}. 父类构造方法初始化 ---> //执行这步的原理同上
(4). 子类非静态相关初始化
{1}. 子类成员变量隐式初始化--->
{2}. 子类成员变量显式初始化--->
{3}. 子类构造代码块
{4}. 子类构造方法初始化
【总结】子类对象初始化要做的事情的核心就是:
只要是涉及到子类自身的数据(静态或者非静态)以及需要从父类继承的数据(静态或者非静态)的初始化动作,就一定要执行。
2). 范例
class Fu{ int fuInt=10; StringfuStr; static int fuStaticInt; static String fuStaticStr ="Fu Static"; static{ System.out.println("fu static code block..."+ fuStaticInt +":::::"+ fuStaticStr); } { System.out.println("fu codeblock..."+ fuInt+":::::"+fuStr); } Fu(){ fuInt =20; fuStr ="Ben"; System.out.println("fu constructor..."+ fuInt+"***"+ fuStr+"...without parameters"); } Fu(int fuInt, String fuStr){ this.fuInt =fuInt; this.fuStr =fuStr; System.out.println("fu constructor..."+ fuInt+"***"+ fuStr+"...with parameters"); }} class Zi extends Fu{ int ziInt=30; StringziStr; static int ziStaticInt; static String ziStaticStr ="Zi Static"; static{ System.out.println("zi static code block..."+ ziStaticInt +":::::"+ ziStaticStr); } { System.out.println("zi codeblock..."+ ziInt+":::::"+ziStr); } Zi(){ ziInt =20; ziStr ="BenZi"; System.out.println("zi constructor..."+ ziInt+"***"+ ziStr+"...without parameters"); } Zi(int ziInt, String ziStr){ this.ziInt =ziInt; this.ziStr =ziStr; System.out.println("zi constructor..."+ ziInt+"***"+ ziStr+"...with parameters"); }} class Test{ public static void main(String[] args) { Zizi =new Zi(); System.out.println("*****************************"); ZiziII =new Zi(100, "ZXM"); }}
运行结果:
3). 练习题
求输出结果
class Y { Y(Stringname) { System.out.print("Y--"+name); }} class X { Y b = new Y("Fu"); X(){ System.out.print("X"); }} public class Test2 extends X { Y y = new Y("Zi"); Test2(){ System.out.print("Zi"); } public static void main(String[] args) { new Test2(); }}
这里注意一下:当父类出现的时候,不能单纯的看子类的执行过程,因为父类中的数据是子类要继承的,必须全部先准备好。所以不是子类的Y y = new Y("Zi");先执行。
*Y--Fu*X*Y--Zi*Zi
父类的显式初始化 ---> 父类的构造函数--->子类的显式初始化 --->子类构造函数
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
- 黑马程序员--03.Java面向对象--05.子类对象初始化的过程【个人总结】
- 黑马程序员--03.Java面向对象--04.【对象初始化的过程】【对象调用成员的过程】
- 黑马程序员--03.面向对象--02.子类和父类成员变量的关系【个人总结】
- 黑马程序员-java 面向对象【个人总结】
- 黑马程序员--java中父类和子类都有构造方法时,子类对象的初始化过程
- 黑马程序员--03.面向对象--03.子类父类方法重写和覆盖的理解【个人总结】
- 黑马程序员:Java对象的初始化过程
- 黑马程序员-关于面向对象的个人总结
- 黑马程序员--03.面向对象--04.子类构造必须访问父类构造的原因 this_super语句的含义【个人总结】
- Java中子类对象初始化的过程
- 黑马程序员-对象的初始化过程详解
- 黑马程序员_对象的初始化过程
- 黑马程序员-对象的初始化过程
- 黑马程序员----对象的初始化过程
- 黑马程序员-对象的初始化过程
- 黑马程序员-----java面向对象思想总结*
- 黑马程序员--Java基础总结--面向对象
- 黑马程序员-java面向对象语法总结
- (转)SQL 优化原则
- Trie树解析
- 第三章数程序设计初步--分支结构项目3利息计算器
- 关于Call to undefined function mysql_connect()错误的解决方法
- ProtocolBuffer for Objective-C 运行环境配置
- 黑马程序员--03.Java面向对象--05.子类对象初始化的过程【个人总结】
- C++语法基础--函数对象,函数对象的函数适配器(绑定器,求反器)
- Code Fragment-使用if return 代替 if else.
- c#中反射的用法(即如何根据字符找到已定义的变量)
- Singleton Pattern
- 如何判断CPU是大端还是小端模式
- Wiki OI 1163 访问艺术馆
- 恭喜您成为 CSDN 博客专家
- maven教程(一)