今天整理异常处理的代码,居然发现了一个很神奇的东西,静态方法竟能访问类的私有数据,下面一起看看吧,直接上代码!
private Context mContext;
//默认的主线程异常处理器
private UncaughtExceptionHandler mDefaultHandler;
//在application中初始化
public static void init(Context applicationContext) {
CrashHandler crashHandler = getInstance();
//mContext = applicationContext;
crashHandler.mContext = applicationContext;
crashHandler.mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(crashHandler);
}
直接看代码不是很直观,下面看代码在 Android studio 中的显示:
可以发现我们直接访问了 crashHandler 这个对象的私有数据,但是并没有使用 getter 函数,当然也可以看到静态方法是不能直接访问外部类的私有数据的,因为它并没有持有外部类的引用。
分析
其实一看到静态方法居然能访问私有数据还是挺震惊的,但是仔细想想好像也是没什么大问题的,因为静态方法也是在外面这个类里面,private 限制符限制的是只能在同一类的成员函数中访问,而成员函数是包含静态成员函数和非静态成员函数,所以静态方法在类中访问同类对象的私有数据是没问题的,但是不能访问没有引用的外部类的私有数据,因为外部类可能都还没有对象,即使有对象又怎么能知道是哪一个对象呢?所以如图中一个报错一个不报错(个人理解)。
public class CrashHandler implements UncaughtExceptionHandler, Comparable<CrashHandler> {
private Context mContext;
@Override
public int compareTo(CrashHandler other) {
return this.mContext == other.mContext ? 1 : 0;
}
}
事实上,private 这种访问同类其他对象私有数据的情况还是很常见的,例如实现 Comparable 接口的时候,可以直接访问另一个对象的私有数据,但是没想到在静态方法中也可以这样用。