java中构造代码块、方法调用顺序问题
1. 继承的概念
继承在本职上是特殊——一般的关系,即常说的is-a关系。子类继承父类,表明子类是一种特殊的父类,并且具有父类所不具有的一些属性或方法。
2. 继承中的初始化顺序
从类的结构上而言,其内部可以有如下四种常见形态:属性(包括类属性和实例属性)、方法(包括类方法和实例方法)、构造器和初始化块(包括类的初始化块和实例的初始化块)。对于继承中的初始化顺序,又具体分为类的初始化和对象的初始化。
类初始化:
在jvm装载类的准备阶段,首先为类的所有类属性和类初始化块分配内存空间。并在类首次初始化阶段中为其进行初始化,类属性和类初始化块之间的定义时的顺序决定了其初始化的顺序。若类存在父类,则首先初始化父类的类属性和类初始化块,一直上溯到Object类最先执行。
对象初始化:
在new创建对象时,首先对对象属性和初始化块分配内存,并执行默认初始化。如果存在父类,则先为父类对象属和初始化块先分配内存并执行初始化。然后执行父类构造器中的初始化程序,接着才开始对子类的对象属性和初始化块执行初始化。
调用顺序:父类的类属性和类代码块-->子类的类属性和类代码块-->父类的对象属性和代码块-->父类的构造函数-->子类的对象属性和代码块-->子类的构造函数
3、举例说明
//先静态初始化并且只有一次!!然后构造代码块!!再构造方法!! //声明一个继承自父类的子类时,先把父类的构造代码块及构造方法初始化然后初始化子类的构造代码块和构造方法 class Parent { public static String p_StaticField = "父类--静态变量"; public String p_Field = "父类--变量"; // 代码块 // 构造函数 public Parent() { System.out.println("父类--构造器"); } { System.out.println(p_Field); System.out.println("父类--初始化块"); } // 静态初始化块 static { System.out.println(p_StaticField); System.out.println("父类--静态初始化块"); } } public class StaticBlock extends Parent { public static String s_StaticField = "子类--静态变量"; public String s_Field = "子类--变量"; { System.out.println(s_Field); System.out.println("子类--初始化块"); } // 静态初始化块 static { System.out.println(s_StaticField); System.out.println("子类--静态初始化块"); } public StaticBlock() { System.out.println("子类--构造器"); } public static void main(String[] args) { System.out.println("-------------------"); new Parent(); System.out.println("-------------------"); new StaticBlock(); } } /**Output* 父类--静态变量 父类--静态初始化块 子类--静态变量 子类--静态初始化块 ------------------- 父类--变量 父类--初始化块 父类--构造器 ------------------- 父类--变量 父类--初始化块 父类--构造器 子类--变量 子类--初始化块 子类--构造器*/
注:
1. 在对象初始化阶段,属性和方法均针对子类可以从父类继承过来的属性和方法而言,一般而言,都是针对父类中非private而言的。因为private修饰的为父类所特有的,子类没有继承过来,当new子类时,无须为其分配空间并执行初始化。当然了,父类的构造器子类也是不继承过来的,但构造器另当别论。
2. 类的初始化只执行一次,当对同一个类new多个对象时,类属性和类初始化块只初始化一次。
4、注意构造函数中的多态问题
在父类构造函数内部调用具有多态行为的函数将导致无法预测的结果,因为此时子类对象还没初始化,此时调用子类方法不会得到我们想要的结果。
class Glyph {void draw() {System.out.println("Glyph.draw()");}Glyph() {System.out.println("Glyph() before draw()");//1 draw();System.out.println("Glyph() after draw()");//3 } }class RoundGlyph extends Glyph {private int radius = 1;//4 RoundGlyph(int r) {radius = r;//5System.out.println("RoundGlyph.RoundGlyph(). radius = " + radius);//6 }void draw() {System.out.println("RoundGlyph.draw(). radius = " + radius);//2 } }public class PolyConstructors {public static void main(String[] args) {new RoundGlyph(5);} }/** Glyph() before draw() RoundGlyph.draw(). radius = 0 Glyph() after draw() RoundGlyph.RoundGlyph(). radius = 5 */
转载于:https://www.cnblogs.com/hdulzt/p/7722190.html
java中构造代码块、方法调用顺序问题相关推荐
- Java中构造代码块和静态代码块
1.构造代码块 1.格式:使用{}声明 public class Code{{System.out.println("构造代码块");} } 2.特性 构造代码块在创建对象时被调用 ...
- Java中普通代码块,构造代码块,静态代码块区别
Java中普通代码块,构造代码块,静态代码块区别及代码 示例 //执行顺序:(优先级从高到低.)静态代码块>mian方法 >构造代码块>构造方法. 其中静态代码块只执行一次.构造代码 ...
- Java中static代码块,main函数,构造函数运行顺序
1.Java中static代码块,main函数,构造函数运行顺序如下: 答:static代码块是主动执行的,因此static代码块先执行,然后是执行构造函数,最后是Main函数. 如下例子: publ ...
- java中static代码块_static怎样在java中修改代码块?
代码是我们每个学编程的小伙伴都接触的内容,在代码块的修改上有很多方法,那么在java中又需要使用哪种方式来对代码块进行变动呢?哦们最近在学关键字的版块,其中有一个static用来修饰代码块的效果非常不 ...
- java 静态块初始化_简单了解java中静态初始化块的执行顺序
这篇文章主要介绍了简单了解java中静态初始化块的执行顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在java中,其应该是先于所有的方法执行. ...
- Java中构造函数,静态代码块,构造代码块的执行顺序
静态代码块:用static声明,jvm加载类的时候执行,只执行一次. 构造代码块:由{}定义,每一次创建对象的时候执行. 构造函数:对象一建立就调用相应的构造函数. 静态代码块 1.它是随着类的加载而 ...
- java中普通代码块,构造代码块,静态代码块的区别及代码示例
本文转自:http://www.cnblogs.com/sophine/p/3531282.html 执行顺序:(优先级从高到低)静态代码块>main方法>构造代码块>构造方法. 其 ...
- 关于java中普通代码块、构造代码块与静态代码块
1.普通代码块 public static void main(String[] args) { /*普通代码块: *直接定义在在方法或语句中出现"{普通代码的执行语句}"的就称为 ...
- 牛客网Java刷题知识点之什么是代码块、普通代码块、静态代码块、同步代码块、构造代码块以及执行顺序...
不多说,直接上干货! 这种形式的程序段我们将其称之为代码块,所谓代码块就是用大括号({})将多行代码封装在一起,形成一个独立的数据体,用于实现特定的算法.一般来说代码块是不能单独运行的,它必须要有运行 ...
最新文章
- 肖仰华:知识图谱落地,不止于“实现”
- tensorflow2.0 RNN文本预测
- activemq无账户密码登录配置修改
- 计算机视觉与深度学习算法工程师面试题整理
- 白话Elasticsearch01- 结构化搜索之使用term query来搜索数据
- adt eclipse java1.8,android java开发 第一天 之熟习eclipse adt
- 《Arduino计算机视觉编程》一3.3 总结
- Python正则替换字符串函数re.sub用法示例(1)
- thinking-in-java(11) 持有对象
- pgd 游戏教程 基地
- [Learn AF3]第七章 App framework组件之Popup
- 125万像素智能相机收费站解决方案
- 一个具自我复制功能的程序
- EasyRecovery深度扫描以恢复桌面遗失数据的方法
- 第7章 XSL高级应用
- Pikachu-暴力破解
- windows11无法添加朝鲜语输入法
- 电子设计(4)高电平、低电平复位电路
- NB-IoT和GSM概述
- uni.app H5(微信公众号定位) uni.getLocation