子类重写父类方法,调用时会调用子类重写之后的方法

 

1, 以下代码执行的结果显示是多少( )?

public class Demo {
    class Super{  int flag=1;
        Super(){
            test();
        }
        void test(){
            System.out.println("Super.test() flag="+flag);
        }
    } class Sub extends Super{
        Sub(int i){
            flag=i;
            System.out.println("Sub.Sub()flag="+flag);
        }  void test(){
            System.out.println("Sub.test()flag="+flag);
        }
    }  public static void main(String[] args) {
        new Demo().new Sub(5);
    }
}

//Sub.test()flag=1
//Sub.Sub()flag=5

继承中代码的执行顺序为:

1.父类静态对象,父类静态代码块                                             

 2.子类静态对象,子类静态代码块                                             

 3.父类非静态对象,父类非静态代码块                                            

 4.父类构造函数                                             

 5.子类非静态对象,子类非静态代码块                                               

6.子类构造函数

1.首先调用父类构造方法,即super(){父类先初始化了 int flag = 1,然后执行父类的构造函数Super()}

2.调用test()方法。

3.由于在子类sub()中重写了test()方法,所以调用子类test()

4.输出Sub.test() flag=1

5.调用sub的有参构造方法

6.输出Sub.Sub() flag=5 

重点在于要时刻记得子类重写父类方法,调用时会调用子类重写之后的方法

当然,这一切的前提都是 实例化子类对象

2,下面代码的输出是什么?  // null 

public class Base

{
    private String baseName = "base";
//构造函数
    public Base()
    {
        callName();
    }

    public void callName()
    {
        System. out. println(baseName);
    }

    static class Sub extends Base
    {
        private String baseName = "sub";
        public void callName()
        {
            System. out. println (baseName) ;
        }
    }

   public static void main(String[] args)
    {
        Base b = new Sub();
    }
}

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

创建基类即默认调用Base()方法,在方法中调用callName()方法,由于派生类中存在此方法,则被调用的callName()方法是派生类中的方法,此时派生类还未构造,所以变量baseName的值为null 。

调用构造函数才会完成初始化。

题目:https://www.nowcoder.com/questionTerminal/c2bfb1512dfa4a7eab773a5871a52402

猜你喜欢

转载自blog.csdn.net/nsjlive/article/details/89501836