java中类的继承调用顺序例子

//定义父类A
class A{
 //定义静态块
 static{
  System.out.println("A静态块");
 }
 //定义非静态块
 {
  System.out.println("A非静态块");
 }
 //定义构造方法
 A(){
  System.out.println("A构造方法");
 }
 //定义成员变量
 String name = "A的名字";
 static int ii = 0;
 //定义成员方法
 void A1(){
  System.out.println("A1方法:成员变量name为:"+name+";");
 }
 static void A2(){
  System.out.println("A2方法:静态成员变量ii为:"+ii+";");
 }
 //定义内部类B(内部类也可以定义内部类,即内部类可多重嵌套)
 class B{
  int jj = 1;
  B(){
   System.out.println("B构造方法");
  }
  //定义B的内部类C
  class C{
   C(){
    System.out.println("C构造方法");
   }
  }
 }
}
//定义A的子类D
class D extends A{
 static{
  System.out.println("D静态块");
 }
 {
  System.out.println("D非静态块");
 }
 D(int i){
  System.out.println("D构造方法,i的值为"+i);
 }
}
//定义D的子类E
class E extends D{
 static{
  System.out.println("E静态块");
 }
 {
  System.out.println("E非静态块");
 }
 E(){
  super(ii);
  System.out.println("E构造方法");
 }
 void E1(){
  System.out.println("E1方法");
 }
}
//定义运行类F
class F{
 public static void main(String[] a){
   System.out.println("-----");
  E.A2();//调用E类从A类(继承)下来的静态方法 
   System.out.println("-----");
  E.ii = 7;//为静态成员变量赋值
   System.out.println("-----");
  E e = new E();//创建E类的一个实例化对象
   System.out.println("-----");
  E.B b = e.new B();//创建E继承的内部类B的对象
   System.out.println("-----");
  E.B.C c = b.new C();//创建B的内部类C的对象
   System.out.println("-----");
  E e1 = new E();//创建E类的一个实例化对象
   System.out.println("-----");
  e1.A1();//调用E类继承的A1非静态方法
   System.out.println("-----");
  E e2 = new E();//创建E类的一个实例化对象
   System.out.println("-----");
  e2.E1();//定义E类的成员方法
 }
}
/*
运行结果为:

-----
A静态块
A2方法:静态成员变量ii为:0;
-----
-----
D静态块
E静态块
A非静态块
A构造方法
D非静态块
D构造方法,i的值为7
E非静态块
E构造方法
-----
B构造方法
-----
C构造方法
-----
A非静态块
A构造方法
D非静态块
D构造方法,i的值为7
E非静态块
E构造方法
-----
A1方法:成员变量name为:A的名字;
-----
A非静态块
A构造方法
D非静态块
D构造方法,i的值为7
E非静态块
E构造方法
-----
E1方法

例子说明:(类的5种成员:代码块、构造方法、成员变量、成员方法、内部类)
1.产生新对象时类的成员调用顺序:父类静态代码块-子类静态代码块-父类代码块-父类构造方法-子类非静态代码块-子类构造方法
 1.静态代码块只调用一次,非静态代码块每产生一个新对象调用一次
 2.产生新对象时会依次调用父类的代码块和构造方法
 3.父类的内部类子类可以继承(类的多态性)
2.类的内部类仍可以有内部类,即内部类可以嵌套
3.子类可以继承父类(除了构造方法之外)的所有成员,即类的多态性
4.注意的问题:
 注意1:E类调用A类的静态方法A2()时,并没有调用D类和E类的静态代码块?说明子类(继承)父类的静态成员时并不是真的继承,只是子类调用父类的静态成员(多态性)
 注意2:<?>可以推理:子类(继承)父类的非静态成员时也不是真的继承,只是子类对象可以调用父类的非静态成员(这应该就是类的多态性根本的原理:子类的实例化对象即是子类的对象又是父类的对象,调用子类中的成员时这个对象是子类的,调用父类的成员时这个对象是父类的,而不存在实际的继承)
 注意3:创建对象时子类静态代码块比父类非静态代码块先调用?而子类非静态块却在父类构造方法后调用?说明静态块在依附于类,非静态块依附于对象;创建实例化对象时先产生类的静态内存空间并运行静态代码块,然后按父类子类顺序依次产生对象的空间,父类的非静态块与构造方法一样是通过super调用的
*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值