Java面试50问,女面试官最喜欢问的居然是它!

简介: Java面试50问,女面试官最喜欢问的居然是它!

[] 什么是接口和抽象类?

在Java中,接口(Interface)和抽象类(Abstract Class)都是实现面向对象编程中抽象化概念的工具,但它们有以下不同之处:

接口(Interface)

1. 定义:接口是一种完全抽象的类,它可以包含常量和方法的签名,但不能有任何的实现代码。
2. 成员变量:接口中的变量默认是public static final的,这意味着它们是常量。
3. 方法:接口中的方法默认是public abstract的,但Java 8允许接口中存在默认方法(带有实现的方法)和静态方法。
4. 实现:要使用接口,必须通过一个具体类来实现(implements)它。实现类必须提供接口中所有方法的具体实现。
5. 多重继承:一个类可以实现多个接口,这允许实现多重继承的功能。
6. 使用场景:接口常用于定义一组类应遵循的契约或行为规范。

抽象类(Abstract Class)

1. 定义:抽象类是一种不完整的类,它包含抽象方法和具体方法。
2. 成员变量:抽象类中的变量可以是任意类型的,没有默认的访问修饰符。
3. 方法:抽象类可以有抽象方法(没有方法体)和具体方法(有方法体)。
4. 继承:要使用抽象类,必须通过一个具体子类来继承(extends)它。子类可以继承抽象类的具体方法,并且必须提供所有抽象方法的具体实现。
5. 单继承:Java中的类只能继承一个类,但可以实现多个接口。
6. 使用场景:抽象类常用于定义一个类的基本轮廓,它提供了一些实现细节,同时为子类留下一些抽象部分。

接口和抽象类的主要区别:

- 抽象程度:接口是完全抽象的,而抽象类可以包含具体的实现细节。
- 多重继承:类可以实现多个接口,但只能继承一个抽象类。
- 成员变量:接口中的变量默认是公共的静态常量,而抽象类中的变量可以是任意类型。
- 方法实现:接口中的方法默认是抽象的,不能有实现(除非是默认方法),而抽象类可以有抽象方法和具体方法。
- 构造器:抽象类可以有构造器,接口不能有。
- 访问修饰符:接口的方法默认是公共的,不能有访问修饰符;抽象类的方法可以有访问修饰符。

选择使用接口还是抽象类取决于具体的设计需求。如果需要定义一组不相关类共有的行为,可以使用接口。如果需要定义一个基类,它提供了一些共同的属性和方法,并且想要强制子类提供其他方法的实现,那么抽象类是更好的选择。

[] 什么是单例模式?

单例模式(Singleton Pattern)是一种常用的软件设计模式,其核心目的是确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。单例模式在Java中的实现通常遵循以下几个原则:

1. 私有构造函数:为了防止外部通过new操作符创建类的多个实例,单例类的构造函数是私有的。

2. 静态私有实例:类自身持有其唯一实例的引用,这个实例通常是静态的,因为这样即使多次获取单例对象,返回的都是同一个对象。

3. 公有的静态方法:提供一个公有的静态方法,通常是getInstance,用于返回类的唯一实例。如果实例不存在,该方法会创建一个实例;如果已存在,则直接返回该实例。

单例模式的实现方式有多种,以下是几种常见的实现方法:

懒汉式(线程不安全)

public class Singleton {
   private static Singleton instance;

   private Singleton() {}

   public static Singleton getInstance() {
       if (instance == null) {
           instance = new Singleton();
       }
       return instance;
   }
}

懒汉式(线程安全)

public class Singleton {
   private static Singleton instance;

   private Singleton() {}

   public synchronized static Singleton getInstance() {
       if (instance == null) {
           instance = new Singleton();
       }
       return instance;
   }
}

饿汉式

public class Singleton {
   private static final Singleton instance = new Singleton();

   private Singleton() {}

   public static Singleton getInstance() {
       return instance;
   }
}

静态内部类

public class Singleton {
   private Singleton() {}

   private static class SingletonHolder {
       private static final Singleton INSTANCE = new Singleton();
   }

   public static Singleton getInstance() {
       return SingletonHolder.INSTANCE;
   }
}

枚举实现

public enum Singleton {
   INSTANCE;

   public void someMethod() {
       // 实例方法
   }
}

单例模式在以下场景中非常有用:

- 当一个类只能有一个实例时,如配置管理器、连接池等。
- 当创建对象的资源非常昂贵,需要重复利用时。

然而,单例模式也有一些缺点,例如它可能会使代码难以测试,并且违反了高内聚低耦合的原则。因此,在决定使用单例模式时,需要仔细权衡其优缺点。

相关文章
|
29天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
67 2
|
18天前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
46 14
|
28天前
|
存储 缓存 算法
面试官:单核 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流面试之道
|
23天前
|
Java 编译器 程序员
Java面试高频题:用最优解法算出2乘以8!
本文探讨了面试中一个看似简单的数学问题——如何高效计算2×8。从直接使用乘法、位运算优化、编译器优化、加法实现到大整数场景下的处理,全面解析了不同方法的原理和适用场景,帮助读者深入理解计算效率优化的重要性。
27 6
|
1月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
53 4
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
106 4
|
1月前
|
算法 Java
JAVA 二叉树面试题
JAVA 二叉树面试题
18 0
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。