码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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);
          }
      }
      
      • x在Father类中是一个实例变量,初始值为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:

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

    输出结果

    Son.x=0
    Son.x=30
    20
    
  • 相关阅读:
    【前端开发】CSS BEM命名规范
    ChineseChess.2023.11.09.01
    PMP证书续费是否真的有必要呢?(内附续证流程)
    10个前端开发常用的速查网站
    单片机内部IO口保护电路及IO口电气特性以及为什么不同电压IO之间为什么串联一个电阻?
    C++ Tutorials: C++ Language: Compound data types: Dynamic memory
    emqx 启动正常,但是1883端口无法telnet,emqx无法正常工作
    cart算法python实现:从CART算法中学习如何构建有效的决策树
    Redis网络模型
    后端 | 如何卸载 setup.py 安装 python 包 | Python
  • 原文地址:https://blog.csdn.net/qq_38096989/article/details/139454516
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号