Android开发知道的基本知识点总(二)

1.int与integer的区别
 答:1、Integer是int的包装类,int则是java的一种基本数据类型
        2、Integer变量必须实例化后才能使用,而int变量不需要
        3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
        4、Integer的默认值是null,int的默认值是0
2.探探对java多态的理解
 答:面向对象的三大基本特征是:封装、继承、多态。
     封装:为私有变量创建公共方法,使得外部可以调用。这样做的好处是实现了访问控制,让客户端程序员无法触及不应该触及的部分(private),而内创建者不用担心由于自己的修改使得客户端程序员产生影响(public 调用)。
     继承:在创建一个新类后,即使另外一个新类与其具有相似的功能,还必须重新创建一个新类。如果我们以现有的类为基础,将其方法和属性复制到新类就好了,这就是继承。子类继承父类的方法和属性。在父类的基础上,可以添加新的接口元素,这样就扩展了接口,虽然此类型还是可以替代基类,但不很完全,我们称之为is-like-a(像一个)关系;另外,若子类只是覆盖(重写,overriding)父类的方法,被称为纯粹替代,是一种最为理想的方法,导出类和基类的关系成为is-a (是一个)关系。
  多态:同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
 实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
     多态的作用:消除类型之间的耦合关系。
     多态的实现的必要条件:继承,重写,父类引用指向子类对象(即,声明是父类,实际指向的是子类的一个对象)
3.String、StringBuffer、StringBuilder区别
 答:String 字符串常量
        StringBuffer 字符串变量(线程安全)
        StringBuilder 字符串变量(非线程安全)
        String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的:
     String S1 = “This is only a” + “ simple” + “ test”;
     StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);

      StringBuffer
      Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
  例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。
    
    java.lang.StringBuilde
    java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。

4.什么是内部类?内部类的作用
  答:内部类( Inner Class )就是定义在另外一个类里面的类。与之对应,包含内部类的类被称为外部类。
          作用:1. 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
                    2. 内部类的方法可以直接访问外部类的所有数据,包括私有的数据
                    3. 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便
    分类:成员内部类 /静态内部类/方法内部类/ 匿名内部类

5.抽象类和接口区别
  答:当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。
6.抽象类的意义
  答:抽象类的由来:我们在高度抽象一类事物的时候,由于是提取的此类事物公共行为,但具体到某个具体的事物的时候,同一行为又会有不同的表现。所以我们不应该在抽象阶段就给出具体的实现,而只给出方法的声明,也就是不给出方法体,在java中,没有方法体的方法,我们称之为抽象方法,而类中有抽象方法,类就必须声明为抽象类,抽象类由此而来,而且有其存在的必要性。
      抽象类特点:抽象类和抽象方法用 abstract 关键字修饰。抽象类不能被实例化。(其实可以通过多态的方式实例化)抽象类除了不能直接实例化外,其它特性都和普通类一样,同样有成员变量,常量,成员方法。而抽象方法是强制子类实现的功能。
7.泛型中extends和super的区别
   答:<? extends T>限定参数类型的上界:参数类型必须是T或T的子类型
          <? super T> 限定参数类型的下界:参数类型必须是T或T的超类型
 总结为:
   <? extends T> 只能用于方法返回,告诉编译器此返参的类型的最小继承边界为T,T和T的父类都能接收,但是入参类型无法确定,只能接受null的传入
   <? super T>只能用于限定方法入参,告诉编译器入参只能是T或其子类型,而返参只能用Object类接收? 既不能用于入参也不能用于返参
8.final,finally,finalize的区别
  答:1、final修饰符(关键字)。被final修饰的类,就意味着不能再派生出新的子类,不能作为父类而被子类继承。因此一个类不能既被abstract声明,又被final声明。将变量或方法声明为final,可以保证他们在使用的过程中不被修改。被声明为final的变量必须在声明时给出变量的初始值,而在以后的引用中只能读取。被final声明的方法也同样只能使用,不能重载。
     2、finally是在异常处理时提供finally块来执行任何清除操作。不管有没有异常被抛出、捕获,finally块都会被执行。try块中的内容是在无异常时执行到结束。catch块中的内容,是在try块内容发生catch所声明的异常时,跳转到catch块中执行。finally块则是无论异常是否发生,都会执行finally块的内容,所以在代码逻辑中有需要无论发生什么都必须执行的代码,就可以放在finally块中。
     3、finalize是方法名。java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者被执行其他清理工作。 finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。

9.Serializable 和Parcelable 的区别
原文地址:http://www.jianshu.com/p/a60b609ec7e7
  为什么要了解序列化:进行Android开发的时候,无法将对象的引用传给Activities或者Fragments,我们需要将这些对象放到一个Intent或者Bundle里面,然后再传递。
  什么是序列化:表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。
  怎么通过序列化传输对象?
  Android中Intent如果要传递类对象,可以通过两种方式实现。
   方式一:Serializable,要传递的类实现Serializable接口传递对象,
   方式二:Parcelable,要传递的类实现Parcelable接口传递对象。
 Serializable(Java自带): Serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。
 Parcelable(android 专用): 除了Serializable之外,使用Parcelable也可以实现相同的效果,
不过不同于将对象进行序列化,Parcelable方式的实现原理是将一个完整的对象进行分解, 而分解后的每一部分都是Intent所支持的数据类型,这样也就实现传递对象的功能了。
  实现Parcelable的作用
   1)永久性保存对象,保存对象的字节序列到本地文件中;
   2)通过序列化对象在网络中传递对象;
   3)通过序列化在进程间传递对象。
  选择序列化方法的原则
  1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable。
  2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
  3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable 。

10.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章