目录
1.final的注意事项
一般常量声明使用‘final,没有深究这个。
当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。
public final Date date = new Date();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//错误
date = new Date();
//正确
date.setTime(new Date().getTime());
}
2.静态方法可以被new出来的对象调用
public class A {
public static void tetsA(){
Log.d("tetsA", "tetsA: ");
}
}
调用
A.tetsA();
A a = new A();
a.tetsA();
3.java继承关系中为什么静态方法不能重写呢
静态方法是类在加载时就被加载到内存中的方法,在整个运行过程中保持不变,因而不能重写。但非静态方法是在对象实例化时才单独申请内存空间,为每一个实例分配独立的运行内存,因而可以重写。
4.记一个LinearLayout布局问题
横向排列,三个控件第一个wrap_content,第二个weight=1,wrap_content
,第三个weight=1,layout_width=200dp
我本以为layout_width=200dp没有什么作用,但经过测试后,发现有作用。
问第二个控件与第三个控件那个大?
在weight相同的情况下,layout_width大,控件就大。
因为系统先按照view的layout_width和layout_height来布局,然后再根据layout_weight对剩余的父控件空间进行分配。
横向排列,三个控件第一个match_parent,第二个weight=1,第三个weight=1
这个不复杂,只要理解match_parent。
match_parent表示让当前控件的大小和父布局的大小一样,也就是由父布局来决定当前控件的大小。
导致的效果是:只显示第一个控件,其他两个控件都挤出屏幕了。
5.public/private/protected/default作用域的比较
作用域与可见性 | 当前类 | 同一package | 子类 | 其他package |
---|---|---|---|---|
Public | 能 | 能 | 能 | 能 |
Protected | 能 | 能 | 能 | 否 |
Default | 能 | 能 | 否 | 否 |
Private | 能 | 否 | 否 | 否 |
6.内存溢出与内存泄漏
内存溢出:指程序在申请内存时,没有足够的内存空间供其使用。比如申请了一个integer,但给它存了long才能存下的数。
内存泄漏: 程序在申请内存后,无法释放已申请的内存空间
7.Handler为什么可能会造成内存泄漏?
handler的实例采用了内部类的写法,它是Activity这个实例的内部类。在java中,非静态的内部类和匿名内部类都会隐式的持有一个外部类的引用。所以,该handler实例持有了Activity的一个引用。
activity在finish后,该实例的handler内部类引用了activity,而该handler实例可能被MessageQueue引用着。比如发送了一个延时消息到队列中,那么就可能在队列中存在很长时间,因此非静态内部类也会长时间持有activity的引用,activity被引用,阻止了MainActivity被垃圾回收器回收。
8.单例双重校验锁中的volatile作用
防止产生指令的重排序问题
单例中的一段代码
if(s == null) { //a
s = new Singleton(); //b
}
b中会执行如下
1 memory=allocate();// 分配内存 相当于c的malloc
2 ctorInstanc(memory) //初始化对象
3 s=memory //设置s指向刚分配的地址
在编译器运行时,可能会出现重排序 从1-2-3 排序为1-3-2。线程A在执行第b行代码时,B线程进来,而此时A执行了 1和3,没有执行2,此时B线程判断s不为null 直接返回一个未初始化的对象,就会出现问题。
9.OOM的几种情况
- 加载大图
- 文件流使用完没有释放
- 非静态内部类持有外部引用,并设置静态修饰
- 内部类Handler的使用
- Bitmap使用后未调用recycle()
先到这里,有时间继续。