1、什么是面向对象
面向对象(Object Oriented Programming)是一种思想,世间万物都可以看成一个对象。Java是一个支持并发、基于类和面向对象的计算机编程语言。
特点:模块化开发易维护,复用性强,代码可靠灵活,可读性高
四大特征:
封装:隐藏内部特性和行为,提供对外访问接口
private 私有,只有本类可以访问
default 默认,同包 protected 同包或者不同包的子类 public 所有都可以访问
继承:给对象提供从基类获取字段和方法的能力,重写
多态:不同底层实现相同接口展示的能力
抽象:把一类功能类似的类抽象出来一个抽象类,用作继承的基类
2、面向对象和面向过程的区别
面向过程优点性能相对较高,系统开销大耗资源。缺点不易维护复用和拓展。
面向对象优点易维护,易复用和拓展,可以设计低耦合系统灵活已维护。缺点性能较低。
3、重写重载区别
重写方法名、参数、返回值类型相同;基于父类与子类之间的;子类不能缩小父类访问权限、不能抛比父类大的异常;
final修饰的方法不能重写;重载存在于父类和子类、同类中;参数不同、返回值类型相同;
4、JDK、JRE、JVM区别
JDK是java开发工具包,包括JRE和编译、运行等开发工具;
JRE是Java运行环境,包括jvm和丰富的类库
JVM是虚拟机,提供字节码文件.class文件运行环境的支持。
5、Jdk8新特性
Lambda 表达式
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。https://blog.csdn.net/qq_36154832/article/details/103575601
Stream
Stream 是Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。https://blog.csdn.net/qq_36154832/article/details/103582459
接口添加默认方法
Java 8中允许接口中包含具有具体实现的方法,该方法称为“默认方法”,默认方法使用 default 关键字修饰。https://blog.csdn.net/qq_36154832/article/details/103615702
方法引用
当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用。https://blog.csdn.net/qq_36154832/article/details/103580430
新的时间API
Optional类
6、什么是字节码,使用字节码好处是什么
字节码通常指的是已经经过编译,但与特定机器码无关,需要直译器转译后才能成为机器码的中间代码。字节码是直接面向虚拟机的解释的代码,每一个平台解释器是不同的,但是实现的虚拟机是相同的。
在一定程度上解决了传统解释型语言效率低的问题,有保留了解释型语言可移植的特点。
使JVM成为一个跨语言的平台,虚拟机不关心字节码是由什么编写的,任何语言只要能编译成字节码文件都可以在虚拟机上运行,比如Scala、Jython、JRuby。Java平台多语言混合编程成为主流,通过特定领域的语言去解决特定问题。
7、Java中基本数据类型、引用数据类型
基本数据类型
数值byte、short、int 、long 占用字节数分别是 1、2、4、8
字符型char 2
浮点型float、double 4、8
布尔型boolean 1
引用数据类型在栈中只存储一个地址,地址指向堆中。
类、接口、数组、
值传递和引用传递
基本数据类型的“=”是值传递,传递的是该变量的副本,修改不会改变原变量
引用传递是对应引用类型的数据来说,传递的是引用地址,修改变量会改变变量本身(String除外)
8、SrtringBuffer和StringBuilder、String的区别
SrtringBuffer和StringBuilder、String都是用来存储字符串的类型
String是字符串,不可改变。
SrtringBuffer和StringBuilder是可以改变的,SrtringBuffer是线程安全的,使用Synchronized,StringBuilder效率更高一点。
https://blog.csdn.net/qq_36154832/article/details/118674500
9、什么是自动拆装箱
基本数据类型和引用类型直接的转换,JDK5以后引入的自动拆装箱机制,目的就是简化代码。
Integer total = 99; //执行上面那句代码的时候,系统为我们执行了: Integer total = Integer.valueOf(99); int totalprim = total; //执行上面那句代码的时候,系统为我们执行了: int totalprim = total.intValue();
10、int和Integer区别
int基本数据类型 Integer是包装类
JDK5引入一种新特性来节省内存开销。整型对象在内部实现中通过相同的引用来实现缓存和重用(范围-127~128)仅在自动装箱时有用,构造器不适用。
包装对象的数值比较,不能简单的使用==,虽然-128到127之间的数字可以,但是这个范围之外还是需要使用equals比较。
前面提到,有些场景会进行自动拆装箱,同时也说过,由于自动拆箱,如果包装类对象为null,那么自动拆箱时就有可能抛出NPE。
如果一个for循环中有大量拆装箱操作,会浪费很多资源。
11、==与 equals 区别
基本数据类型都是比较相等性的,引用类型判断对象是否是同一个
12、hashCode()和equals(a)方法
https://blog.csdn.net/qq_36154832/article/details/118676338
有没有可能2个不相等的对象有相同的hashCode
有可能,这个叫做哈希碰撞。
总结
equals不相等,hashcode可能相等,这个叫做hash碰撞
equals相等,必须重写hashcode方法,保证hashcode方法相等
13、final修饰符关键字,修饰类表明不能派生新的子类,修饰方法表明这个方法不能被重写,修饰变量表示该表明必须初始化,并且不能被修改
finally在异常处理时提供finally来执行清除操作,比如关闭流
finally不会执行的四种情况: finally出现异常; 使用System.exit()退出程序; 程序所在线程死亡; 关闭CPU
finalize是方法名,java允许使用finalize()方法在垃圾收集器将对象重内存中清除之前进行必要的清理操作。finalize方法是Object方法,子类通过重写来实现清理系统资源和其他操作。
String可以被继承吗,不可,final修饰的。
14、抽象类和接口区别
简单的来说,抽象是对类的抽象,是一种模板设计,接口是一种行为的抽象,是一种行为规范。
15、类实例化顺序
父类静态变量
父类静态代码块
子类静态变量
子类静态代码块
父类非静态变量(成员变量)
父类构造函数
子类非静态变量(成员变量)
子类构造函数
16、什么是内部类
简单的说就是在一个类、接口或者方法内部创建一个类。
内部类提供了更好的封装,除了外围类,其他的类都不能访问。
Java内部类总结
https://www.cnblogs.com/happyone/p/11306419.html
17、什么是IO
I/O即输入/输出(Input/Output),java IO相关类在java.io包下
18、序列化
https://blog.csdn.net/qq_36154832/article/details/95636063
如果一个字段不想被序列化可以使用transient关键字来修饰
19、如何实现对象克隆
一般来说有两种方式:
1、使用cloneable接口,并重写Object类中的clone()方法,可以实现浅克隆
2、实现Serializable即可,并通过序列化和反序列化实现克隆,可以实现深克隆
实际应用中克隆用的比较少,项目中最多使用属性克隆 BeanUtils工具类.
20、error和exception区别
Java异常体系
Exception和Error都是继承了Throwable类,在java中只有Throwable类型的实例才可以被抛出(throw)或者捕获(catch),他是异常处理机制的基本组成类型。
Exception和Error体现了java平台设计者对不同异常情况的分类,Exception是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应的处理。
Error是指正常情况下,不大可能出现的情况,绝大部分的Error都会导致程序(比如JVM自身)处于非正常状态,不可恢复状态。既然是非正常情况,所以不便于也不需要捕获,常见的比如OutOfMemoryError之类,都是Error的子类。
Exception又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常在源码里必须显示的进行捕获处理,这里是编译期检查的一部分。前面我们介绍的不可查的Error,是Throwable不是Exception。
不检查异常就是所谓的运行时异常,类似NullPointerException,ArrayIndexOutOfBoundsExceptin之类,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译器强制要求。
finally代码模块通常用于释放资源,如IO缓冲区,数据库连接等等。
异常被处理后对象会被GC回收
21、反射的用途和实现
java反射机制主要提供以下功能
在运行时构造一个类
判断一个类所具有的成员变量和方法
调用一个方法
生成动态代理
应用很多,例如Spring框架的IOC基于反射创建对象和设置一样属性
SpringMVC的请求调用对应的方法也是通过反射
jdbc的Class#forName(String classname)方法,也是使用反射
22、反射中class.forName 和 classLoader区别
class.forName除了会将类的class文件加载到jvm中,还会对类进行解释,执行类中的static块
classLoader只会加载class文件,只有在newInstance才会执行static代码块
23、UnsupportOperationException异常
表明操作不支持的异常,在集合框架中大量应用
24、什么是注解、断言
25、创建对象的方式
new关键字
Class类的newInstance方法(反射)
Constructor中的newInstance方法(反射)
clone对象
反序列化机制创建的对象