《Android秘籍.第四卷》

《Android秘籍.第四卷》

目录

《Android秘籍.第四卷》

《JAVA基础篇》

Android程序和java程序的区别?

JAVA 中堆和栈的区别,说下java 的内存机制

JAVA 垃圾回收机制

面向对象编程的四大特性及其含义?

String、StringBuffer、StringBuilder、CharSequence的区别

String str = "a"和String str = new String("a")的的关系和异同?

Object的equal()和==的区别?

装箱、拆箱什么含义?

int和Integer的区别?

遇见过哪些运行时异常?异常处理机制知道哪些?

什么是反射,有什么作用和应用?

static 静态修饰符

什么是内部类?有什么作用?静态内部类和非静态内部类的区别?

final、finally、finalize()分别表示什么含义?

重写和重载的区别?

抽象类和接口的异同?

为什么匿名内部类中使用局部变量要用final修饰?

Object有哪些公用方法?


《JAVA基础篇》

Android程序和java程序的区别?

  • 执行入口:main(java),AndroidManifest.xml配置文件中的intent-fifter(android);
  • UI:Frame(java),Activity(android);
  • 是否基于配置文件:否(java),是(android);
  • 是否基于组件:否(java),是(android)Activity,Service,Broadcast Receiver,Content Provider;

JAVA 中堆和栈的区别,说下java 的内存机制

  • 基本数据类型比变量和对象的引用都是在栈分配的
  • 堆内存用来存放由new创建的对象和数组
  • 类变量(static修饰的变量),程序在一加载的时候就在堆中为类变量分配内存,堆中的内存地址存放在栈中
  • 实例变量:当你使用java关键字new的时候,系统在堆中开辟并不一定是连续的空间分配给变量,是根据零散的堆内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的"物理位置”,实例变量的生命周期--当实例变量的引用丢失后,将被GC(垃圾回收器)列入可回收“名单”中,但并不是马上就释放堆中内存
  • 局部变量: 由声明在某方法,或某代码段里(比如for循环),执行到它的时候在栈中开辟内存,当局部变量一但脱离作用域,内存立即释放

JAVA 垃圾回收机制

什么是垃圾回收机:释放那些不再持有引用的对象的内存

怎么判断一个对象是否需要收集?

  • 引用计数(最简单古老的方法):指将资源(可以是对象、内存或磁盘空间等等)的被引用次数保存起来,当被引用次数变为零时就将其释放的过程
  • 对象引用遍历(现在大多数 jvm 使用的方法):对象引用遍历从一组对象开始,沿着整个对象图上的每条链接,递归确定可到达(reachable)的对象。如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集

几种垃圾回收机制 

  • 标记回收法:遍历对象图并且记录可到达的对象,以便删除不可到达的对象,一般使用单线程工作并且可能产生内存碎片
  • 标记-压缩回收法:前期与第一种方法相同,只是多了一步,将所有的存活对象压缩到内存的一端,这样内存碎片就可以合成一大块可再利用的内存区域,提高了内存利用率
  • 复制回收法:把现有内存空间分成两部分,gc运行时,它把可到达对象复制到另一半空间,再清空正在使用的空间的全部对象。这种方法适用于短生存期的对象,持续复制长生存期的对象则导致效率降低。 
  • 分代回收发:把内存空间分为两个或者多个域,如年轻代和老年代,年轻代的特点是对象会很快被回收,因此在年轻代使用效率比较高的算法。当一个对象经过几次回收后依然存活,对象就会被放入称为老年的内存空间,老年代则采取标记-压缩算法

 

面向对象编程的四大特性及其含义?

  • 封装: 封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。在面向对象的编程语言中,对象是封装的最基本单位。
  • 抽象: 抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。
  • 继承: 在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。
  • 多态: 多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。多态性增强了软件的灵活性和扩展性。

String、StringBuffer、StringBuilder、CharSequence的区别

  • String类:是常量,不可变.(操作少量的数据使用)
  • StringBuffer和StringBuilder底层是 char[]数组实现的(单线程操作大量数据使用 StringBuilder,多线程操作大量数据使用 StringBuffer。)
  • StringBuffer是线程安全的,而StringBuilder是线程不安全的
  • CharSequence是一个java接口,代表一个char序列,String、StringBuilder、StringBuffer都实现了该接口,CharSequence实例通过调用toString方法可转化为String对象。


String str = "a"和String str = new String("a")的的关系和异同?

  • String str = "a"; 这个只是一个引用,内存中如果有“a"的话,str就指向它;如果没有,才创建它;
  •   如果你以后还用到"a"这个字符串的话并且是这样用: String str1 = "a"; String str2 = "a"; String str2 = "a"; 这4个变量都共享一个字符串"a"。
  •   而String str = new String("a");是根据"a"这个String对象再次构造一个String对象,将新构造出来的String对象的引用赋给str。


Object的equal()和==的区别?

  •  “==”比较的是2个对象的地址,而equals比较的是2个对象的内容。


装箱、拆箱什么含义?

装箱是值类型转成object引用类型,拆箱是已被装箱的引用类型转成原来的值类型。这使得值类型可以存储于垃圾回收堆中。


int和Integer的区别?

1、Integer是int的包装类,int则是java的一种基本数据类型 
2、Integer变量必须实例化后才能使用,而int变量不需要 
3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值 
4、Integer的默认值是null,int的默认值是0


遇见过哪些运行时异常?异常处理机制知道哪些?

  • Exception是指在程序运行过程中所出现的不可预测的可处理可恢复的问题,这些错误会干扰到指令的正常执行,从而造成程序的异常退出或者意外终止。比如:FileNotFountException、NullPointException.
  • Error是指程序运行过程中较为严重的不可挽回的问题,大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。比如OutOfMemeryError,一旦出现错误程序就要挂。
  • 编译时错误(比如:ClassNotFoundException)
  • 从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常
  • 运行时错误(这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。)
  • java.lang.ArrayIndexOutOfBoundsException
  • 数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。
  • java.lang.ArithmeticException
  • 算术条件异常。譬如:整数除零等。
  • java.lang.NullPointerException
  • 空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等
  • java.lang.ClassNotFoundException
  • 找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。
  • java.lang.NegativeArraySizeException 数组长度为负异常
  • java.lang.ArrayStoreException 数组中包含不兼容的值抛出的异常
  • java.lang.SecurityException 安全性异常
  • java.lang.IllegalArgumentException 非法参数异常
  • 异常处理机制(在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常)

什么是反射,有什么作用和应用?

  • Reflection(反射) 是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变。通俗的讲就是反射可以在运行时根据指定的类名获得类的信息。
  • 反射机制就是增加了程序的灵活性,避免将程序写死在代码里。

 

static 静态修饰符

  • 在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的。
  • static修饰表示静态的,在类加载时JVM会把它放到方法区,被本类以及本类中所有实例所公用。在编译后所分配的内存会在一直存在,直到程序退出内存才会释放这个空间。如果一个被所有实例公用的方法被申明为static,那么就可以节省空间了,不用每个实例初始化的时候都被分配到内存。


什么是内部类?有什么作用?静态内部类和非静态内部类的区别?

  在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。

  • 内部类可以很好的实现隐藏
  • 内部类拥有外围类的所有元素的访问权限
  • 可是实现多重继承
  • 可以避免修改接口而实现同一个类中两种同名方法的调用。

静态内部类与非静态内部类的区别:

  • 是否能拥有静态成员
  • 静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性)。
  • 访问外部类的成员
  • 静态内部类只能够访问外部类的静态成员,而非静态内部类则可以访问外部类的所有成员(方法,属性)。
  • 静态内部类和非静态内部类在创建时有区别 (假设类A有静态内部类B和非静态内部类C,创建B和C的区别为: A a=new A(); A.B b=new A.B(); A.C c=a.new C();)


final、finally、finalize()分别表示什么含义?

  • final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承。
  • finally是异常处理语句结构的一部分(它只能用在try/catch语句中),表示总是执行。
  • finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等。


重写和重载的区别?

  • 方法重写(overriding):存在子父类之间的,子类定义的方法与父类中的方法具有相同的方法名字,相同的参数表和相同的返回类型 
  • 方法重载(overloading):是指同一个类中的多个方法具有相同的名字,但这些方法具有不同的参数列表,即参数的数量或参数类型不能完全相同;

 


抽象类和接口的异同?

  • 抽象类:是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。
  • 接口:是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情。

相同点

  • 都不能被直接实例化,都可以通过继承实现其抽象方法
  • 都是面向抽象编程的技术基础,实现了诸多的设计模式。

不同点

  • 接口支持多继承;抽象类不能实现多继承
  • 接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。
  • 接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。
  • 接口可以用于支持回调;抽象类不能实现回调,因为继承不支持。
  • 接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法。
  • 接口可以作用于值类型引用类型;抽象类只能作用于引用类型

 


为什么匿名内部类中使用局部变量要用final修饰?

  • java内部类访问局部变量时局部变量必须声明为final
  • 为了解决生命周期不同的问题,匿名内部类备份了变量,为了解决备份变量引出的问题,外部变量要被定义成final匿名内部类使用final不是怕修改,是怕不能同步修改


Object有哪些公用方法?

首先需要知道的是Object是所有类的父类,任何类都默认继承Object。

  • clone:保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常
  • equals:在Object中与==是一样的,子类一般需要重写该方法
  • hashCode:该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到
  • getClass:  final方法,获得运行时类型
  • wait:使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。
  • 调用该方法后当前线程进入睡眠状态,直到以下事件发生:
  • 1. 其他线程调用了该对象的notify方法
  • 2. 其他线程调用了该对象的notifyAll方法
  • 3. 其他线程调用了interrupt中断该线程
  • 4. 时间间隔到了
  • 此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常
  • notify:唤醒在该对象上等待的某个线程
  • notifyAll:唤醒在该对象上等待的所有线程
  • toString:转换成字符串,一般子类都有重写,否则打印句柄

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值