查看: 114|回复: 1

2022年大厂offer必备java面试题整理-Java基础(3)

[复制链接]

2

主题

8

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2022-9-23 18:42:01 | 显示全部楼层 |阅读模式
Allen:2022年大厂offer必备java面试题整理-Java基础(1)

Allen:2022年大厂offer必备java面试题整理-Java基础(2)


21、Java 静态变量和成员变量的区别。






成员变量存在于堆内存中。静态变量存在于⽅法区中。
成员变量与对象共存亡,随着对象创建⽽存在,随着对象被回收⽽释放。静态变量与类共存亡,随着类的加载⽽存在,随着类的消失⽽消失。

成员变量所属于对象,所以也称为实例变量。静态变量所属于类,所以也称为类变量。
成员变量只能被对象所调⽤ 。静态变量可以被对象调⽤,也可以被类名调⽤。


22、是否可以从⼀个静态(static)⽅法内部发出对⾮静态(non-static)⽅法的调⽤?




区分两种情况,发出调⽤时是否显示创建了对象实例。

1)没有显示创建对象实例:不可以发起调⽤,⾮静态⽅法只能被对象所调⽤,静态⽅法可以通过对象调⽤,也可以通过类名调⽤,所以静态⽅法被调⽤时,可能还没有创建任何实例对象。因此通过静态⽅法内部发出对⾮静态⽅法的调⽤,此时可能⽆法知道⾮静态⽅法属于哪个对象。




2)显示创建对象实例:可以发起调⽤,在静态⽅法中显示的创建对象实例,则可以正常的调⽤。




23、初始化考察,请指出下⾯程序的运⾏结果。





执⾏结果:ABabab,两个考察点:
1)静态变量只会初始化(执⾏)⼀次。
2)当有⽗类时,完整的初始化顺序为:⽗类静态变量(静态代码块)->⼦类静态变量(静态代码块)->⽗类⾮静
态变量(⾮静态代码块)->⽗类构造器 ->⼦类⾮静态变量(⾮静态代码块)->⼦类构造器 。


24、抽象类(abstract class)和接⼝(interface)有什么区别?




1)抽象类只能单继承,接⼝可以多实现。
2)抽象类可以有构造⽅法,接⼝中不能有构造⽅法。
3)抽象类中可以有成员变量,接⼝中没有成员变量,只能有常量(默认就是 public static final)
4)抽象类中可以包含⾮抽象的⽅法,在 Java 7 之前接⼝中的所有⽅法都是抽象的,在 Java 8 之后,接⼝⽀持⾮抽象⽅法:default ⽅法、静态⽅法等。Java 9 ⽀持私有⽅法、私有静态⽅法。
5)抽象类中的抽象⽅法类型可以是任意修饰符,Java 8 之前接⼝中的⽅法只能是 public 类型,Java 9 ⽀持private 类型。


设计思想的区别:

接⼝是⾃上⽽下的抽象过程,接⼝规范了某些⾏为,是对某⼀⾏为的抽象。我需要这个⾏为,我就去实现某个接⼝,但是具体这个⾏为怎么实现,完全由⾃⼰决定。

抽象类是⾃下⽽上的抽象过程,抽象类提供了通⽤实现,是对某⼀类事物的抽象。我们在写实现类的时候,发现某些实现类具有⼏乎相同的实现,因此我们将这些相同的实现抽取出来成为抽象类,然后如果有⼀些差异点,则可以提供抽象⽅法来⽀持⾃定义实现。

⽹上看到有个说法,挺形象的:
普通类像亲爹 ,他有啥都是你的。
抽象类像叔伯,有⼀部分会给你,还能指导你做事的⽅法。
接⼝像⼲爹,可以给你指引⽅法,但是做成啥样得你⾃⼰努⼒实现。


25、Java 中的 final 关键字有哪些⽤法?


修饰类:该类不能再派⽣出新的⼦类,不能作为⽗类被继承。因此,⼀个类不能同时被声明为abstract 和 final。
修饰⽅法:该⽅法不能被⼦类重写。

修饰变量:该变量必须在声明时给定初值,⽽在以后只能读取,不可修改。 如果变量是对象,则指的是引⽤不可
修改,但是对象的属性还是可以修改的。





26、阐述 final、finally、finalize 的区别。




其实是三个完全不相关的东⻄,只是⻓的有点像。
final 如上所示。

finally:finally 是对 Java 异常处理机制的最佳补充,通常配合 try、catch 使⽤,⽤于存放那些⽆论是否出现异常都⼀定会执⾏的代码。在实际使⽤中,通常⽤于释放锁、数据库连接等资源,把资源释放⽅法放到 finally 中,可以⼤⼤降低程序出错的⼏率。

finalize:Object 中的⽅法,在垃圾收集器将对象从内存中清除出去之前做必要的清理⼯作。finalize()⽅法仅作为了解即可,在 Java 9 中该⽅法已经被标记为废弃,并添加新的 java.lang.ref.Cleaner,提供了更灵活和有效的⽅法来释放资源。这也侧⾯说明了,这个⽅法的设计是失败的,因此更加不能去使⽤它。


27、try、catch、finally 考察,请指出下⾯程序的运⾏结果(1)。





执⾏结果:31。
相信很多同学应该都做对了,try、catch。finally 的基础⽤法,在 return 前会先执⾏ finally 语句块,所以是先输出 finally ⾥的 3,再输出 return 的 1。


28、try、catch、finally 考察,请指出下⾯程序的运⾏结果(2)。





执⾏结果:3。
这题有点意思,但也不难,try 返回前先执⾏ finally,结果 finally ⾥不按套路出牌,直接 return 了,⾃然也就⾛不到 try ⾥⾯的 return 了。
finally ⾥⾯使⽤ return 仅存在于⾯试题中,实际开发中千万不要这么⽤。


29、try、catch、finally 考察3,请指出下⾯程序的运⾏结果(3)





执⾏结果:2。
这边估计有不少同学会以为结果应该是 3,因为我们知道在 return 前会执⾏ finally,⽽ i 在 finally 中被修改为 3 了,那最终返回 i 不是应该为 3 吗?

这边的根本原因是,在执⾏ finally 之前,JVM 会先将 i 的结果暂存起来,然后 finally 执⾏完毕后,会返回之前暂存的结果,⽽不是返回 i,所以即使这边 i 已经被修改为 3,最终返回的还是之前暂存起来的结果 2。

这边其实根据字节码可以很容易看出来,在进⼊ finally 之前,JVM 会使⽤ iload、istore 两个指令,将结果暂存,在最终返回时在通过 iload、ireturn 指令返回暂存的结果。


30、Error 和 Exception 有什么区别?



Error 和 Exception 都是 Throwable 的⼦类,⽤于表示程序出现了不正常的情况。区别在于:
Error 表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的⼀种严重问题,⽐如内存溢出,不可能指望程序能处理这样的情况。

Exception 表示需要捕捉或者需要程序进⾏处理的异常,是⼀种设计或实现问题,也就是说,它表示如果程序运⾏正常,从不会发⽣的情况。


31、JDK1.8之后有哪些新特性?



1)接⼝默认⽅法:Java 8 允许我们给接⼝添加⼀个⾮抽象的⽅法实现,只需要使⽤ default 关键字即可。

从Java 8开始,引⼊了接⼝默认⽅法,这样的好处也是很明显的,⾸先解决了 Java8 以前版本接⼝兼容性问题,同时对于我们以后的程序开发,也可以在接⼝⼦类中直接使⽤接⼝默认⽅法,⽽不再需要在各个⼦类中各⾃实现响应接⼝⽅法。






2)Lambda 表达式和函数式接⼝:Lambda 表达式本质上是⼀段匿名内部类,也可以是⼀段可以传递的代码。
Lambda 允许把函数作为⼀个⽅法的参数(函数作为参数传递到⽅法中),使⽤ Lambda 表达式使代码更加简洁,但是也不要滥⽤,否则会有可读性等问题,《Effective Java》作者 Josh Bloch 建议使⽤ Lambda 表达式最好不要超过3⾏。

匿名内部类




Lambda 表达式




函数式接⼝
Lambda表达式需要函数式接⼝的⽀持,所以,我们有必要来说说什么是函数式接⼝。
只包含⼀个抽象⽅法的接⼝,称为函数式接⼝。

可以通过 Lambda 表达式来创建该接⼝的对象。(若 Lambda表达式抛出⼀个受检异常,那么该异常需要在⽬标接⼝的抽象⽅法上进⾏声明)。
可以在任意函数式接⼝上使⽤@FunctionalInterface 注解,这样做可以检查它是否是⼀个函数式接⼝,同时 javadoc 也会包含⼀条声明,说明这个接⼝是⼀个函数式接⼝




3)Stream API:⽤函数式编程⽅式在集合类上进⾏复杂操作的⼯具,配合Lambda表达式可以⽅便的对集合进⾏处理。Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进⾏的操作,可以执⾏⾮常复杂的查找、过滤和映射数据等操作。使⽤Stream API 对集合数据进⾏操作,就类似于使⽤ SQL 执⾏的数据库查询。也可以使⽤Stream API 来并⾏执⾏操作。简⽽⾔之,Stream API 提供了⼀种⾼效且易于使⽤的处理数据的⽅式。






4)⽅法引⽤:⽅法引⽤提供了⾮常有⽤的语法,可以直接引⽤已有Java类或对象(实例)的⽅法或构造器。与lambda联合使⽤,⽅法引⽤可以使语⾔的构造更紧凑简洁,减少冗余代码。
⽅法引⽤就是操作符“::”将⽅法名和对象或类的名字分隔开来。

如下三种使⽤情况:
对象::实例⽅法
类::静态⽅法
类::实例⽅法




5)⽇期时间API:Java 8 引⼊了新的⽇期时间API改进了⽇期时间的管理。

在Java 8之前,所有关于时间和⽇期的API都存在各种使⽤⽅⾯的缺陷,主要有:




由于以上这些问题,出现了⼀些三⽅的⽇期处理框架,例如Joda-Time,date4j等开源项⽬。但是,Java需要⼀套标准的⽤于处理时间和⽇期的框架,于是Java 8中引⼊了新的⽇期API。新的⽇期API是JSR-310规范的实现,JodaTime框架的作者正是JSR-310的规范的倡导者,所以能从Java 8的⽇期API中看到很多Joda-Time的特性。
Java 8的⽇期和时间类包含 LocalDate 、 LocalTime 、 Instant 、 Duration 以及 Period ,这些类都包含在 java.time 包中,下⾯我们看看这些类的⽤法。

6)Optional 类:著名的 NullPointerException 是引起系统失败最常⻅的原因。很久以前 Google Guava 项⽬引⼊了 Optional 作为解决空指针异常的⼀种⽅式,不赞成代码被 null 检查的代码污染,期望程序员写整洁的代码。
受Google Guava的⿎励,Optional 现在是Java 8库的⼀部分。

7)新⼯具:新的编译⼯具,如:Nashorn引擎 jjs、 类依赖分析器 jdeps。
回复

使用道具 举报

5

主题

9

帖子

20

积分

新手上路

Rank: 1

积分
20
发表于 2025-3-7 18:18:50 | 显示全部楼层
我是个凑数的。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表