Java的特点
可从面向对象、平台无关性、安全性、多线程、网络编程方面解答
jvm
可引申出字节码文件,Java文件的编译与解释过程,阐述jvm的作用,一次编译到处运行
jdk和jre
包含关系、是否包含开发工具等入手
运行jsp为什么需要jdk
Oracle JDK和Open JDK对比
商业化角度、安全性、性能、稳定性等方面
java为什么编译与解释并存
可从java文件编译成字节码文件入手,以及jvm是操作字节码文件的,可延伸拓展jit编译器
字符常量和字符串常量
表示形式、字符串的底层、ASCII表、是否可以参与运算等入手
标识符和关键字
两者关系,包含?特殊标识?
java泛型的理解
编译时的安全监测、延伸出类型擦除,怎么绕过泛型往集合添加文件(反射)
==和equals
基本数据类型比较的是什么
引用数据类型比较的是什么,特殊如String又比较的是什么
equals底层调用了==
延伸:重写为什么重写equals要重写hashCode方法
基本数据类型的占用字节数,类型默认值是什么,对应的包装类又是什么
装箱与拆箱是什么
包装类的常量池的范围[-128,127],特殊如Character范围[0,127],注意float和double并没有常量池
做题时注意java基本类型的值传递机制
总结:一个方法不能修改基本数据类型的参数、可以改变对象的内部属性、不能让对象参数引用一个新的对象
重载和重写的区别
从方法修饰符、返回类型、方法名、参数的个数、顺序、类型、返回异常的范围等方面解答
深拷贝和浅拷贝
引用的是否是同一个对象,如何实现深拷贝,序列化、迭代拷贝等方面入手
面向对象和面向过程
性能、可维护性、复用性、耦合性等方面解答
构造器不能被重写,但是可以被重载
子类构造器为什么要添加super()
父类只定义有参构造器时,子类不加super()的话调用子类构造器时会发生编译错误
成员变量和局部变量的区别
生命周期、是否可以被static修饰、是否需要显式地赋值才能使用
对象实体与对象引用的区别
创建对象的几种方式
new、反射、序列化反序列化、克隆
构造方法的特性
名称、返回值、默认构造方法等解答
面向对象的三大特征解释
- 封装:隐藏属性,提供外部访问方法
- 继承:子类拥有父类的全部属性,但私有属性无法使用,重写父类的方法
- 多态:方法具有多态性、属性没有,运行时确定方法的调用版本,子类没有重写方法调用的则是父类的方法
为什么静态方法不能调用非静态成员
静态方法内部为什么不能使用this关键字
栈帧的形成入手,局部变量表中index=0位置存放的是什么
接口和抽象类的区别
- 接口方法默认public,抽象方法可以有public、protected和default修饰
- 所有方法在接口中不能有实现(JDK8开始接口方法可以有默认实现),抽象类可以有非抽象的方法
- 接口除了static、final变量,不能有其他变量,抽象类可以
- 一个类可以实现多个接口,但只能继承一个抽象类,接口本身可通过extends拓展多个接口
- 接口是对行为的扩展,而抽象则是对一类事务的规范,例如child可以实现eat、sleep接口,但是不能又继承Man类又继承Woman类
字符串操作类
String、StringBuffer、StringBuilder
引用修改,对象本身修改,线程安全,性能效率等方面,字符串常量拼接操作的底层实现入手
Object类的方法总结
getClass
hashCode
equals
clone
toString
notify
notifyAll
wait
finalize
transient关键字的作用:组织变量序列化
异常类
分类
Error:StackOverFlowError、OutOfMemoryError
Exceptions:
CheckExceptions:IOException、SQLException、ClassNotFoundException
UnCheckException:ArithmeticException、NullPointerException、IndexOutOfBoundsException
常用方法
getMessage:简要信息
toString:详细信息
getLocalizedMessage:本地化信息
printStackTrace:Throwable对象封装的异常信息
finally不会执行的几种情况
程序发生异常前退出(System.exit(int)),线程死亡,关闭CPU
线程状态
新生、运行、阻塞、等待、超时等待、死亡
join会使原线程进入阻塞状态;yield则是让源县城进入就绪状态,重新竞争CPU
有了字节流为什么还有字符流
字节流转换为字符流非常耗时间,而且不知道编码类型的话很容易出现乱码,所以干脆提供字符流直接操作字符
BIO、NIO、AIO
BIO:Blocking I/O,同步阻塞IO模式,数据的读写必须阻塞在一个线程内等待其完成
NIO:Non-blocking IO,或者New IO,同步非阻塞的IO模型
AIO:Asynchronous IO,NIO2,异步非阻塞的IO模型,并不常用
总结:低负载、低并发的应用程序使用BIO就可以了,高负载、高并发的应用需要使用NIO提升性能