这个想法有些含糊不清,我需要澄清。
我的问题是使用此代码时:
public class B {
private void don() {
System.out.println("hoho private");
}
public static void main(String[] args) {
B t = new A();
t.don();
}
}
class A extends B {
public void don() {
System.out.println("hoho public");
}
}
输出为hoho private
。
这是因为main函数与method在同一类中don
,还是由于重写?
我已经在书中读过这个想法,当我将该main
函数放在另一个类中时,会出现编译器错误。
您不能覆盖private
方法。如果投射A
到,则看不到B
。您 可以
覆盖一个protected
方法,但这不是您要在此处执行的操作(是的,在这里,如果将移至main
,A
则会得到另一个方法。我建议@Override
您在打算覆盖时注解,
class A extends B {
@Override
public void don() { // <-- will not compile if don is private in B.
System.out.println("hoho public");
}
}
在这种情况下,为什么编译器没有提供使用
t.don()
is是错误private
?
Java教程:预定义的注释类型说(部分)
虽然在重写方法时不需要使用此批注,但它有助于防止错误。如果标有的方法
@Override
无法正确覆盖其父类之一中的方法,则编译器将生成错误。
问题内容: 在Java中重写私有方法是无效的,因为父类的私有方法是“自动最终的,并且对派生类是隐藏的”。我的问题主要是学术上的。 不允许父级的私有方法被“重写”(即,在子类中以相同的签名独立实现),这是否违反封装规范?根据封装的原理,子类不能访问或继承父级的私有方法。它是隐藏的。 那么,为什么应该限制子类实现自己的具有相同名称/签名的方法呢?这是否有一个良好的理论基础,还是仅仅是某种务实的解决方案
问题内容: 我知道我可以使用反射来调用私有方法,并获取或设置私有变量的值,但是我想重写一个方法。 我希望方法 可以打印出来,但是可以打印出来。我听说这可以通过反思来完成,但是我不知道怎么做。如果不是反思,有谁知道另一种方式吗?(除了使方法受保护,或者将方法复制并粘贴到。)如果实际上无法覆盖私有方法,是否可以在其上放置某种触发器以在子类之前或之后调用我的子类中的方法?私有方法执行后? 问题答案: 私
问题内容: 考虑以下代码: 现在,更改方法的可见性,我得到: (for ,for ) (看起来像)。 我期望所有东西都像声明时一样。但是,尽管和本质上是同一件事,但根据in 和的可见性,它们会产生不同的结果。为什么会这样? 问题答案: 继承/覆盖私有方法 在PHP中,子类中的方法(包括私有方法)为: 复制;保留原始功能的范围。 已替换(如果需要,则为“覆盖”)。 您可以使用以下代码查看此内容: 现
问题内容: 因此,这是该书的引文: 覆盖方法不得抛出比被覆盖方法声明的异常新的或更广泛的检查异常。例如,声明FileNotFoundException的方法不能被声明SQLException,Exception或任何其他非运行时异常的方法覆盖,除非它是FileNotFoundException的子类。 现在这是我的问题,如果超类中的方法引发异常,那么重写方法可以根本不引发异常吗? 因为我只是在Ja
问题内容: 这个问题来自一个作业。我必须在创建循环链接列表的类中重写toString()方法,而实际上我的toString()方法效果很好,它通过了我所有的测试。因此,我的项目是自动分级的,显然它不是100%赞成我的方法。所以我的问题是:有没有更好的方法来编写此toString()方法,这样会更有效? 如果我需要详细说明类结构,以便更有意义,请告诉我。 问题答案: 使用StringBuilder。
问题内容: 我想为Java中的ArrayList拥有toString()方法的自己的实现。但是,即使我将这样的toString()添加到包含ArrayList的类中,我也无法正常工作。 当我这样调用ArrayList时,我仍然会获得默认表示形式。我想念什么吗? 问题答案: 你应该做类似的事情 并将列表作为参数传递给。您 可以从 技术上扩展(使用匿名类或具体类)并实现自己,但这在这里似乎是不必要的。