继承和覆盖 java,关于java:了解继承和覆盖

实际上,我的问题已经回答了,但我不能正确理解。以下是代码段:

public class Superclass {

public static void main (String[] args){

Superclass obj = new Subclass();

obj.doSomething(); #prints"from Superclass"

}

private void doSomething(){System.out.println("from Superclass");}

}

class Subclass extends Superclass {

private void doSomething(){System.out.println("from Subclass");}

}

它打印出:"来自超类"

Since the reference type of the object obj is SuperClass, a call to

doSomething() tries to access the private method defined in SuperClass

itself (private methods cannot be overridden). As doSomething() is

accessible within SuperClass, the main method can call doSomething()

without giving any error/s.

就我所能想象的,方法调用是这样工作的:(也许我完全错了):

对象的实例只存储数据本身,而当我调用实例方法时,Java查看引用变量的类型,并从该类型的类调用方法。(在我看来,这是合乎逻辑的,并解释了为什么上面的代码打印"来自超类")。

但是,将第一个EDCOX1的0访问方法中的访问修饰符更改为"保护"使我感到困惑,因为如果引用类型是EDCOX1(1)而不是EDCOX1(2),我无法理解Java是如何知道有一个重写的。重写是否也会更改SuperClass中的方法?

或者我完全错了方法调用和重写是如何工作的?

如果有人能帮助我,解释我所缺少的东西,我会非常感激。

在这里查看关于访问控制的Java文档

私有方法以及静态方法和所有变量都不能被重写,它们可以被隐藏。因此,您需要将方法的访问修饰符从private更改为任何其他访问修饰符。

注意:当重写一个方法时,有几个协议要遵循;子类中定义的方法的访问修饰符如果不能比被重写的方法更容易访问,则必须具有相同的访问级别。返回类型必须协变等…

overriden方法不需要具有完全相同的返回类型。全局要记住的是,重写方法不能更改方法定义的兼容性。它意味着,如果一个方法在上下文中是可访问的,则重写必须至少在具有相同约束的情况下可见,但可以放大它。另一方面,重写方法可以用更具体的返回类型声明,因为它扩展了原始的返回类型,并且返回类型协定从抽象调用方仍然有效。但是,由于编译时的方法解析,不能更改参数。

首先,我不明白为什么Java不在子类中寻找重写方法,这是因为正如你所说的,只能隐藏私有方法和静态方法。现在看起来很简单:)

重写方法的功能只是定义另一种使用继承执行相同方法的方法。

不,超能力根本不会改变(除非你在做一些奇怪的事情,但那是另一个故事)。

只有类本身可以"看到"方法时,才会使用private关键字。另一方面,protected关键字正好用于继承:类及其子级可以看到该方法。这就是为什么您只能重写受保护的方法。

因为您已经将"dosomething"定义为私有方法,所以重写不起作用。将其更改为public或protected,然后查看输出。

为了更好地理解它,在另一个Java文件中移动子类。现在告诉我,可以从对象句柄进行私有方法调用吗?

除此之外,这是一个使用@Override注释可以避免混淆的实例。如果op将其添加到当前代码中,它将通知他子类方法不会覆盖任何内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值