java构造器执行顺序一个有趣的简单实例
2016-11-03 16:02
302 查看
一 Animal为父类,构造器中调用public(default、protected) say方法,Dog继承了Animal,并重载了say方法。新建Dog对象,查看运行结果,若将Animal中say方法改为private,再次运行程序查看结果:
public class Dog extends Animal { private String name; public Dog() { System.out.println("dog init"); name = "jack"; } public void say() { System.out.println("my name is:" + name); } public static void main(String[] args) { new Dog(); } } class Animal { public Animal() { System.out.println("animal init"); say(); } // private public void say() { System.out.println("i am an animal.."); } }
运行结果1:
animal init
my name is:null
dog init
若将Animal中的say方法改为private,运行结果2如下:
animal init
i am an animal..
dog init
对于运行结果1执行顺序:
- Dog构造器会首先默认调用父类Animal的构造器进行初始化,(同样Animal继续往上调用父类构造器)。
- Animal构造器调用say方法,由于子类Dog中重载了say方法,所以会调用子类中的say方法。
- 然后执行Dog构造方法中的部分。
- 对于运行结果2,因为private方法默认为final,在子类中是不可见的,所以无法重载,Dog中的say方法非继承父类,所以新建Dog对象时Animal构造器方法仍然是调用他本身的final private void say 方法。
二 总结
构造方法中应尽量避免调用其他方法,因为此时对象还没有完全初始化,调用类的其他方法可能会遇到很多不可预知的错误。若迫不得已必须在构造器中调用,则应该将调用的方法设置为final方法
(或private,private方法编译器也会默认加上final修饰符)。
相关文章推荐
- 一个C#和C++执行效率对比的简单实例
- Singleton单例模式是最简单的设计模式,它的主要作用是保证在程序执行生命周期中,使用了单类模式的类仅仅能有一个实例对象存在。
- 实例化一个类的对象时的执行顺序
- java构造器的一个执行顺序例子
- 简单测试java里一个对象的初始化是按怎样的顺序执行的
- 一个C#和C++执行效率对比的简单实例
- Unity对象实例的执行顺序探究及一个对象关联多个脚本的
- 实例化一个对象(类加载)的执行顺序详解
- 一个最简单的Ajax实例(大部分是抄袭的)
- 2. 一个简单的Servlet--产生存文本下面是一个产生存文本的简单servlet的实例
- 一个简单的读写注册表实例
- 发布一个超级mini的ajax源代码(含简单实例)
- 一个最简单的AJAX实例及解析
- 一个简单的SWT程序实例及详解
- 一个简单的hibernate实例(之一)
- 一个简单的linux下网络程序实例-网络编程入门
- 最简单的一个堆栈溢出攻击实例 (1) [by Progsoft]
- SWT组件的生命周期(续一个简单的SWT程序实例及详解)
- 一个最简单的Ajax实例(大部分是抄袭的)
- 利用access执行命令的一个实例