父类的静态方法能否被子类重写,为什么?
- 静态方法只与类相关,不与具体实现相关;
- static方法在编译时期就绑定了,所有引用到该方法的对象所指向的都是同一块内存中的数据,也就是该静态方法;
- 父类的静态方法不能被子类继承,更谈不上重写。
接口回调实现过程:
- 定义一个回调函数,给事件发送方传入接口,在需要的地方调用未实现方法;在事件接收方实例化接口并处理结果;
- 在事件发生时,会通知回调函数进行处理。
泛型原理:
- Java的泛型是伪泛型;
- 使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉,这个过程叫做类型擦除;
- 泛型只在编译期有效,所以泛型类与普通类在Java虚拟机内没有任何区别。
反射中,Class.forName
和classloader
的区别:
Class.forName()
前者除了将类的.class
文件加载到jvm中之外,还会对类进行解释,执行类中的static块;classLoader
只干一件事情,就是将.class
文件加载到JVM中,不会执行static中的内容。
throw和throws的比较
- throws出现在方法声明上,表示出现异常的一种可能性,并不一定发生异常,用throws声明的方法表示此方法不处理异常,由系统自动捕获的异常信息抛给上级调用方法,主方法抛出的异常,由JVM处理;
- throw出现在方法体内,执行throw则一定抛出了某种异常,用户自己进行异常类对象的实例化操作,,手动抛出异常。
为什么Java被称作是“平台无关的编程语言”?
- Java虚拟机有自己完善的硬体架构,如:处理器、堆栈、寄存器等,还具有相应的指令系统;JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需要生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改的运行。
JDK和JRE的区别是什么?
- JRE(Java Runtime Environment缩写,指Java运行环境)包括java虚拟机和applet;
- JDK(Java Development Kit的缩写,指Java开发工具包)包括JRE和编译器等;可以开发、编译执行Java程序。
为什么内部类调用的外部变量必须是final修饰的?
- 方法中的局部变量,方法结束后这个变量就要释放掉,然而内部类的某个方法还没有释放完,这个时候它所引用的外部变量已经找不到了;
- 如果定义为final,Java会将这个变量复制一份作为成员变量内置于内部类中;
- 为了解决:局部变量的生命周期与局部类的对象的声明周期的不一致性问题。
迭代器可以在迭代的过程中删除底层集合的元素,但是不可以调用集合的remove(Object obj)
删除,可以通过迭代器的remove()
方法删除
- Array可以包含基本类型和对象类型;
- ArrayList只能包含对象类型,如果要存基本数据类型,也要用它们的包装类才能通过。