当前位置: 首页 > 知识库问答 >
问题:

为什么在这里调用超类方法?

胡彭亮
2023-03-14

这是我的密码

class Hello{
    void method(){
        System.out.println("super method");
        meth();
    }
    private void meth(){
        System.out.println("sup meth");
    }
}
public class HelloWorld extends Hello{
    //@Override - would fail as meth is private in Hello
    protected void meth(){
        System.out.println("sub meth");
    }
    protected void method(){
        super.method();
    }
     public static void main(String []args){
        new HelloWorld().method();
     }
}
super method
sup meth
super method
sub meth 

结果为上述结果之一。从meth调用meth仍然调用子类的meth,即使从词汇上讲,meth调用在超类内部!那么,当meth是私有的时候,为什么会有不同的行为呢?

___________edit____________

代码是这样的吗

class Hello{
    void method(){
        System.out.println("super method");
        meth();
    }
    protected void meth(){
        System.out.println("sup meth");
    }
}
public class HelloWorld extends Hello{
    //@Override - would fail as meth is private in Hello
    protected void meth(){
        System.out.println("sub meth");
    }
    protected void method(){
        super.method();
    }
     public static void main(String []args){
        new HelloWorld().method();
     }
}

O/P将是

super method
sub meth

因此,即使超级类hello中的meth正在调用meth,但实际上子类的meth正在被调用。所以,方法调用不是词法意义上的!也就是说,即使看起来将调用超级类的meth,实际上它的子类的becoz子类实例首先调用了method。在超类中使用methprivate时,为什么情况不同

共有1个答案

井旺
2023-03-14

您不能像编译器告诉您的那样重写私有方法。所以超级类唯一知道的meth()是它自己的。

您不能重写私有方法,因为它是类的内部方法,所以它的子类甚至不知道它的超级私有方法的存在。

 类似资料:
  • 问题内容: 我创建了一个用于显示工具提示的指令: 对应功能: 应用于此: 这是我观点的一部分,由拥有者的控制器处理 为什么必须调用才能将更改应用到,该更改是早先声明和初始化的? 问题答案: 因为附加到事件的回调超出了angular的范围;angular不知道该函数何时运行/结束,因此摘要循环永远不会运行。 调用或告诉angular更新绑定并触发任何手表。

  • 问题内容: 我应该开发一个简单的SFTP。 一切都进行得很好,直到我(在本例中)没有编写全部为止。可以请我解释一下,为什么系统挂在我身上吗? 服务器端: 客户端: 问题答案: 您的循环一直运行到流结束,但是对等方永远不会关闭套接字。该协议似乎要求打开套接字以供其他命令使用,因此您必须调整它的这一部分以包括一个长度字前缀,以便您知道要复制多少字节。 问题不是关于不写所有字节,而是关于阻塞in 。

  • 问题内容: 我正在尝试通过以下方式将日期范围划分为各个日期: 而且我不知道为什么不起作用,因为日期仍然相同,所以循环变得无限。 问题答案: plusDays不会改变原始的,您必须分配结果:

  • 问题内容: 我刚浏览了Android开发者网站,刷新了活动生命周期,在每个代码示例中,超类方法旁边都有一条注释,上面写着“始终先调用超类方法”。 尽管这在创建半周期(onCreate,onStart和onResume)中是有意义的,但对于销毁半周期的正确过程是什么,我还是有些困惑:onPause,onStop,onDestroy。 首先销毁实例专用资源,然后销毁实例专用资源可能依赖的超类资源,这是

  • 我试着玩pyplay,我可以在屏幕上画一个精灵的形象。我试图通过改变x和y变量来移动WASD中的精灵。 当我运行程序时,精灵会绘制,但当我按正确的键时不会移动。 编辑:我添加了一个更新方法,moveY参数说它不在那里,尽管它显然在那里,为什么? 这是代码:

  • 问题内容: 资源: 编译: 错误: 我正在使用,代码o / p表示无论如何都进行了var arg调用。 问题答案: 这是因为和不完全匹配。 首先,您必须将强制转换为(如果要将字符串作为单独的参数传递)或(如果只需要一个作为数组的参数)。 为什么这是警告而不是错误?向后兼容。在引入varargs之前,您已经使用了这些方法,并且在将方法升级为使用varargs之后,针对该方法编译的代码仍应以相同的方式