【JAVA】代码执行顺序题目

代码执行顺序的题目

public class TestClass {
    static  class Father{
        public int money = 1;

        public Father() {
            this.money = 2;
            showMoney();
        }

        protected  void showMoney(){
            System.out.println("I am Father , I hava $"+money);
        }
    }

    static  class Son extends Father{
        public int money = 3;

        public Son() {
            this.money = 4;
            showMoney();
        }

        protected  void showMoney(){
            System.out.println("I am Son , I hava $"+money);
        }
    }
    public static void main(String[] args) {
        Father guy = new Son();
        System.out.println("This guy has $"+guy.money);
    }
}

结果:

【JAVA】代码执行顺序题目

流程:

  • 执行main的第一句

    Father guy = new Son();
    
    • 先执行父类的
      • 属性赋值
        public int money = 1;
        
      • 父类的构造器
          public Father() {
              this.money = 2;
              showMoney(); //这里调的是Son的showMoney()
          }
        
      • Son的showMoney()
        这时候son的money是0,因此第一条输出是I am Son , I hava $0
        protected  void showMoney(){
           System.out.println("I am Son , I hava $"+money);
        }
        
    • 执行Son的属性赋值
      public int money = 3;
      
    • 执行Son的构造器
         public Son() {
             this.money = 4;
             showMoney();
         }
      
      此时在构造器里把money赋值成了4,所以调用 showMoney()的输出为I am Son , I hava $4
  • 执行main的第二句

    System.out.println("This guy has $"+guy.money);
    

    由于new 出来的对象是Father类型的,所以guy.money应该调的是father.money,由于之前在father的构造器里把father.money赋值成了2,所以这步输出为This guy has $2

上一篇:js类和对象,继承(6中方式)


下一篇:Java访问权限就是这么简单