当我创建自己的Android自定义类时,extend
它就是本机类。然后,当我要重写基方法,我总是叫super()
方法,就像我一直做的onCreate
,onStop
等
我认为就是这样,因为从一开始,Android团队就建议我们始终调用super
每个方法重写。
但是,在 许多书籍中,
我可以看到比我自己更有经验的开发人员经常忽略调用,super
而且我真的怀疑他们是因为缺乏知识而这样做。例如,看看这个基本的SAX,其中解析器类super
中被省略startElement
,characters
并且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()
逻辑两个A
和B
,在该特定的顺序。如果您未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