• JAVA中一段有趣的代码-关于类、多态、变量的执行分析


    以下代码的执行结果是什么?为什么?

    class Father{
        public int x = 10;
    
        Father(){
            this.print();
            x=20;
        }
    
        public void print(){
            System.out.println("Father.x="+x);
        }
    }
    
    class Son extends Father{
        public int x = 30;
    
        Son(){
            this.print();
            x=40;
        }
    
        public void print(){
            System.out.println("Son.x="+x);
        }
    }
    
    
    public class test {
        public static void main(String[] args) {
            Father f = new Son();
            System.out.println(f.x);
        }
    }
    

    代码分析

    1. Father类的定义

      class Father{
          public int x = 10;
      
          Father(){
              this.print();
              x = 20;
          }
      
          public void print(){
              System.out.println("Father.x=" + x);
          }
      }
      
      • xFather类中是一个实例变量,初始值为10。
      • 构造方法中调用了this.print()方法,然后将x设置为20。
    2. Son类的定义

      class Son extends Father{
          public int x = 30;
      
          Son(){
              this.print();
              x = 40;
          }
      
          public void print(){
              System.out.println("Son.x=" + x);
          }
      }
      
      • Son类继承Father类,并重新定义了实例变量x,初始值为30。
      • 构造方法中调用了this.print()方法,然后将x设置为40。
    3. test类的main方法

      public class test {
          public static void main(String[] args) {
              Father f = new Son();
              System.out.println(f.x);
          }
      }
      
      • 创建了一个Son类的实例,并将其引用赋给Father类型的变量f
      • 打印f.x的值。

    代码执行过程

    1. 创建Son对象:

      • new Son()执行时,首先调用Father类的构造方法。
      • Father类的构造方法中,this.print()实际调用的是Son类的print()方法,因为此时对象的实际类型是Son
      • 由于Son类的实例变量x还未初始化,所以此时Son类的x的默认值为0,因此输出Son.x=0
      • 然后Father类的构造方法继续执行,将Father类中的x设置为20。
      • 接着,Son类的构造方法执行,this.print()再次调用Son类的print()方法,输出Son.x=30,因为此时Son类的x已经被初始化为30。
      • 最后,Son类的构造方法将Son类的x设置为40。
    2. 打印f.x:

      • fFather类型的引用,所以访问的是Father类的x,即20。
      • 特别要记得:属性不存在多态性!!

    输出结果

    Son.x=0
    Son.x=30
    20
    
  • 相关阅读:
    开发运维-常用远程桌面开源软件
    常用adb 命令
    基于ARM架构openEuler系统通过qemu模拟器自动安装启动ARM架构的openEuler虚拟机
    Windows安装svn命令
    拓扑结构+差分约束+SLF最长路+扩欧
    java-php-net-python-校园后勤计算机毕业设计程序
    珠宝饰品经营小程序商城的作用是什么
    故障分析 | MySQL Router:服务器后端那么闲,为什么不让访问?
    《Docker极简教程》--Docker的高级特性--Docker Swarm的使用
    51单片机+DS1302设计一个电子钟(LCD1602显示时间)
  • 原文地址:https://blog.csdn.net/qq_38096989/article/details/139454516