JavaSE面试题汇总
1. 访问修饰符public、private、protected、以及不写(默认)时的区别?
- public是所有类可见;
- protected是同一包内及其所有子类可见;
- 默认是同一包内可见;
- private是同一类内可见
2. 静态变量和普通变量的区别?
- 普通变量通常是通过new创建类得的对象,数据存储空间才被分配,方法才能被调用。
- 静态变量可以在没有所属类的的情况下,被访问。这是因为静态变量是在类初始化时加载的。
3. java静态变量、代码块、和静态方法的执行顺序是什么?
- 无继承关系:静态代码块、构造代码块、构造器、普通代码块
- 有继承关系:父类静态、子类静态、父类代码块、父类构造器、子类代码块、子类构造器
4. 面向对象的三大特征?
- 封装:把客观事物封装成抽象的类,并且可以选择性的展示自己的成员
- 继承:在无需重新编写原来的类的基础上对类的功能进行拓展,被继承的为父类
- 多态:父类中定义的成员可以被子类继承后具有不同的数据类型或表现出不同的行为
5. JAVA是如何实现多态?
- 多态分为:编译时多态和运行时多态
- 实现多态有三个必要条件:
- 继承:必须存在有继承关系的子类和父类。
- 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
- 向上转型:需要将子类的引用赋给父类对象,这样该引用才既能可以调用父类的方法,又能调用子类的方法。
6. 什么是重载?什么是重写?区别是什么?
- 重载:方法名称相同,参数和返回类型可以不同,如构造器
- 重写:方法名和参数与返回类性都相同,但方法体不同
- 区别:重载时编译时多态,重写是运行时多态
7. 抽象类和接口的区别?
-
语法层面:
- 抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
- 抽象类可以有静态代码块和静态方法,而接口中不能含有静态代码块以及静态方法;
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
-
设计层面:
-
抽象类是对类抽象,而接口是对行为的抽象
-
抽象类作为很多子类的父类,它是一种模板式设计;而接口是一种行为规范,它是
一种辐射式设计。(接口更新,实现类都变更)
-
8. JAVA创建对象的几种方式?
- new创建新对象
- 通过反射机制
- 采用clone机制
- 通过序列化机制
9. 值传递和引用传递的区别?为什么JAVA只有值传递?
- 值传递:是指在调用方法时将实参复制一份传递到方法中,这样当方法对形参进行修改时不会影响到实参。
- 引用传递:是指在调用方法时将实参的地址直接传递到方法中,那么在方法中对形参所进行的修改,将影响到实参。
- 只有值传递:因为基本类型作为参数被传递时肯定是值传递;引用类型作为参数被传递时也是值传递,只不过“值”为对应的引用。(只是引用的地址变化了,并不是对象改变了)
10. ==和equals的区别?
- == 常用于基本数据类型和引用类型的比较:
- 比较的是两个基本数据类型的值是否相等;
- 判断两个对象是否指向了同一块内存区域;
- equals常用于两个对象之间,检测一个对象是否等于另一个对象:
- 没有重写equals方法,比较的是两个对象的引用是否相等
- 重写了equals方法,比较的是两个对象的内容是否相等
11. String和StringBuilder和StringBuffer的区别?
- 可变与不可变:String对象是不可变的,因为private final char value[];
- 线程安全:String线程安全,StringBuilder线程不安全,StringBuffer线程安全
12. 什么是字符串常量池?
- JVM为了提高性能和减少内存开销,在堆中开辟了一块内存空间,即字符串常量池,使用字符串时,先找一下有没有,有直接返回,没有初始化,放入常量池中。
13. 什么是泛型?它的好处是什么?
- 泛型:就是将数据类型参数化,其在编译时才确定具体的参数
- 好处:类型安全和消除强制类型转换
14. 什么是泛型中的限定通配符和非限定通配符?
- 限定通配符:
- 它通过确保类型必须是T及其子类来设定类型的上界,
- 它通过确保类型必须是T及其父类来设定类型的下界。
- 非限定通配符:
- <?>,可以用任意类型来替代
15. 什么是反射?优缺点?
- 反射是在运行状态中,对于任意一个类都能知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态调用信息和动态调用对象方法的功能成为java反射机制
- 优点:可以动态的创建和使用对象
- 缺点:使用反射性能较低,需要解析字节码,将内存中的对象进行解析
16.如何获取反射中的Class对象?
- Class.forName(“类的路径”);当你知道该类的全路径名时,你可以使用该方法获取 Class 类对象。
- 类名.class。这种方法只适合在编译前就知道操作的 Class
- 对象名.getClass()
- classLoader.loadClass(类路径);通过类加载器来获取类的Class对象
- 基本数据类型.class
- 基本数据类型的包装类.TYPE
17.Java反射API有几类?
- Class 类:反射的核心类,可以获取类的属性,方法等信息。
- Field 类:Java.lang.reflec 包中的类,表示类的成员变量,可以用来获取和设置类之中的属性值。
- Method 类:Java.lang.reflec 包中的类,表示类的方法,它可以用来获取类中的方法信息或者执行方法。
- Constructor 类:Java.lang.reflec 包中的类,表示类的构造方法。
18.反射使用的步骤?反射机制的原理是什么?
- 获取类的Class对象
- 通过Class对象的无参构造器,创建类实例newInstance()
- 通过Class对象获取类的方法对象,Method对象
- 通过方法对象的invoke方法来调用方法
19. 为什么引入反射概念?反射机制的应用有哪些?
- 反射让开发人员可以通过外部类的全路径名创建对象,并使用这些类,实现一些扩展的功能。
- 反射让开发人员可以枚举出类的全部成员,包括构造函数、属性、方法。以帮助开发者写出正确的代码。
- 应用:
- 第一种:JDBC 的数据库的连接
- 第二种:Spring 框架的使用,最经典的就是xml的配置模式。
20. Java序列化与反序列化是什么?
-
序列化:是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。核心作用
是对象状态的保存与重建。
-
反序列化:客户端从文件中或网络上获得序列化后的对象字节流,根据字节流中所保存的对象状
态及描述信息,通过反序列化重建对象。
21.为什么需要序列化与反序列化?
- 对内存中的对象进行持久化或网络传输, 这个时候都需要序列化和反序列化
22.序列化实现的方式有哪些?
-
实现Serializable接口,序列化接口没有方法或字段,仅用于标识可序列化的语义。
-
实现Externalizable接口,Externalizable 继承自 Serializable ,该接口中定义了两个抽象方法:
- writeExternal() 与readExternal() ,开发人员需要重写该方法
-
区别
- Serializable:系统自动存储必要的信息、只需要实现该接口即可、性能略差
- Externalizable:程序员决定存储哪些信息、必须实现接口内的两个方法、性能略好
23. Java 序列化中如果有些字段不想进行序列化,怎么办?
- 对于不想进行序列化的变量,使用 transient 关键字修饰。transient 只能修饰变量,不能修饰类和方法。
24.什么是serialVersionUID?为什么还要显示指定serialVersionUID的值?
- serialVersionUID 用来表明类的不同版本间的兼容性
- 因为实际开发中,类会不断迭代,一旦类被修改了, 那旧对象反序列化就会报错. 所以在实际开发中, 我们都会显示指定一个serialVersionUID, 值是多少无所谓, 只要不变就行。确保是同一对象的修改,而不是创建
25.Java的IO 流分为几种?
- 按照流的方向:
- 输入流(inputStream)
- 输出流(outputStream)
- 按照处理数据的单位: 字节流和字符流。分别由四个抽象类来表示:
- 字节流:InputStream,OutputStream
- 字符流:Reader,Writer。
- 按照实现功能分:
- 节点流(可以从或向一个特定的地方读写数据,如 访问文件、访问数组、访问管道、访问字符串的流)
- 处理流(是对一个已存在的流的连接和封装,通过所封装的流的功能调用来实现数据读写,如 BufferedReader);
- 缓存(cache)是用来加速数据从硬盘中"读取"的,而缓冲(buffer)是用来加速数据"写入"硬盘的
26.字节流如何转为字符流?
- 字节输入流转字符输入流通过 InputStreamReader 实现,该类的构造函数可以传入 InputStream 对象
- 字节输出流转字符输出流通过 OutputStreamWriter 实现,该类的构造函数可以传入 OutputStream 对象。
27.字节流与字符流的区别?
- 读写的时候字节流是按字节读写,字符流按字符读写
- 字节流适合所有类型文件的数据传输,而字符流只能够处理纯文本数据,但是字符流处理文本要比字节流处理文本要方便。
- 在读写文件需要对内容按行处理,比如比较特定字符,处理某一行数据的时候一般会选择字符流
- 只是读写文件,和文件内容无关时,一般选择字节流
28.什么是阻塞IO?什么是非阻塞IO?
- IO操作包括:对硬盘的读写、对socket的读写以及外设的读写。
- 说一个完整的IO读请求操作包括两个阶段:
- 查看数据是否就绪;
- 进行数据拷贝(内核将数据拷贝到用户线程)。
- 区别:就在于第一个阶段,如果数据没有就绪,在查看数据是否就绪的过程中是一直等待,还是直接返回一个标志信息。
29.BIO、NIO、AIO的区别?
- BIO:同步并阻塞,在服务器中实现的模式为一个连接一个线程
- NIO:同步并非阻塞,在服务器中实现的模式为一个请求一个线程
- AIO:异步并非阻塞,在服务器中实现的模式为一个有效请求一个线程
30. Java IO都有哪些设计模式?
-
适配器模式
-
把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作
-
Reader reader = new INputStreamReader(inputStream);
-
-
装饰器模式
- 一种动态地往一个类中添加新的行为的设计模式。就功能而言,装饰器模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些功能。
- new BufferedInputStream(new FileInputStream(inputStream));