Java学习笔记(十三):关于子类初始化的过程
2015-10-22 17:23
441 查看
子类继承父类,创建子类对象时,先调用父类的构造函数,再调用自己的构造函数,如果父类的构造函数中调用了一个方法,且方法被子类覆写,那么就会调用子类的覆写的方法
举例:
你会发现m的值第一次应该为1,却输出了0,那是因为构造对象时,对象的存储空间被初始化为二进制的0。
创建子类对象 B 时,初始化的实际过程如下
(1)在任何其他事物发生之前,将分配给对象的存储空间初始化为二进制的0
(2)调用父类的构造器,调用相应的方法draw,由于(1)的缘故,导致m = 0
(3)按类成员进行初始化,此时m = 1
(4)调用子类的构造器
因此,一般在构造器中调用final方法或private方法(private方法自动属于final方法),这样子类就不会覆写父类的这些final方法,从而就无法在调用父类构造器的时候调用子类的覆写的方法,从而避免了m = 0情况,因为这样就不会调用子类的draw方法
举例:
package constructor; class A { A() { draw(); System.out.println("A is constructing"); } void draw() { System.out.println("A is drawing!"); } } public class B extends A { private int m = 1; B(int m) { this.m = m; System.out.println("B is constructing! m = "+Integer.toString(m)); } void draw() { System.out.println("B is drawing! m = "+Integer.toString(m)); } public static void main(String[] args) { new B(10); //输出如下 /* B is drawing! m = 0 A is constructing B is constructing! m = 10 */ } }如上所示:
你会发现m的值第一次应该为1,却输出了0,那是因为构造对象时,对象的存储空间被初始化为二进制的0。
创建子类对象 B 时,初始化的实际过程如下
(1)在任何其他事物发生之前,将分配给对象的存储空间初始化为二进制的0
(2)调用父类的构造器,调用相应的方法draw,由于(1)的缘故,导致m = 0
(3)按类成员进行初始化,此时m = 1
(4)调用子类的构造器
因此,一般在构造器中调用final方法或private方法(private方法自动属于final方法),这样子类就不会覆写父类的这些final方法,从而就无法在调用父类构造器的时候调用子类的覆写的方法,从而避免了m = 0情况,因为这样就不会调用子类的draw方法
相关文章推荐
- 定时器的实现、java定时器Timer和Quartz介绍与Spring中定时器的配置
- java后台获取页面下拉框的选项只值,判断字符串是否相等
- Spring Aop实例
- eclipse 统计代码总行数
- Java代理(AOP)
- java集合框架---泛型设计和出现
- java 中 + 拼接字符串的效率
- (转) POJO和javabean的异同
- Spring Roo
- Java中字符串转整型和整型转字符串
- JavaWeb扩展--Freemarker(三)
- java 基础(一)
- 有关于servlet 的教程
- eclipse 中导入RecyclerView
- java语言值传递与引用传递
- spring框架学习(二)
- 关于Java的File.separator
- struts2 architect
- Java传值与传引用
- 认真学spring官网,很容易找到spring4的jar包下载位置