本文是Android面试题整理中的一篇,结合右下角目录食用更佳,包括:
- Java设计思想
- 抽象类和接口
- 类和方法
- 内部类
- 错误和异常
- 关键字和运算符
- 基本类型和常用类
- 编码
- 其他未分类等
-
Java设计思路
-
0. OOP是什么
-
1. JDK和JRE
-
2. 面向对象的特征有哪些
面向对象的特征有:抽象、封装、继承、多态
-
3. java是值传递还是引用传递
-
抽象类和接口
- 0. 接口的意义
-
1. 抽象类的意义
-
2. 抽象类和接口有什么不同
- 3. 接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?
-
4. Java标识符命名规范
-
0. 规范(强制)
-
1. 推荐的命名方式(非强制)
-
类和方法
-
0. 一个".java"源文件中是否可以包含多个类(不是内部类)?有什么限制?
-
1. 构造器(constructor)是否可被重写(override)
-
2. 静态变量和成员变量的区别
-
3. Object 中定义了哪些方法
-
4. Cloneable 实现原理
-
5. 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
-
6. 如何实现对象的克隆
-
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class MyUtil { private MyUtil() { throw new AssertionError(); } @SuppressWarnings("unchecked") public static <T extends Serializable> T clone(T obj) throws Exception { ByteArrayOutputStream bout = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bout); oos.writeObject(obj); ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bin); return (T) ois.readObject(); // 说明:调用ByteArrayInputStream或ByteArrayOutputStream对象的close方法没有任何意义 // 这两个基于内存的流只要垃圾回收器清理对象就能够释放资源,这一点不同于对外部资源(如文件流)的释放 } }
7. 谈一谈”==“与”equals()"的区别
-
8. 类中方法调用顺序
- 指出下面程序的运行结果
class A { static { System.out.print("1"); } public A() { System.out.print("2"); } } class B extends A{ static { System.out.print("a"); } public B() { System.out.print("b"); } } public class Hello { public static void main(String[] args) { A ab = new B(); ab = new B(); } }
执行结果:1a2b2b。 创建对象时构造器的调用顺序是: 父类静态初始化块 -> 子类静态初始化块 -> 父类初始化块 ->调用了父类构造器 -> 子类初始化块 -> 调用子类的构造器
-
9. 重载(Overload)和重写(Override)的区别
- 重写(Override)和重载(Overload)其实并无联系,可能是因为名称相似,容易引起混淆 > 重写发生在运行时,重载发生在编译期
-
重写(Override)
重写是针对父类和子类来说的,是在子类中重写父类的方法。
- 要求方法名,参数个数和类型必须相同
- 返回的数据类型必须与父类相同或者是其子类
- 访问修饰符的限制一定要大于父类中该方法的访问修饰符(public>protected>default>private)
- 重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常
-
重载(Overload)
-
重载是针对一个类说的,是Java中多态性的一种表现
- 要求方法名相同
- 必须有不同的参数列表
- 可以有不同的返回类型
- 可以有不同的修饰符
10. 阐述静态变量和实例变量的区别。
- 静态变量(static 修饰的变量)属于类,被所有类的实例共享,没有实例时也可通过类直接访问
- 实例变量:必须通过实例来访问
11. 是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?
不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,在调用静态方法时可能对象并没有被初始化
12. 抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰?
- 抽象方法不能是静态的:静态方法不能被子类重写,抽象方法必须被子类重写,冲突;
- 抽象方法不能是native的:本地方法是由本地代码(如C代码)实现的方法,而抽象方法是没有实现的,也是矛盾的
- 抽象方法不能用sychronized:synchronized和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的
13. Super与this表示什么
Super表示当前类的父类对象;This表示当前类的对象
14. hashcode()和equals()的关系
- equals 相等,hashcode一定相等
- hashcode相等,equals不一定相等
内部类
1. 内部类的作用
- 内部类可以很好的实现隐藏
- 内部类拥有外围类的所有元素的访问权限
- 可以间接实现多重继承
- 可以避免修改接口而实现同一个类中两种同名方法的调用