博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java构造器执行顺序一个有趣的简单实例
阅读量:4663 次
发布时间:2019-06-09

本文共 1153 字,大约阅读时间需要 3 分钟。

一  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执行顺序:

  1. Dog构造器会首先默认调用父类Animal的构造器进行初始化,(同样Animal继续往上调用父类构造器)。
  2. Animal构造器调用say方法,由于子类Dog中重载了say方法,所以会调用子类中的say方法。
  3. 然后执行Dog构造方法中的部分。
  4. 对于运行结果2,因为private方法默认为final,在子类中是不可见的,所以无法重载,Dog中的say方法非继承父类,所以新建Dog对象时Animal构造器方法仍然是调用他本身的final private void say 方法。

 

二  总结 构造方法中应尽量避免调用其他方法,因为此时对象还没有完全初始化,调用类的其他方法可能会遇到很多不可预知的错误。若迫不得已必须在构造器中调用,则应该将调用的方法设置为final方法 (或private,private方法编译器也会默认加上final修饰符)。

 

转载于:https://www.cnblogs.com/yoohot/p/6026996.html

你可能感兴趣的文章
从源码看集合ArrayList
查看>>
mybatis配置多数据源(利用spring的AbstractRoutingDataSource)
查看>>
文章点击量排行TOP100-IBM power8算法挑战赛第三期
查看>>
前端常见问题
查看>>
熟悉常用的HDFS操作
查看>>
面向对象和面向过程的比较
查看>>
数据结构 树的建立与遍历
查看>>
[置顶] java swing的树操作(增删改)
查看>>
jetty对sessionId的处理分析
查看>>
代理的四种实现方式
查看>>
12-29 注册审核
查看>>
计算一个算数表达式的值
查看>>
hdu squarefree number
查看>>
atc-前端模板预编译器
查看>>
SDF(Signed-distance-field: 有向距离场)(7): 距离场函数-基于CUBE计算方式产生的若干变体A...
查看>>
poj 3468 A Simple Problem with Integers 线段树区间加,区间查询和
查看>>
Codeforces Round #194 (Div. 1) A. Secrets 数学
查看>>
看不懂 ASP.NET 相册上传代码
查看>>
redis+mysql
查看>>
IIS中找不到dll文件的依赖项问题
查看>>