java类中代码的执行顺序

java类中代码的执行顺序

先看一下代码
package test;

public class test1 {
     static class A{
         C c = new C();
         public A(){
             System.out.println("A类的构造方法");
         }
         static void eat(){
             System.out.println("A类的静态方法");
         }

         static{
                 System.out.println("A类的静态代码块");
         }
          void see(){
              System.out.println("A类的普通方法");
          }

     }
     static class B extends A{
         public B(){
             System.out.println("B类的构造方法");
         }
         static void eat(){
             System.out.println("B类的静态方法");
         }
         static{
             System.out.println("B类的静态代码块");
         }
         void see(){
             System.out.println("B类的普通方法");
         }
     }
     static class C{
         public C(){
             System.out.println("C类的构造方法");
         }
         static void eat(){
             System.out.println("C类的静态方法");
         }
         void see(){
             System.out.println("C类的普通方法");
         }
         static{
             System.out.println("C类的静态代码块");
         }
     }

     public static void main(String srgs[]){
         B b = new B();
         System.out.println("----------------------------------------------");
         System.out.println("静态类不一定有静态方法,有静态方法的一定是静态类");
         System.out.println("----------------------------------------------");
         C.eat();
         System.out.println("----------------------------------------------");
         System.out.println("静态方法可以通过  “类名.方法名”的方式调用");
         System.out.println("----------------------------------------------");
         C c = new C();
         c.see();
     }
}
执行结果如下

这里写图片描述

执行流程
Created with Raphaël 2.1.0 Start 父类中的静态代码块(初始化时执行一次) 子类中的静态代码块(初始化时执行一次) 父类中属性类的静态代码块(初始化时执行一次) 父类中属性类的构造方法 父类的构造方法 子类中属性类的静态代码块(初始化时执行一次) 子类中属性类的构造方法 子类的构造方法 end
我们来对执行结果分析一下

我们来看main函数中的语句

B b = new B();

首先,初始化B类,初始化B类前,会先初始化A类,之后再初始化B类,而静态代码块是在类初始化时加载的。
所以初始化B类的时候:也就是执行B b完成后,程序打印出:

A类的静态代码块
B类的静态代码块

接下来执行new B();
因为B继承了A类,所以要先初始化A类的属性类,即:

C c = new C();

就会对C类进行初始化、实例化的过程,执行结果如下:

C类的静态代码块
C类的构造方法

如果只是类的属性类的声明,如:

C c;

则不对C类进行初始化,更不会实例化

接着就开始执行A类的构造方法,程序输出结果:

A类的构造方法

父类完成后,开始对子类的属性初始化,以及属性结构方法的调用,最后完成子类的实例化。

参考博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值