Java开发八股文之基础篇
目前是准大四生,最近在进行一个求职,于是整理了一些自己背的八股文的题目和参考答案,在求职的小伙伴也可以参考一下我整理的八股文,参考答案仅供参考,要是有什么不合理的地方可以跟我说我再进行一个修改~
1.JVM、JDK、JRE三者关系?
jdk:包括了java运行环境jre,java工具和Java基础类库
jre:是Java程序运行所需的最小环境
JVM:是Java虚拟机,是Java程序运行的环境。它负责将Java字节码(由Java编译器生成)解释或编译成机器码,=并执行程序。JVM提供了内存管理、垃圾回收、安全性等功能,使得Java程序具备跨平台性。
2.八种基本的数据类型
Java支持数据类型分为两类:基本数据类型和引I用数据类型。
基本数据类型共有8种,可以分为三类:
数值型:整数类型(byte、short、int、long)和浮点类型(float、double)
·字符型:char
·布尔型:boolean
Java八种基本数据类型的字节数:1字节(byte、boolean)、2字节(short、char)、4字节(int、float)、8字节(long、double)
3.数据类型转换方式你知道哪些?
自动类型转换(隐式转换):当目标类型的范围大于原类型时候,会自动转化
强制类型转换(显示转换):小于范围时候 long-》int
字符串转换Interger.parseInt()方法,将字符串转换为整型
数值之间的转换:将整型转换为字符型等,使用包装类实现
4.类型互转会出现什么问题吗?
数据丢失:比如当范围较大的数据类型转换为比较小的数据类型时,long-》int转,会导致高位数据丢失
数据溢出:范围小转换为范围大 int-long
精度丢失:float-double转换
数据转换类型不匹配问题
5.装箱和拆箱是什么?
是将基本数据类型和它所对应的包装类之间的转换
6.Java为什么要有Integer?
①在泛型中的应用:泛型只能使用引用类型,而不是使用基本类型
②在转换中的应用:基本类型和引用类型不能直接转换,必须使用包装类来实现,如int转换为String,必须先转换为Integer
③在集合中的应用:集合只能存储对象,而不能存储基本数据类型。
7.说一下 integer的缓存
Java的Integer类内部实现了一个静态缓存池,用于存储特定范围内的整数值对应的Integer对
象。
默认情况下,这个范围是-128至127。当通过Integer.valueOf(int)方法创建一个在这个范围内
的整数对象时,并不会每次都生成新的对象实例,而是复用缓存中的现有对象,会直接从内
存中取出,不需要新建一个对象
8.怎么理解面向对象?简单说说封装继承多态
面向对象是一种编程范式,它将现实世界中的事物抽象为对象,对象具有属性(称为宇段或属性)和行为
(称为方法).面向对象编程的设计思想是以对象为中心,通过对象之间的交互来完成程序的功能,具有
灵活性和可扩展性,通过封装和继承可以更好地应对需求变化。
java面向对象的三大特性包括:封装,继承,多态:
封装:封装是指将对象的属性(数据)和行为(方法)结合在一起,对外隐藏对象的内部细节,仅通过对象提供的接口与外界交互。封装的目的是增强安全性和简化编程,使得对象更加独立。
继承:继承是一种可以使得子类自动共享父类数据结构和方法的机制。它是代码复用的重要手段,通过继承可以建立类与类之间的层次关系,使得结构更加清晰。
多态:多态是指允许不同类的对象对同一消息作出响应。 即同一个接口,使用不同的实例而执行不同操作。多态性可以分为编译时多态(重载)和运行时多态 (重写).它使得程序具有良好的灵活性和扩展性。
9.多态体现在哪几个方面?
方法重载:
方法重载是指同一类中可以有多个同名方法,它们具有不同的参数列表(参数类型,数量或顺序不同).虽然方法名相同,但根据传入的参数不同,编译器会在编译时确定调用哪个方法。
示例:对于一个 add 方法,可以定义为 add(int a, int b) 和 add( double a,double b)
方法重写:
方法重写是指子类能够提供对父类中同名方法的具体实现。在运行时,vm会根据对象的实际类型确定调用哪个版本的方法。这是实现多态的主要方式。
示例:在一个动物类中,定义一个 punos 方法,子类 dog 可以重写该方法以实现
bark,而 cat 可以实现 meow .
10.重载与重写有什么区别?
重载(overloading)指的是在同一个类中,可以有多个同名方法,它们具有不同的参数类型,参数个数或参数顺序不同),编译器根据调用时的参数类型来决定调用哪个方法。
重写(overriding)指的是子类可以重新定义父类中的方法名,参数列表和这回类型必须与父类中的方法一致,通过@override注解来明确表示这是对父类方法的重写。
重载是指在同一个类中定义多个同名方法,而重写是指子类重新定义父类中的方法。
11.抽象类能加final修饰吗?
不能,Java中的抽象类是用来被继承的,而final修饰符用于禁止类被继承或方法被重写,因此,抽象类和final修饰符是互斥的,不能同时使用。
12.接口可以包含构造函数吗?
不可以,因为接口不会有自己的实例,不需要有构造函数
13.Java 中 final 作用是什么?
修饰类、方法、变量
类:不能被继承
修饰方法:不能被重写
修饰变量:一旦被赋值不能被改变
14.什么是泛型?
泛型是Java编程语言中的一个重要特性,它允许类、接口和方法在定义时使用一个或多个类
型参数,这些类型参数在使用时可以被指定为具体的类型。
泛型的主要目的是在编译时提供更强的类型检查,并且在编译后能够保留类型信息,避免了
在运行时出现类型转换异常。
15.java创建对象有哪些方式?
(1)new关键字
(2)使用class类的newInstance()方法
(3)使用constructor类的newInstance()方法
(4)使用clone()方法
(5)使用反序列化,通过对象序列化到文件或流中,然后再进行反序列化来创建对象
14.什么是泛型?
泛型是Java编程语言中的一个重要特性,它允许类、接口和方法在定义时使用一个或多个类
型参数,这些类型参数在使用时可以被指定为具体的类型。
泛型的主要目的是在编译时提供更强的类型检查,并且在编译后能够保留类型信息,避免了
在运行时出现类型转换异常。
15.java创建对象有哪些方式?
(1)new关键字
(2)使用class类的newInstance()方法
(3)使用constructor类的newInstance()方法
(4)使用clone()方法
(5)使用反序列化,通过对象序列化到文件或流中,然后再进行反序列化来创建对象
16.如何获取私有对象?
java中,私有的对象通常用private修饰,只能在类内部使用
不过可以通过以下两种方式来简介获取私有对象
第一:使用公共访问器方法(getter方法)
第二:采用反射机制
反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法,对于任意一个对象,都能调用它的任意一个属性和方法。
17.反射在你平时写代码或者框架中的应用场景有哪些?
我们项目使用的数据库是MySQL,使用jdbc连接数据库时使用Class.forName()通过加载数据库驱动程序。
18.能讲一讲Java注解的原理吗?
注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理
类。
我们通过反射获取注解时,返回的是ava运行时生成的动态代理对象。通过代理对象调用自定
义注解的方法,会最终调用AnnotationInvocationHandler的invoke方法。该方法会从
memberValues这个Map中索引出对应的值。而memberValues的来源是Java常量池。
19.对注解解析的底层实现了解吗?
注解解析的底层实现主要依赖于Java的反射机制和字节码文件的存储。通过@Retention元注解可以控制注解的保留策略,当使用RetentionPolicy.RUNTIME时,可以在运行时通过反射API来解析注解信息。在JVM层面,会从字节码文件中读取注解信息,并创建注解的代理对象来获取注解的属性值。
20.Java注解的作用域呢?
类级别作用域(类的访问级别、继承关系、注释)、
方法级别作用域(访问级别、返回类型、异常、注释)、
字段级别作用域(访问级别、默认值、注释)
21.介绍一下Java异常
异常主要基于两大类,throwable类以及子类,throwable有两个比较重要的子类Error和Exception
Error表示环境运行时错误,这个错误是程序无法处理的严重问题
Exception:可以处理的异常,分为两大类:非运行时异常和运行时异常
非运行异常如文件不存在,运行时异常如空指针
22、Java异常处理有哪些?
try-catch,将觉得有异常的代码写在try里面,catch用于捕获并处理异常
throw语句:手动抛出异常,在代码中使用
throw new ExceptionType("Exception message");
throws关键字:在方法声明中声明可能抛出的异常
public void methodName() throws ExceptionType {//方法体}
finally块:无论异常是否发生都会执行这边,通常用于释放资源
23.== 与 equals 有什么区别?
==比较的是两个字符串内存地址(堆内存)的数值是否相等,属于数值比较;
equals(:比较的是两个字符串的内容,属于内容比较。
24.hashcode和equals方法有什么关系?
假如重写了equals方法则必须重写hashcode,以保证在使用哈希表等数据结构时,对象的相等性判断和存储查找操作能够正常工作。
23.String、StringBuffer、StringBuilder的区别和联系
都是Java中处理字符串常用的类
- String:不可变的字符串,线程安全,适合固定内容的场景。
- StringBuffer:可变的字符串,线程安全,适合多线程下的频繁修改。
- StringBuilder:可变的字符串,非线程安全,适合单线程下的高性能操作。
24.怎么把一个对象从一个jvm转移到另一个jvm?
这个可以使用序列化和反序列化来实现,将对象序列化为字节流,并将其发送到另一个jvm,然后在另一个jvm中反序列化字节流回复对象,这个可以通过java的objectOutStream和objectInputStream来实现
还有一种方法就是使用消息中间件,将对象序列化为消息,通过消息队列进行传输,步骤主要是先将对象转换为通用格式,然后发送消息到中间件,最后目标JVM订阅消息并反序列化
25.将对象转为二进制字节流具体怎么实现?
在Java中通过序列化对象流来完成序列化和反序列化:
首先让类实现serializable接口
创建输出流并写入对象,通过ObjectOutputStream里的writeObject()方法做序列化操作
创建输入流并读取对象,通过ObjectInputStrean里的readObject()方法做反序列化操作。