Java基础知识面试题(收录全网总结最全面的面试题)

74 阅读7分钟

1.什么是字节码?采用字节码的好处是什么?

字节码:字节码是java文件经过编译后的.class文件

采用字节码的好处:Java程序运行时比较高效,无须重新编译便可在多种不同的计算机上运行

2. 面向对象的特征

面向对象的特征:封装、继承、多态、抽象。

封装:就是把对象的属性和行为(数据)结合为一个独立的整体,并尽可能隐藏对

象的内部实现细节,就是把不想告诉或者不该告诉别人的东西隐藏起来,把可以告诉别人的

公开,别人只能用我提供的功能实现需求,而不知道是如何实现的。增加安全性。

继承:子类继承父类的数据属性和行为,并能根据自己的需求扩展出新的行为,提

高了代码的复用性。

多态:指允许不同的对象对同一消息做出相应。即同一消息可以根据发送对象的不

同而采用多种不同的行为方式(发送消息就是函数调用)。封装和继承几乎都是为多态而准

备的,在执行期间判断引用对象的实际类型,根据其实际的类型调用其相应的方法。

抽象表示对问题领域进行分析、设计中得出的抽象的概念,是对一系列看上去不同,

但是本质上相同的具体概念的抽象。在 Java 中抽象用 abstract 关键字来修饰,用 abstract

修饰类时,此类就不能被实例化,从这里可以看出,抽象类(接口)就是为了继承而存在的。

3.Java 的基本数据类型有哪些

171744c434465b69~tplv-t2oaga2asx-jj-mark 3024 0 0 0 q75.png

4.Java中变量,代码块,构造器之间执行顺序是怎么样的?

先初始化静态部分,再初始化动态部分

先初始化父类部分,再初始化子类部分

先初始化变量,再初始化代码块和构造器

执行顺序为:

1.父类的静态成员变量(如果是第一次加载)

2.父类的静态代码块

3.子类的静态成员变量

4.子类的静态代码块

5.父类的普通成员变量

6.父类的动态代码块

7.父类的构造器方法

8.子类的普通成员变量

9.子类的动态代码块

10.子类的构造器方法

5.重载和重写的区别

重载: 发生在同一个类中,方法名必须相同,参数类型不同.个数不同.顺序不同,

方法返回值和访问修饰符可以不同,发生在编译时。

重写: 发生在父子类中,方法名.参数列表必须相同,返回值范围小于等于父类,

抛出的异常范围小于等于父类,

访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能

重写该方法。

6.Java 中==和 equals 的区别

== 的作用:

基本类型:比较的就是值是否相同

引用类型:比较的就是地址值是否相同

equals 的作用:

引用类型:默认情况下,比较的是地址值。

特:String、Integer、Date 这些类库中 equals 被重写,比较的是内容而不是地址!

面试题:请解释字符串比较之中 “ == ” 和 equals() 的区别?

答: ==:比较的是两个字符串内存地址(堆内存)的数值是否相等,属于数值比较;

equals():比较的是两个字符串的内容,属于内容比较。

7.final 、finally 、finalize区别

final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表 示该变量是一个常量不能被重新赋值

finally一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally代码块 中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码

finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾回收器来调 用,当我们调用System.gc() 方法的时候,由垃圾回收器调用finalize(),回收垃圾,一个对象是否可回收的最后判断

8.String、StringBuffer、StringBuilder 三者之间的区别(必会)

String 字符串常量

StringBuffer 字符串变量(线程安全)

StringBuilder 字符串变量(非线程安全)

String 中的 String 类中使用 final 关键字修饰字符数组来保存字符串,private

final char value[] ,String 对象是不可变的,也就可以理解为常量,线程安全。

AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了

一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。

StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全

的。

StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。

小结:

(1)如果要操作少量的数据用 String;

(2)多线程操作字符串缓冲区下操作大量数据用 StringBuffer;

(3)单线程操作字符串缓冲区下操作大量数据用 StringBuilder。

9.接口和抽象类的区别是什么?

实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接

口。

构造函数:抽象类可以有构造函数;接口不能有。

main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方

法。

实现数量:类可以实现很多个接口;但是只能继承一个抽象类。

访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访

问修饰符

10.string 常用的方法有哪些?

indexOf():返回指定字符的索引。

charAt():返回指定索引处的字符。

replace():字符串替换。

trim():去除字符串两端空白。

split():分割字符串,返回一个分割后的字符串数组。

getBytes():返回字符串的 byte 类型数组。

length():返回字符串长度。

toLowerCase():将字符串转成小写字母。

toUpperCase():将字符串转成大写字符。

substring():截取字符串。

equals():字符串比较。

11.反射

在 Java 中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有

的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息

以及动态调用对象方法的功能成为 Java 语言的反射机制。

获取 Class 对象的 3 种方法 :

1.调用某个对象的 getClass()方法

Person p=new Person();

Class clazz=p.getClass();

2 调用某个类的 class 属性来获取该类对应的 Class 对象

Class clazz=Person.class;

3.使用 Class 类中的 forName()静态方法(最安全/性能最好)

Class clazz=Class.forName("类的全路径"); (最常用)

12.什么是java序列化,如何实现java序列化

java的序列化是将Java对象转换成字节流的过程。序列化是为了解决在对象流读写操作时所引发的问题 序列化的实现:将需要被序列化的类实现 Serialize 接口,没有需要实现的方法,此接口只是为了标注对象可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个 ObjectOutputStream(对象流)对象,再使用 ObjectOutputStream 对象的 write(Object obj)方法就可以将参数 obj 的对象写出

13.栈内存、堆内存、方法区

堆内存用来存放由new创建的对象实例和数组

栈内存中保存的是堆内存空间的访问地址,或者说栈中的变量指向堆内存中的变量

方法区是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

方法区、堆内存、栈内存图.png