最近又到了“金三银四”的求职高峰期,而2019对于求职者注定是不平凡的一年,一开年,滴滴宣布裁员15%员工,涉及到2000人左右,京东宣布2019年将末位淘汰10%的副总裁级别以上的高管......等等,这些都是我们看得到的,还有很多我们看不到的,苦苦支撑的,总之,我们还是要深刻的认识到,2019,我们不一样~~
无论环境如何,我们沉下心来沉淀自己,好好学习总归不是一件坏事,而这篇文档,就从安卓面试之java基础开始说起吧,算是给自己学习的一个记录,也希望可以帮到更多的人。
文章里面的面试题大多借鉴于github:Android-Interview,感谢这位作者的分享,也希望有兴趣的小伙伴们可以多多补充。在下面的总结中,我尽量用简便的语言描述一答案,细节上的东西大家可以自行去查一查,真正的理解还是需要很多的知识的摄入为支撑的。
最后,以下难免会有片面和不是特别准确的地方,希望大家可以多多提意见,我也会第一时间修正,最后,希望大家共同成长,冲破所谓的困难。
1. 什么是面向对象(OOP)?
面向对象编程是使用类、对象、继承、多态、封装和抽象的一种程序设计方法
这点,只要是学过java的童鞋,基本上都是最清楚的,在面试的过程中如果不是实习生,被问到的概率不是很大,具体可以参考:什么是面向对象(OOP)
2. 什么是多态?实现多态的机制是什么?
多态即:事物在运行过程中存在不同的状态。多态可以分为编译时多态和运行时多态,编译时多态是指方法的重载,运行时多态是指方法的重写。
对于运行时多态需要满足以下三个条件:
1. 要有继承关系
2. 子类重写父类方法
3. 父类对象的引用指向子类对象(SuperClass class = new ChildClass() )
那么多态实现的机制是什么呢?
其实就是依靠静态分派和动态分派。
静态分派即在编译期间就能完全确定,在类加载的解析阶段就会把所涉及的符号引用转化为可确定的直接引用,不会延迟到运行期再去完成,典型的例子就是方法重载。
动态分派是指在运行期间才能确定变量的实际类型,典型的例子就是方法的重写。只有在运行期间,根据对实例化子类的不同,调用不同子类中重写的方法。
3. 接口(Interface)与抽象类(Abstract Class)的区别?
接口的方法不可实现(最新的JDK有一些变化),接口的类型是public,一个类可以实现多个接口,实现接口的类必须要实现接口中所有的方法,
抽象类是一个类,可以包含具体方法和抽象方法,抽象方法不做任何的实现,继承抽象类的子类如果是具体类(也就是不含abstract)需要实现父类定义的抽象方法,
4. 重写(Override)与重载(Overload)的区别?
重写是@Override,是对父类方法的重新实现(返回值、方法名、参数一致,方法内容重写,final和abstract除外)
public class Father{ public void say(){ System.out.println("I am a Man!"); } public void eat(String food){ System.out.println("I can eat!" + food); } } public class Son extends Father{ @Override public void say() { System.out.println("I am a Boy"); } @Override public void eat(String food) { super.eat(food); } }
重载是同一个方法名可以通过传递不同的参数类型和参数个数多次使用,例如:
public void setData(String name){ ... } public void setData(String name, int age){ ... } public void setData(String name, int age, boolean isStudent){ ... }
5. 父类的静态方法能否被子类重写?
父类的静态方法不会被子类重写,所谓的重写,实际上是为两个静态方法各自分配了不同的空间,并且静态方法上面如果注解@Override编辑器回报错误的提示。
6. 静态属性和静态方法是否可以被继承?是否可以被重写?为什么?
同上,可以被继承,不会被重写
7. 什么是内部类?内部类、静态内部类、局部内部类和匿名内部类的区别及作用?
7.1. 内部类定义
在一个类的内部定义另一个类。
//A为外部类
public class A{
...
//B为A的内部类
class B{
...
}
}
7.2.内部类特点
- 可以访问其作用域的数据,包括私有的数据;
- 内部类可以对外隐藏,可以加private、protected修饰,而外部类不可以;
- 可以实现多重继承;
- 回调函数;
7.3.内部类优点
多重继承性 - 外部类可以继承一个父类,并且继承内部类
7.4.局部内部类
在方法中定义的内部类成为局部内部类
内部类只能在定义类的方法中实例化,不可在此方法外对其实例化
局部内部类对象不能使用该内部类所在的方法的非final的局部变量
public class A{
//A中的方法test()
void test(){
//局部内部类
class B{
}
}
}
7.5.静态内部类
- 要创建嵌套类的对象,并不需要其外围类的对象。
- 不能从嵌套类的对象中访问非静态的外围类对象。
public class A{
//局部内部类
static class B{
}
}
A.B a = new A.B();
8. == 和 equals() 和 hashCode() 的区别?
- "=="针对基本数据类型,比较的是数据的值,针对对象,比较的是对象的地址,所以不同地址的对象都是false,而基本数据类型和其装箱类型进行比较时,其装箱类型会自动拆箱,使用值的形式进行比较,所以有可能是true,例如:int a = 12,Integer aa = 12;则aa == a是True;
- "equals()"是Object类实现的方法,最底层也是使用的“==”的方式进行比较,但是子类可以复写该方法,部分子类的复写就实现了将对象的值进行比较,例如Integer、String(复写后是比较字符串的值)
- "hashCode()"是将对象在内存中的地址转换成一个int值,所以没有重写hashCode()方法,任何对象的HashCode()都是不相等的
9. Integer 和 int 之间的区别?
- int是基本数据类型,而Integer是一个类,可以进行实例化出来一个对象,并由自己的基本方法和属性
- Integer是int的装箱形式,
10. String 转换成 Integer 的方式及原理?
- String转换成Integer的方式:Integer.parseInt(string);
- 判断字符的长度是否符合标准,然后根据ASII码判断第一个字符是否是加号或者减号,然后循环遍历字符串,使用Character.digit(s, radix)计算数值,然后根据位置乘以基数相加得到最终的int。