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

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

但是,在many books年,我可以看到比我更有经验的开发人员经常忽略拨打super,我真的怀疑他们这样做是因为缺乏知识.例如,看看这个基本的SAX解析器类,其中startElementcharactersendElement中省略了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将始终作为自动化过程的一部分创建.

这只是一个简单的例子.书是full of similar code美元.

他们怎么知道你什么时候必须打super,什么时候你可以不打呢?

注意:不要拘泥于这个具体的例子.这只是从许多例子中随机选取的一个例子.

(这听起来可能是个初学者的问题,但我真的很困惑.)

推荐答案

通过调用super方法,您不是该方法的行为的overriding,而是extendingit.

调用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()的调用将按此特定顺序执行ABsave()逻辑.如果你不在B.save()内拨打super.save()A.save()就不会被拨打.如果你在save(b)之后打super.save(),那么在B.save()之后就会有效地执行A.save().

如果您想要override super的行为(也就是说,完全忽略其实现并自己提供),则不应该呼叫super.

在您提供的SAXParser个示例中,这些方法的DefaultHandler个中的implementations个是空的,这样子类就可以覆盖它们并为这些方法提供行为.在本方法的javadoc条中也指出了这一点.

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

关于IDE生成的代码中的super()默认调用,正如@barsju在他的 comments 中指出的那样,在每个构造函数中都有一个对super()的隐式调用(即使您没有在代码中编写它),这意味着在该上下文中调用super的默认构造函数.IDE只会为你写下它,但如果你把它取下来,它也会被调用.还要注意,在实现构造函数时,super()或其任何带参数的变体(即super(x,y,z))只能调用该方法的at the very beginning.

Android相关问答推荐

如何自定义所选的NavigationBar项目?

错误:无法解析Symbol@style/Theme. Androidstudio in AndroidManifest.html for Kotlin Android Development''

无法安装后重新编译android代码'

在Kotlin Jetpack Compose中点击按钮后启动另一个Android应用程序

无法在Jetpack Compose中显示Admob原生广告

从单元测试访问RES/RAW文件

尽管我们不再使用GCM SDK,但应用程序已被标记为使用GCM SDK

BroadCastReceiver的onReceive方法中的Intent上的Extras为空

Kotlin Android VS Kotlin多平台

在 Compose 中,当用户持续向下滚动时,LazyColumn 不会显示新项目

如何使用其他组件的位置来定位自定义弹出窗口

制作圆形SupportMapFragment

Android Studio XML 文本在 ConstraintLayout 中不居中

AttributionSource 需要 android.permission.BLUETOOTH_SCAN 权限的问题

如何在 Jetpack Compose 中设置行宽等于 TextField 的宽度?

根据 Jetpack Compose 中的生命周期正确处理变量/函数

在 Jetpack Compose 中更改列中子项的对齐方式

新的内部测试应用程序版本不适用于测试人员,即使它说它们是

如何处理 com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: For input string: "T1V 4Y8" Kotlin

如何授予对 Uri 图像的永久权限(androidx)