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修饰符)。

java构造器执行顺序一个有趣的简单实例的更多相关文章

  1. [转]JAVA程序执行顺序,你了解了吗:JAVA中执行顺序,JAVA中赋值顺序

    本文主要介绍以下两块内容的执行顺序,熟悉的大虾可以直接飘过. 一.JAVA中执行顺序 静态块 块 构造器 父类构造器 二.JAVA中赋值顺序 静态块直接赋值 块直接赋值 父类继承的属性已赋值 静态变量 ...

  2. Java文件执行顺序总结

    类执行顺序 一个java文件的执行过程: 编译:加载的类,加载的时候对类中的资源进行编译,首先是静态成员变量,静态方法等,如果有相应操作,就会进行相应的操作, 并且这个Static修饰后的静态成员变量 ...

  3. 一个例子搞清楚Java程序执行顺序

    当我们new一个GirlFriend时,我们都做了什么? 一个例子搞懂Java程序运行顺序 public class Girl { Person person = new Person("G ...

  4. 深入了解Java程序执行顺序

    Java中main方法,静态,非静态的执行顺序详解 Java程序运行时,第一件事情就是试图访问main方法,因为main相等于程序的入口,如果没有main方法,程序将无法启动,main方法更是占一个独 ...

  5. java程序执行顺序

    原来自己一直都没弄明白Java程序的执行顺序问题,今天,自己写了个测试,果然与自己考虑的有差距 测试代码: 一个父类Animal 一个子类Dog 测试类Test 运行结果: 所以执行顺序是: 父类An ...

  6. Java构造函数执行顺序

    首先执行基类的构造函数 然后执行派生类的构造函数之外的初始化语句 最后执行派生类的构造函数 在Java中,如果派生类构造函数需要调用基类的构造函数,那么基类构造函数必须作为派生类构造函数的第一句话.在 ...

  7. java static 执行顺序

    先加载类,然后再实例化类. 继承与static 面试题目如下:请写出程序执行完成之后的结果. package extend; public class X { Y y=new Y(); static{ ...

  8. 【春招】 java static 执行顺序

    package static类型.执行顺序; public class Test { Person person = new Person("Test"); static{ Sys ...

  9. Java代码执行顺序(静态变量,非静态变量,静态代码块,代码块,构造函数)加载顺序

    //据说这是一道阿里巴巴面试题,先以这道题为例分析下 public class Text { public static int k = 0; public static Text t1 = new ...

随机推荐

  1. GIL(全局解释器锁)

    引入 现在绝大部分的Python都是CPython解释器(但不是必须使用CPython解释器),而CPython的一个特性就是有GIL,作用保证解释器级别的代码在运行时不被其他的线程进行修改,即加锁处 ...

  2. Python之编程基础(编程语言分类)

    一.编程语言简介 编程语言主要从以下几个角度进行分类,编译型和解释型.静态语言和动态语言.强类型定义语言和弱类型定义语言. 1.编译型跟解释型 编译型,其实他和汇编语言是一样的,也是有一个负责翻译的程 ...

  3. Android Things 专题6 完整的栗子:运用TensorFlow解析图像

    文| 谷歌开发技术专家 (GDE) 王玉成 (York Wang) 前面絮叨了这么多.好像还没有一个整体的概念.我们怎样写一个完整的代码呢? 如今深度学习非常火,那我们就在Android Things ...

  4. MySQL 删除数据库中反复数据(以部分数据为准)

    delete from zqzrdp where tel  in (select min(dpxx_id) from  zqzrdp  group by tel  having count(tel)& ...

  5. Error code:1728 Cannot load from mysql.proc. The table is probably corrupted

    Error code:1728 Cannot load from mysql.proc. The table is probably corrupted http://bugs.mysql.com/b ...

  6. redhat5安装Oracle11g

    redhat5安装Oracle11g 测试环境redhat5.5 oracle11g VMware 虚拟机 一.linux系统安装 二.下载oracle安装包 (我们需要把oracle安装包上传到li ...

  7. JS排序

    冒泡排序 https://sort.hust.cc/1.bubbleSort.html 选择排序 https://sort.hust.cc/2.selectionSort.html 插入排序 http ...

  8. Linux计划任务crontab

    Linux系统中存在两种工作调度的方式 周期性的(at),每隔一个固定的周期要来办的事项: 一次性的(crontab),做完一次以后就不会再执行: at at是个可以处理仅执行一次就结束调度的指令,不 ...

  9. Django的信号机制

    Django提供一种信号机制.其实就是观察者模式,又叫发布-订阅(Publish/Subscribe) .当发生一些动作的时候,发出信号,然后监听了这个信号的callback函数就会执行. Djang ...

  10. 由一道bash jail题引出的琐事@_@

    关键词:Terminal devices.shell.stdio 题目入口: (需要注册) root@kali:~# ssh level1@24.37.41.154 -p 1016 level1@24 ...