java 对象创建时执行顺序
2014-11-13 23:35
155 查看
package com.help; /* * 执行结果 * Base 中Base(),i=2 class com.help.Demo Demo中display(),i=0 Base 构造器里面的this.display中的this是Demo,所以会输出这句话! Demo中的i=22 */ /* * java 对象创建时执行顺序:1,执行Object类的非静态初始化块(如果有)。2,执行Object类的一个或多个构造器执行初始化。 * 3,执行此类的父类的非静态初始化块(如果有)。4,执行此类的父类一个或多个构造器执行初始化...... * 至于构造器的调用顺序: * 1,子类构造器执行第一行代码使用super显式调用 父 类构造器,系统将根据super传入参数确定调用父类的哪个构造器 * 2,子类构造器执行第一行代码使用this显式调用 本 类构造器,系统将根据this传入参数确定调用父类的哪个构造器(执行本类的另一个构造器时即进入到第一种情况) * 3,子类构造器中即没有super,也没有this的,系统将会在执行 子类构造器之前 ,隐式调用父类无参构造器。 * * */ class Base { private int i = 2; public Base() { System.out.println("Base 中Base(),i=" + i);// this虽然是Demo,但对于变量i是Base初始化的即为2 // System.out.println(this.i);//this虽然是Demo,但对于变量i是指向Base初始化的即为2 System.out.println(this.getClass()); // class // com.help.Demo因为这些是放在Demo构造器中执行的,所以this为Demo // display(); //Base 构造器里面的this.display中的this是Demo,所以会输出这句话 this.display(); // Base 构造器里面的this.display中的this是Demo,所以会输出这句话 // 父类方法中,不能调用子类变量和方法,当极端情况下可以。就是这种,子类重写。 // this.display1(); //编绎出错 } public void display() { System.out.println("Base中的i=" + i);// 此处没有执行,证明上面this,指向的是Demo而 不是Base } //不會執行 public void display1() { System.out.println("Base中的display1的i=" + i);// 此处没有执行,证明上面this,指向的是Demo而 不是Base } } class Demo extends Base { private int i = 22; public Demo() { // 没有this或super的先调用父类的无参构造器 // System.out.println("Demo中的i="+i); // i=222; System.out.println("Demo中的i=" + i); // Demo中的i=22,最后执行 } /* * Java 中的覆盖@Override注解 写与不写的一点点理解 ,这里写不写都是覆盖了父类中的方法 一般来说,写与不写没什么区别,JVM可以自识别 * ,写的情况下:即说明子类要覆盖基类的方法,基类必须存在方法 如果下面这里写成public void * display2(),程序人能执行,Base中但是this,display()去哪了? 如果写成public void * display2(),既子类没有覆盖父类中的方法,那么Base中但是this,display()的display()将执行自己的方法 * * Base 中Base(),i=2 * class com.help.Demo * Base中的i=2 * Demo中的i=22 */ public void display()// 如果这里写成public void // display2(),程序人能执行,Base中但是this,display()去哪了? { System.out.println("Demo中display(),i=" + i); // System.out.println("Base 构造器里面的this.display中的this是Demo,所以会输出这句话!"); } public void display1() { System.out.println("display1"); } } public class Test01 { public static void main(String[] args) { new Demo(); } }
相关文章推荐
- java创建对象时的执行顺序
- java在创建对象时候 成员的执行顺序
- java创建对象时代码执行顺序探讨
- JAVA对象创建执行顺序实验
- Java中创建对象的时候代码执行顺序
- 10、创建java对象各部分的执行顺序
- Java中创建对象时代码执行顺序
- Java中创建对象时,初始化成员变量的代码的执行顺序
- Java中的static关键字解析(转自海子)__为什么main方法必须是static的,因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。
- java对象方法执行顺序规律
- java对象创建过程/初始化顺序
- java中在创建对象时候的初始化顺序
- java类的初始化块/执行顺序,实例化对象数据赋值
- java程序在执行过程中,类,对象以及它们成员加载、初始化的顺序如下:
- MFC学习笔记.day02-创建窗口全过程,MFC执行顺序,BUTTON控件,对象与窗口关系
- Java对象创建阶段的代码调用顺序
- 关于java中子类,父类中,静态代码块: staic{},动态代码块:{},构造方法,类属性,对象属性等执行顺序做个总结:
- 简单测试java里一个对象的初始化是按怎样的顺序执行的
- 再学Java 基础(3)类与对象【构造函数以及其执行顺序----经典讲解】重点!!!
- 创建累的对象时成员的执行顺序