当前位置: 首页 > 面试题库 >

什么时候覆盖时不调用super()方法?

郗奇玮
2023-03-14
问题内容

当我创建自己的Android自定义类时,extend它就是本机类。然后,当我要重写基方法,我总是叫super()方法,就像我一直做的onCreateonStop

我认为就是这样,因为从一开始,Android团队就建议我们始终调用super每个方法重写。

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

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。不要绑定到此特定示例。这只是从许多例子中随机挑选的一个例子。

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


问题答案:

通过调用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()将执行save()逻辑两个AB,在该特定的顺序。如果您未super.save()在内部呼叫B.save(),则A.save()不会被呼叫。如果你叫super.save()save(b)A.save()将有效地执行之后B.save()

如果您想 覆盖 super的行为(也就是说,完全忽略其实现并自行提供),则不应调用super

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

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

super()正如@barsju他的评论所指出的那样,关于IDE生成的代码中的默认调用,在每个构造函数中都有一个隐式调用super()(即使您没有在代码中编写它),在这种情况下,这意味着对super‘的默认构造函数。在IDE刚刚记下来给你,但它也将得到,如果你删除它叫。还要注意,在实现构造函数super()或其带参数的任何变体(即super(x,y,z))时,只能在方法的
开始处 进行调用。



 类似资料:
  • 问题内容: 我目前正在Java课程中学习有关类继承的信息,我不知道何时使用该调用? 编辑: 我发现使用此代码示例: 因此,我知道在这里,你必须使用它来访问超类中的变量。但是,在其他情况下,该怎么;办?在其自己的? 问题答案: 精确 调用始终是多余的。它明确地在做否则会隐式地做的事情。这是因为如果你省略对超级构造函数的调用,则无论如何都将自动调用无参数的超级构造函数。并不是说这是不好的风格。有些人喜

  • 问题内容: 如果我有 如果我比较A的2个实例但没有覆盖equals方法,是否可以获得预期的结果? 问题答案: 如果我比较A的2个实例但没有覆盖equals方法,是否可以获得预期的结果? 这取决于您的期望:) 默认实现将为您提供 引用相等性-换句话说,当您比较两个引用时,仅当它们是对同一对象的引用时才返回true。 通常,您将重写以实现“值相等”,在这种情况下,两个不同的对象通常被认为具有相等的字段

  • 问题内容: 我应该为我创建的任何类重写函数吗? 即使是非常简单的类只包含一些非常简单的属性,并通过 平等 ,我需要它的每一个属性是一样的吗? 问题答案: 我应该为我创建的任何类重写equals函数吗? 当(且仅当)对象“表示某些数据”(即,如果它对,或(例如,这些通常以集合等结尾))进行建模时,覆盖。不要覆盖其他类型的类的equals,例如或。 请记住,无论何时重写,都应始终重写。 (一个自然的后

  • 什么时候才有理由将其添加到清单中。xml? 谢啦

  • 问题内容: 我阅读的所有资料都提到了几个案例,并以“其他一些案例”作了总结。在视图/活动中调用onSaveInstanceState方法时,所有情况是什么? 问题答案: 该文档称 在活动被杀死之前将调用此方法,以便将来在将来返回某个时间时可以恢复其状态。

  • 问题内容: 好的,我从很多地方和来源都听说过,每当我覆盖equals()方法时,我也需要覆盖hashCode()方法。但是请考虑以下代码 这里的输出为true,完全按照我想要的方式为false,我根本不关心重写hashCode()方法。这意味着hashCode()覆盖是一种选择,而不是每个人都说的强制性选择。 我想要第二次确认。 问题答案: 它对您有用,因为您的代码未使用任何需要API的功能(Ha