java构造器有趣的案例

qq_24904257 2019-06-20 08:46:46
a构造器执行顺序一个有趣的简单实例 一 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修饰符)。
...全文
45 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧