gpt4 book ai didi

java - 覆盖时何时不调用 super() 方法?

转载 作者:IT老高 更新时间:2023-10-28 11:20:55 25 4
gpt4 key购买 nike

当我创建自己的 Android 自定义类时,我扩展它的原生类。然后当我想重写基本方法时,我总是调用 super() 方法,就像我在 onCreateonStop 等中总是做的那样.

我认为就是这样,因为从一开始 Android 团队就建议我们在每次方法覆盖时始终调用 super

但是,在许多书籍中,我可以看到比我更有经验的开发人员经常省略调用 super,我真的怀疑他们这样做是因为缺乏知识。例如,看看这个基本的SAXstartElementcharactersendElement 中省略 super 的解析器类:

public class SAXParser extends DefaultHandler{
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if(qName.equalsIgnoreCase("XXY")) {
//do something
}
}

public void characters(char[] ch, int start, int length) throws SAXException {
//do something
}

public void endElement(String uri, String localName, String qName) throws SAXException {
if(qName.equalsIgnoreCase("XXY")) {
//do something
}else () {
//do something
}
}
}

如果您尝试通过 Eclipse 或任何其他 IDE 创建任何覆盖方法,super 将始终作为自动化过程的一部分创建。

这只是一个简单的例子。书籍充满了类似的代码

他们怎么知道你什么时候必须调用 super 以及你什么时候可以省略它调用?

PS。不要绑定(bind)到这个特定的例子。这只是从许多例子中随机挑选的一个例子。

(这听起来像是一个初学者的问题,但我真的很困惑。)

最佳答案

通过调用 super 方法,您并没有覆盖该方法的行为,而是扩展它。

super 的调用将执行您要扩展的类为该方法定义的任何逻辑。考虑到在方法覆盖中调用 super 的实现的那一刻可能很重要。例如:

public class A { 
public void save() {
// Perform save logic
}
}

public class B extends A {
private Object b;
@Override
public void save() {
super.save(); // Performs the save logic for A
save(b); // Perform additional save logic
}
}

B.save() 的调用将为 AB 执行 save() 逻辑>,按照这个特定的顺序。如果您没有在 B.save() 中调用 super.save(),则不会调用 A.save()。如果你在 save(b) 之后调用 super.save()A.save() 将在 B 之后有效执行.save().

如果你想覆盖 super 的行为(即完全忽略它的实现并自己提供),你不应该调用 super .

在您提供的 SAXParser 示例中,implementations这些方法的 DefaultHandler 只是空的,因此子类可以覆盖它们并为这些方法提供行为。在 javadoc对于这种方法,也指出了这一点。

public void startElement (String uri, String localName,
String qName, Attributes attributes) throws SAXException {
// no op
}

关于 IDE 生成的代码中的 super() 默认调用,正如 @barsju 在他的评论中指出的那样,在每个构造函数中都有一个对 的隐式调用super() (即使您没有在代码中编写它),这意味着,在这种情况下,调用 super 的默认构造函数。 IDE 只是为您写下它,但如果您删除它,它也会被调用。另请注意,在实现构造函数时,super() 或其任何带有参数的变体(即 super(x,y,z))只能在 at 中调用方法的最开始

关于java - 覆盖时何时不调用 super() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10244785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com