Hello,小伙伴们,最近秋招提前批开始啦,我也是准备和大家一起进入到实习的大军!我选择的岗位是Android开发,是我大学以来一起想从事的岗位,现在,终于可以如愿以偿了,但是呢,大家都知道,面试官会考察很多的基础知识,所以在这里跟大家分享一些我自己的复习总结。
怎么拿下Android开发面试题(一)
第一章 Java方面
第一节 Java 基础部分
1.1 抽象类与接口的区别?
大体区别如下:
抽象类可以提供成员方法的实现细节,而接口中只能存
在 public 抽象方法;
抽象类中的成员变量可以是各种类型的,而接口中的成
员变量只能是 public static final 类型的;
接口中不能含有构造器、静态代码块以及静态方法,而抽
象类可以有构造器、静态代码块和静态方法;
一个类只能继承一个抽象类,而一个类却可以实现多个
接口;
抽象类访问速度比接口速度要快,因为接口需要时间去
寻找在类中具体实现的方法;
如果你往抽象类中添加新的方法,你可以给它提供默认
的实现。因此你不需要改变你现在的代码。如果你往接
口中添加方法,那么你必须改变实现该接口的类。
接口更多的为了约束类的行为,可用于解耦,而抽象类
更加侧重于代码复用。
1.2 分别讲讲 final,static,synchronized
关键字可以修饰什么,以及修饰后的作用?
static
1.static 方法
static 方法一般称作静态方法,由于静态方法不依赖于任
何对象就可以进行访问,因此对于静态方法来说,是没有
this 的,因为它不依附于任何对象,既然都没有对象,就
谈不上 this了。
public class StaticTest
{
public static void a(){
}
public static voidmain(String[]args){
StaticTest.a();
}
2.static 变量
static 变量也称作静态变量,静态变量和非静态变量的区
别是:静态变量被所有的对象所共享,在内存中只有一个
副本,它当且仅当在类初次加载时会被初始化。而非静态
变量是对象所拥有的,在创建对象的时候被初始化,存在
多个副本,各个对象拥有的副本互不影响。
3.static 代码块
static 关键字还有一个比较关键的作用就是 用来形成静态
代码块以优化程序性能。static 块可以置于类中的任何地方,类
中可以有多个 static 块。在类初次被加载的时候, 会按照
static块的顺序来执行每个 static块,并且只会执行一次。
public class StaticTest
{
private static int a ;
private static int b;
static {
a = 1;
b = 2;
}
final
4.final 变量
凡是对成员变量或者本地变量(在方法中的或者代码块中
的变量称为本地变量)声明为 final的都叫作 final变量。
final 变量经常和 static 关键字一起使用,作为常量。
private final int aa = 1;
static {
a = 1;
b = 2;
}
private void init(){
aa = 2;//报错编译器会提示 不能赋值。。
}
5.final 方法
final也可以声明方法。方法前面加上 final 关键字,代表这
个方法不可以被子类的方法重写。如果你认为一个方法的
功能已经足够完整了,子类中不需要改变的话,你可以声明
此方法为 final。final 方法比非 final 方法要快,因为在编
译的时候已经静态绑定了,不需要在运行时再动态绑定。
public static void main(String[]args){
StaticTest.a();
}
class StaticTest2 extends StaticTest{
public final void a(){
//这边就会编译器提示不能重写
}
6.final 类
其实更上面同个道理,使用 final 来修饰的类叫作 final
类。final 类通常功能是完整的,它们不能被继承。Java 中
有许多类是 final 的,譬如 String,Interger 以及其他包装类。
synchronized
synchronized 是 Java 中解决并发问题的一种最常用的方 法,也是最简单的一种方法。synchronized 的作用主要有三个:
- 确保线程互斥的访问同步代码
- 保证共享变量的修改能够及时可见
- 有效解决重排序问题。
7.synchronized 方法
有效避免了类成员变量的访问冲突:
private synchronized void init(){
aa = 2;
}
8.synchronized 代码块
这时锁就是对象,谁拿到这个锁谁就可以运行它所控制的那
段代码。当有一个明确的对象作为锁时,就可以这样写程序,
但当没有明确的对象作为锁,只是想让一段代码同步时,可
以创建一个特殊的 instance 变量(它得是一个对象)来充当
锁。
public final voida(){
synchronized(lock){
//代码
}
}
@Override
public void run() {