只看不写 2017-10-13 14:18 采纳率: 40%
浏览 961
已采纳

老司机请进关于java this关键字

请问怎么解释这个结果。图片

  • 写回答

6条回答 默认 最新

  • 菜瓜3306 2017-10-14 04:46
    关注

    打印了两条记录,我一个一个跟你分析一下:
    首先第一个:
    打印的是子类的run方法,这个很好理解的,首先,你new 的是子类的对象,调用的是父类的run2()方法,此时,run2()方法中的this其实是子类的对象,你可以打印一个System.out.println(this.getClass()),确认一下,所以,子类对象就会看它自己有没有run()方法,很明显是有的,你可以理解为这是方法的重写,所以调用的就是子类的run()方法;
    然后第二个问题:
    为什么上面描述的this是子类对象,但是得到的却是父类的值呢?其实.run2()这个方法是属于父类的,父类是无法获得子类的属性的,方法可以重写,但是属性没有重写这个概念,当你调用this.(成员属性)的时候,查找属性值顺序:方法,成员,然后会去这个方法所在类的父类去找,就近原则返回结果,...但是,要注意的是,在父类里面是无法直接获得子类的成员变量的,要想获得,就要通过创建对象的方式来获取

    下面给你一段代码,你可以用我的代码去实验一下:

    public class Test {
    /*public static void main(String[] args) {
    Child child=new Child();
    child.run2();
    }*/
    public static void main(String[] args) {
    Man m=new Child();
    System.out.println(m.age); //获得的是Man的属性值
    m.run(); //调用子类的方法
    }
    }

    class People{
        int age=100;
        public void run() {
            System.out.println("人类执行了");
        }
    }
    
    class Man extends People{
    
        public void run() {
            System.out.println("父类执行了");
        }
    
        public void run2() {
            this.run();
            System.out.println(this.getClass());
            System.out.println(this.age);
        }
    }
    
    class Child extends Man {
        int age = 10;
        public void run() {
            System.out.println("子类执行了");
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥15 绘制多分类任务的roc曲线时只画出了一类的roc,其它的auc显示为nan
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?