万字长文,62道Java核心面试题,一次性打包送给积极向上的你(4)

简介: 万字长文,62道Java核心面试题,一次性打包送给积极向上的你

27、什么是静态导入?


如果必须在一个类中使用其他类的静态变量或者静态方法,通常我们需要先导入该类,然后使用“类名.变量/方法”的形式调用。


import java.lang.Math;


double test = Math.PI * 5;



也可以通过静态导入的方式,就不需要再使用类名了。


import static java.lang.Math.PI;


double test = PI * 5;



不过,静态导入容易引发混乱(变量名或者方法名容易冲突),因此最好避免使用静态导入。


28、什么是 try-with-resources?


try-with-resources 是 Java 7 时引入的一个自动资源管理语句,在此之前,我们必须通过 try-catch-finally 的方式手动关闭资源,当我们忘记关闭资源的时候,就容易导致内存泄漏。


关于 try-with-resources 更详细的内容,可以参照我之前写了另外一篇文章:


我去,你竟然还在用 try–catch-finally


29、什么是 multi-catch?


Java 7 改进的另外一个地方就是 multi-catch,可以在单个 catch 中捕获多个异常,当一个 try 块抛出多个类似的异常时,这种写法更短,更清晰。


catch(IOException | SQLException ex){

   logger.error(ex);

   throw new MyException(ex.getMessage());

}



当有多个异常的时候,可以使用管道表示符“|”隔开。


30、什么是 static 块?


static 块是由 Java ClassLoader 将类加载到内存中时执行的代码块。通常用于初始化类的静态变量或者创建静态资源。


31、什么是接口?


接口是 Java 编程语言中的一个核心概念,不仅在 JDK 源码中使用很多,还在 Java 设计模式、框架和工具中使用很多。接口提供了一种在 Java 中实现抽象的方法,用于定义子类的行为约定。


32、什么是抽象类?


在 Java 中,抽象类用于创建具有某些被子类实现的默认方法的类,一个抽象类可以有没有方法体的抽象方法,也可以有和普通类一样有方法体的方法。


abstract 关键字用于声明一个抽象类,抽象类无法实例化,主要用于为子类提供一个模板,子类需要覆盖抽象方法。


关于抽象类更详细的内容,可以参照我之前写了另外一篇文章:


小白,你要的Java抽象类,操碎了心


33、抽象类和接口有什么区别?


声明抽象类的关键字为 abstract,声明接口的关键字为 interface。

抽象类可以有具体的方法,接口不能。

一个类只能继承一个抽象类,但可以实现多个接口。

接口中的变量只能是隐式的常量,抽象类中可以有任意类型的变量。

如果一个抽象类有 main() 方法,则可以运行它;但接口不能。

抽象类是对类的一种抽象,继承抽象类的类和抽象类本身是一种 is-a 的关系。

接口是对类的某种行为的一种抽象,接口和类之间并没有很强的关联关系,所有的类都可以实现 Serializable 接口,从而具有序列化的功能。


34、一个接口可以实现或者继承另外一个接口吗?


接口不能实现另外一个接口,但可以继承一个接口。


image.png


因为接口中不能有具体的方法,所以不会出现菱形问题,所以我们可以在一个接口中继承多个接口。


public interface C extends A,B{

}



从 Java 8 开始,接口可以有默认方法,所以当多个接口中存在相同的默认方法时,需要在实现接口的类中提供该方法的实现。


35、什么是标记接口?


标记接口是一个空的接口,没有任何方法,用于强制实现类中的某些功能。比较出名的标记接口有 Serializable 接口、Cloneable 接口。


关于 Serializable 接口更详细的内容,可以参照我之前写了另外一篇文章:


Java Serializable:明明就一个空的接口嘛


36、什么是包装器类?


包装器类是 Java 中八种基本数据类型的对象表示形式,所有的包装器类都是不可变的,并且是 final 的。通过装箱和拆箱,可以将八种基本数据类型和包装器类型互相转换。


关于基本类型和包装类型更详细的内容,可以参照我之前写了另外一篇文章:


面试官:兄弟,说说基本类型和包装类型的区别吧


37、什么是枚举?


enum(枚举)是 Java 1.5 时引入的关键字,它表示一种特殊类型的类,默认继承自 java.lang.Enum。


public enum PlayerType {

   TENNIS,

   FOOTBALL,

   BASKETBALL

}



enum 是用于创建枚举的关键字,枚举中的常量都是隐式 static 和 final 的。


关于枚举更详细的内容,可以参照我之前写了另外一篇文章:


恕我直言,我怀疑你并不会用 Java 枚举


38、什么是 Java 注解?


注解是 Java 1.5 时引入的,同 class 和 interface 一样,也属于一种类型,注解提供了一系列数据用来装饰程序代码(类、方法、字段等),但是注解并不是所装饰代码的一部分,它对代码的运行效果没有直接影响(这句话怎么理解呢?),由编译器决定该执行哪些操作。


关于注解更详细的内容,可以参照我之前写了另外一篇文章:


不吹牛逼,撸个注解有什么难的


39、什么是 Java 反射?


Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有字段和方法;对于任意一个对象,都能够调用它的任意字段和方法;这种动态获取信息以及动态调用对象方法的功能称为 Java 反射机制。


反射属于高级主题,在常规编程中应该避免使用,因为反射可以通过调用私有的构造方法来破坏设计模式,比如说单例模式。


尽管不建议使用反射机制,但反射机制的存在至关重要,因为如果没有反射,我们将没有 Spring 之类的框架,甚至 Tomcat 之类的服务器。它们通过反射调用适当的方法并对类实例化,省去了很多麻烦。


40、Java 中的组合指的什么?


通过对象组合可以实现代码的重用,Java 组合是通过引用其他对象的引用来实现的,使用组合的好处就是我们可以控制其他对象对使用者的可见性,并且刻意重用我们需要的对象。


41、与继承相比,组合有什么好处?


任何父类的修改都可能会影响到子类,甚至我们没有使用父类的一些方法。举个例子,假如子类有一个方法 test(),而父类之前是没有的,但突然有人在不知情的情况下在父类插入了一个同名但签名不同的 test() 方法,那么就会出现编译错误。组合是不会遇到这个问题的,因为我们仅仅会使用我们需要的方法。

这是父类追加的 test() 方法:


public class Super {
    public String test() {
        System.out.println("super");
        return null;
    }
}


原来子类的 test() 方法就出错了。


image.png


来个表格列举一下两者之间的优缺点:


组 合 关 系 继 承 关 系

优点:不破坏封装,整体类与局部类之间松耦合,彼此相对独立 缺点:破坏封装,子类与父类之间紧密耦合,子类依赖于父类的实现,子类缺乏独立性

优点:具有较好的可扩展性 缺点:支持扩展,但是往往以增加系统结构的复杂度为代价

优点:支持动态组合。在运行时,整体对象可以选择不同类型的局部对象 缺点:不支持动态继承。在运行时,子类无法选择不同的父类

优点:整体类可以对局部类进行包装,封装局部类的接口,提供新的接口 缺点:子类不能改变父类的接口

缺点:整体类不能自动获得和局部类同样的接口 优点:子类能自动继承父类的接口

缺点:创建整体类的对象时,需要创建所有局部类的对象 优点:创建子类的对象时,无须创建父类的对象


相关文章
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
76 2
|
27天前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
66 14
|
1月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
1月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
1月前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
1月前
|
Java 编译器 程序员
Java面试高频题:用最优解法算出2乘以8!
本文探讨了面试中一个看似简单的数学问题——如何高效计算2×8。从直接使用乘法、位运算优化、编译器优化、加法实现到大整数场景下的处理,全面解析了不同方法的原理和适用场景,帮助读者深入理解计算效率优化的重要性。
36 6
|
1月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
63 4
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
133 4
|
1月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
70 4
|
1月前
|
Java Maven Android开发
【Azure Developer】VS Code打包Java maven Project 遇见 BUILD FAILURE
Unknown lifecycle phase "lean". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>