Java继承学习小结
来源:互联网 发布:天池大数据竞赛时间 编辑:程序博客网 时间:2024/05/16 08:05
一、继承中构造方法的关系
public class ConstructionMethodTest { public static void main(String[] args) { SubClass subClass = new SubClass(); System.out.println("-----------"); SubClass subClass2 = new SubClass(1); }}class SuperClass { public SuperClass() { System.out.println("父类的无参构造方法"); } public SuperClass(int i) { System.out.println("父类的带参构造方法"); }}class SubClass extends SuperClass { public SubClass() { System.out.println("子类的无参构造方法"); } public SubClass(int i) { System.out.println("子类的带参构造方法"); }}
执行结果:
父类的无参构造方法子类的无参构造方法---------------父类的无参构造方法子类的带参构造方法
在上述代码中,SubClass继承SuperClass,当创建SubClass对象的时候,会先调用父类的构造方法,然后调用子类的构造方法。
比较SubClass subClass = new SubClass()和SubClass subClass2 = new SubClass(1),发现不管子类调用的是无参还是带参的构造方法,都会先调用父类的无参构造方法。
总结:子类中所有的构造方法默认都会访问父类中空参数的构造方法。子类每一个构造方法的第一条语句默认都是:super()
二、继承关系中代码块的执行顺序
public class ConstructionMethodTest { public static void main(String[] args) { SubClass subClass = new SubClass(); }}class SuperClass { static { System.out.println("静态代码块SuperClass"); } { System.out.println("构造代码块SuperClass"); } public SuperClass() { System.out.println("构造方法SuperClass"); }}class SubClass extends SuperClass { static { System.out.println("静态代码块SubClass"); } { System.out.println("构造代码块SubClass"); } public SubClass() { System.out.println("构造方法SubClass"); }}
执行结果:
静态代码块SuperClass静态代码块SubClass构造代码块SuperClass构造方法SuperClass构造代码块SubClass构造方法SubClass
在执行过程中,会先加载父类的静态代码块,然后加载子类的静态代码块;在子类调用构造方法之前,先调用父类的构造方法,而构造代码块顺序先于构造方法,因此先调用父类的构造代码块,然后调用父类的构造方法;接下来调用子类的构造代码块和子类的构造方法。
总结:一个类中代码块的执行顺序 静态代码块 > 构造代码块 > 构造方法;静态代码块在类加载时就执行;在调用构造方法之前先调用构造代码块。
三、只声明不赋值是否会加载类
public class ConstructionMethodTest { public static void main(String[] args) { System.out.println("-----------------"); SubClass subClass = new SubClass(); System.out.println("-----------------"); }}class SuperClass { static{ System.out.println("父类的静态代码块"); }}class SubClass extends SuperClass { static{ System.out.println("子类的静态代码块"); }}
结果:
-----------------父类的静态代码块子类的静态代码块-----------------
这个结果很显然,但是把SubClass subClass = new SubClass() 修改为 SubClass subClass;对subClass只进行声明,不赋值。
结果:
----------------------------------
结果显示,对类SubClass ,并没有进行类的加载。
对编译完成的SubClass.class进行反编译,可以看到如下图:
在反编译的代码中,SubClass subClass的声明操作被编译器优化掉。
总结:Java编译器在编译过程中会根据一定的机制对代码进行优化。
最常见的优化之一就是对常量的优化,比如
int i = 1+2;编译之后会被优化成int i = 3;
- Java继承学习小结
- java中继承关系学习小结
- JAVA继承知识小结
- 【Java学习笔记之二十一】抽象类在Java继承中的用法小结
- 学习小结(第七章继承)
- python学习小结5:封装、继承、多态
- java extends 继承的一些小结。
- java方法继承,重载,覆盖等小结
- java—类与继承小结
- Java继承、接口、试卷解析小结
- java继承和多态、接口小结
- JAVA学习【知】继承
- JAVA 继承学习笔记
- java学习之继承
- java 继承-学习笔记
- Java 继承学习资料
- Java继承学习笔记
- JAVA学习十:继承
- Heap 堆
- 吸引女性玩家来玩游戏的十八个关键要素
- Collabtive系统XSS攻击实验
- android 通过bitmapfactory得到图片真实像素的方法,以及没有得到真实像素的原因
- js中的location的href和pathname,search
- Java继承学习小结
- windows 下 解决 QT 与 mysql 数据库 驱动问题的本质
- windows在ISR中不能睡眠的原因
- Android Studio实现代码混淆
- 浅谈sqlserver2008备份与还原的方法一
- 天声人語 20150722
- Html学习笔记4
- 循环单链表实现约瑟夫环
- Android三种实现定时器的方法