面试复习之—Java基础(七):代码块与执行顺序
最近在准备面试,把知识点复习一遍,整理出的笔记记录下,里面会穿插代码和面试例题。
内容不是原创,是总结和收集,如果侵权了请联系作者,若有错误也请各位指正。因为收集的时候忘记把来源记录下来了,所以就不po出处了,请见谅(这是个坏习惯,一定改)。
面试复习之—Java基础(七):代码块与执行顺序
这是面试复习内容的第七篇——代码块与执行顺序,主要是Java基础的内容,所有内容将分为几篇来写。
代码块与执行顺序
构造方法
构造方法是类的一种特殊方法,用来初始化类的一个新的对象。Java 中的每个类都有一个默认的构造方法,它必须具有和类名相同的名称,而且没有返回类型。构造方法的默认返回类型就是对象类型本身,并且构造方法不能被 static、final、synchronized、abstract 和 native 修饰。
构造方法用于初始化一个新对象,所以用 static 修饰没有意义;构造方法不能被子类继承,所以用 final 和 abstract 修饰没有意义;多个线程不会同时创建内存地址相同的同一个对象,所以用 synchronized 修饰没有必要。
构造方法主要有无参构造方法和有参构造方法两种。
注意:类的构造方法不是要求必须定义的。如果在类中没有定义任何一个构造方法,则 Java
会自动为该类生成一个默认的构造方法。默认的构造方法不包含任何参数,并且方法体为空。如果类中显式地定义了一个或多个构造方法,则 Java
不再提供默认构造方法。
子类调用父类的构造方法
子类会默认调用父类的无参构造方法。若是子类自定义的构造方法没有显示调用父类构造函数,若父类没有无参构造方法就会报错。
当父类中没有无参构造函数时,子类必须调用父类有参的构造函数,可以使用super关键字实现。如果父类没有对应的有参构造方法的话,同样也会报错。
原因:当你new一个子类对象的时候,必须首先要new一个父类的对像出来,这个父类对象位于子类对象的内部,所以说,子类对象比父类对象大,子类对象里面包含了一个父类的对象,这是内存中真实的情况.构造方法是new一个对象的时候,必须要调的方法,这是规定,要new父类对象出来,那么肯定要调用其构造方法。
代码块
在java中用{}括起来的称为代码块,代码块可分为以下四种:
1.局部代码块:
- 类中方法内部的代码块。
2.构造代码块:
- 构造块会在创建对象时被调用,每次创建时都会被调用,优先于类构造函数执行。
3.静态代码块:
- 用static{}包裹起来的代码片段,只会执行一次。静态代码块优先于构造块执行。
4.同步代码块:
- 使用synchronized(){}包裹起来的代码块,在多线程环境下,对共享数据的读写操作是需要互斥进行的,否则会导致数据的不一致性。同步代码块需要写在方法中。
代码块类型 | 位置 | 作用 | 执行顺讯 |
---|---|---|---|
局部代码块 | 类中方法内部(局部位置) | 限定变量的生命周期,尽早释放节约内存 | 调用所在方法时执行 |
构造代码块 | 类成员的位置,即方法之外的位置 | 把多个构造方法共同的部分提取出来,共用构造代码块 | 每次调用构造方法时,优先于构造方法执行,也就是new一个对象时自动调用 |
静态代码块 | 类成员的位置,用static关键字修饰的代码块 | 只加载一次,对类进行一些初始化 | 创建一个对象时调用,只在第一次调用静态代码块时执行,仅执行一次,优先于构造方法执行 |
静态代码块和构造代码块的异同点
相同点:都是JVM加载类后且在构造函数执行之前执行,在类中可定义多个,一般在代码块中对一些static变量进行赋值。
不同点:静态代码块在非静态代码块之前执行。静态代码块只在第一次new时执行一次,之后不在执行。而非静态代码块每new一次就执行一次。
执行顺序
父类的静态成员和代码块—>子类静态成员和代码块—>父类成员初始化和代码快—>父类构造方法—>子类成员初始化和代码块—>子类构造方法。
注:若对象多次实例化,则会出现除了静态代码块部分的循环调用。
继承的初始化顺序
- 初始化父类再初始化子类
- 先执行初始化对象中属性,再执行构造方法中的初始化。
总结:父类对象属性初始化---->父类对象构造方法---->子类对象属性初始化—>子类对象构造方法。
例题
1、请说出下列代码的初始化顺序。
答案:执行顺序结果为:367215421548。