zoukankan      html  css  js  c++  java
  • 关于类加载顺序问题的题

    题目一:

     1 public class Base {
     2     private String baseName="base";
     3     public Base(){
     4         callName();
     5     }
     6     public void callName(){
     7         System.out.println(baseName);
     8     }
     9     
    10     static class Sub extends Base{
    11         private String baseName="sub";
    12         public void callName(){
    13             System.out.println(baseName);
    14         }
    15     }
    16     public static void main(String[] args){
    17         Base b=new Sub();
    18     }
    19 }

    问这个程序的输出结果( )

    A.null      

    B.sub      

    C.base

    考察对类的执行步骤的理解。

    new Sub();在创建派生类.过程中首先创建基类对象,然后才能创建派生类。

    创建基类即调用base()方法,在方法中调用callName()方法,由于派生类中存在此方法,则调用了派生类中的callName()方法,但此时派生类还未构造,所以baseName的值为null。

    一般程序的执行步骤:父类静态代码块>父类非静态代码块>子类静态代码块>父类构造函数>子类非静态代码块>子类构造函数。

    该题中父类引用指向子类子类对象,先执行父类非静态代码块,baseName初始化,然后执行父类构造方法,发现此时直接调用了方法,又因为子类重写了该方法,所以执行了子类的callName()方法,而此时子类非静态代码块还未初始化,编译器默认为null。

    问题二:

     1 class HelloA{
     2     public HelloA(){
     3         System.out.println("HelloA");
     4     }
     5     {
     6         System.out.println("I'm A class");
     7     }
     8     static {
     9         System.out.println("static A");
    10     }
    11 }
    12 public class HelloB extends HelloA{
    13     public HelloB(){
    14         System.out.println("HelloB");
    15     }
    16     {
    17         System.out.println("I'm B class");
    18     }
    19     static{
    20         System.out.println("static B");
    21     }
    22     public static void main(String[] args) {
    23         new HelloB();
    24     }
    25 }

     运行结果是什么?

    对象的初始化顺序:

    1.类加载之后,按从上到下(父类到子类)执行被static修饰的语句;

    2.然后执行main方法;

    3.如果有语句new了自身的对象,将从上到下执行构造代码块、构造函数。

    执行顺序:静态语句块>构造代码块>构造函数

    运行结果为:

    static A
    static B
    I'm A class
    HelloA
    I'm B class
    HelloB

  • 相关阅读:
    Junit 测试 简明教程
    Set接口
    mysql中模糊查询中的转译
    SSH乱码的解决方法
    const in c++
    inline in c++
    SQLite临时文件及其编译参数
    extern “c”
    常见姓名粤语拼法
    SQLite编译指令PRAGMA
  • 原文地址:https://www.cnblogs.com/nullcodeworld/p/8593579.html
Copyright © 2011-2022 走看看