Android——记面试问题

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的几种情况

  1. 加载大图
  2. 文件流使用完没有释放
  3. 非静态内部类持有外部引用,并设置静态修饰
  4. 内部类Handler的使用
  5. Bitmap使用后未调用recycle()

先到这里,有时间继续。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值