标签

Android 44

Android Network security configuration Android 网络配置 Android Camera Preview gradlew 源码分析 Android 动态修改菜单 Android RelativeLayout 之 Gravity 的使用 Android Studio Gradle Download Error Android加载子View 【转】Android打开与关闭软键盘 Android EditText软键盘显示隐藏以及“监听” Android mipmap文件夹 Android 用命令行更新SDK Android Service学习之AIDL, Parcelable和远程服务 Android 5.0设备中,Notification小图标是白色的 Android最佳实践 Android Keystore 文件的密码修改 Android Studio 中加载so库文件 Android 中方法重载遇到的问题 ListView & RecyclerView Google Volley如何缓存HTTP请求文件 Creating logs in Android applications Advanced Android TextView TextView高亮URL地址解析 TextView 高亮URL地址,并实现跳转 Best practices in Android development Android Sdk Manager无法更新问题解决办法 Android ViewPager滑动事件 Google Volley 网络请求框架(一) Andorid UI注入工具的使用(ButterKnife) Android 项目中出现的奇葩bug, 数据NullPointExcption Android Drawable Animation Android 图片的毛玻璃效果 Android之使用Log打印日志 使用Fidder来拦截Android发送的HTTP请求 Android之Webview使用 Android之Notification的使用(二) Android之Notification的使用(一) Android Keyboard Show&Hiden Android 粘贴板的使用 Android中使用.9.png 使用Fidder来拦截Android发送的HTTP请求 Andorid JUnit 单元测试 Activity之间的切换动画 Android ListView中Adapter的使用

Android 中方法重载遇到的问题

2015年03月13日

问题描述

今天在使用的一个第三方库,执行的是一个异步下载,有一个封装DownloadInfo的类,在下载的Task中,通过DownloadInfo 获取真实的下载地址。但是由于粗心,库中的getRealUrl方法,没有加任何方法修饰词。我在使用的时候,重写了DownloadInfogetRealUrl方法。在测试中出现了一个问题,在Android 4.4中按照预期的执行,但是在Android 5.0中,却没有按照预期的 效果执行。

详细代码

  1. DownloadInfo
package com.testoverloading.net;
public class DownloadInfo {
    String getRealUrl() {
        return "DownloadInfo real url";
    }
}
  1. 实现类:CustomDownloadInfo
import com.testoverloading.net.DownloadInfo;
public class CustomDownloadInfo extends DownloadInfo{
//    加不加修饰词都一样,在Android 4.4都是执行的这个类的方法,而在Andorid 5.0却是执行的是父类的方法
//    String getRealUrl() {
//        return "customDownloadInfo real url";
//    }
    public String getRealUrl() {
        return "customDownloadInfo real url";
    }
}
  1. Task
package com.testoverloading.net;
public class Task {

    private DownloadInfo mInfo;

    public Task(DownloadInfo info) {
        mInfo = info;
    }

    public String excute() {
        return mInfo.getRealUrl();
    }
}
  1. MainActivity
package com.testoverloading;
// button 的点击事件
public void showText(View view) {
    CustomDownloadInfo downloadInfo = new CustomDownloadInfo();
    this.mShow.setText(new Task(downloadInfo).excute());
}

总结

重写

Method overriding, in object oriented programming, is a language feature that allows a subclass or child class to provide a specific implementation of a method that is already provided by one of its superclasses or parent classes. The implementation in the subclass overrides (replaces) the implementation in the superclass by providing a method that has same name, same parameters or signature, and same return type as the method in the parent class. The version of a method that is executed will be determined by the object that is used to invoke it. If an object of a parent class is used to invoke the method, then the version in the parent class will be executed, but if an object of the subclass is used to invoke the method, then the version in the child class will be executed. Some languages allow a programmer to prevent a method from being overridden.

上面是Wikipedia上给出的文档。

个人理解,子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)

访问访问控制修饰符

Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java支持4种不同的访问权限。

  1. 默认的,也称为default,在同一包内可见,不使用任何修饰符。

  2. 私有的,以private修饰符指定,在同一类内可见。

  3. 共有的,以public修饰符指定,对所有类可见。

  4. 受保护的,以protected修饰符指定,对同一包内的类和所有子类可见。

上面例子中,应该是这两个的交叉点,Android 5.0和Android 4.4中的执行策略不一样而引起的问题.

经测试,是因为Dalvik与Art在运行的时候,运行机制是不同的。



友情链接: Hiro's Blog | Junjun's Blog