整理好了!2024年最常见 100 道 Java基础面试题(三十六)

2024-05-09 04:52

本文主要是介绍整理好了!2024年最常见 100 道 Java基础面试题(三十六),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一篇地址:整理好了!2024年最常见 100 道 Java基础面试题(三十五)-CSDN博客

七十一、抽象类必须要有抽象方法吗?

抽象类不必须包含抽象方法。抽象类是使用 abstract 关键字声明的类,它的主要目的是作为其他类的基类,提供一个通用的模板。抽象类可以包含以下类型的成员:

  1. 抽象方法:没有方法体的方法,只是声明。抽象类中的抽象方法必须由继承该抽象类的非抽象子类实现。

  2. 具体方法:具有实现体的方法。抽象类可以包含具体方法,这些方法可以被子类直接继承并使用,也可以被子类重写以提供不同的实现。

  3. 静态成员:包括静态变量和静态方法。抽象类可以包含静态成员,它们属于类本身,而不是类的任何特定实例。

  4. 常量:通常声明为 static final,它们是类级别的不变值。

  5. 成员变量:抽象类可以包含实例变量,这些变量可以是普通变量,也可以是静态变量。

抽象类的主要目的是提供一个部分实现,强制其子类实现某些方法,以确保子类遵循特定的协议。即使抽象类中没有抽象方法,它仍然可以作为其他类的基类,提供一些通用的属性和具体方法。

示例

public abstract class Animal {private String name;public Animal(String name) {this.name = name;}public String getName() {return name;}public abstract void makeSound(); // 抽象方法public void eat() { // 具体方法System.out.println(name + " is eating.");}
}public class Dog extends Animal {public Dog(String name) {super(name); // 调用父类的构造方法}@Overridepublic void makeSound() { // 实现抽象方法System.out.println(getName() + " says: Bark");}
}// 使用抽象类
Dog dog = new Dog("Buddy");
dog.eat(); // 使用继承的具体方法
dog.makeSound(); // 使用实现的抽象方法

在这个示例中,Animal 是一个抽象类,它有一个抽象方法 makeSound() 和一个具体方法 eat()Dog 类继承自 Animal 并实现了 makeSound() 方法。

注意事项

  • 包含抽象方法的类必须是抽象类。
  • 抽象类可以没有抽象方法,但如果你选择让一个类成为抽象类,通常是因为它打算包含一些抽象方法。
  • 抽象类不能被实例化,但可以被继承。

总结

抽象类不一定需要包含抽象方法。它们可以包含抽象方法、具体方法、静态成员和成员变量,以提供一个通用的模板供其他类继承。抽象类的主要目的是提供一个部分实现的框架,强制其子类实现某些方法,确保它们遵循特定的协议。

七十二、抽象类能使用 final 修饰吗?

在Java中,final关键字有两层含义,它可以用来修饰类,也可以修饰方法。当final用于修饰类时,它意味着该类不能被继承,即没有其他类可以从这个类派生出子类。

使用final修饰类

  1. 不可继承:将类声明为final意味着没有其他类能够继承这个类。这通常是因为该类提供了完整的功能实现,或者设计者不希望开发者改变其行为。

  2. 类的行为固定final类的所有方法都被视为隐式地是final方法,即它们不能被子类重写。

  3. 性能优化:由于final类不能被继承,这有助于JVM和编译器进行一些优化,因为它们知道这个类不会有任何子类。

使用final修饰方法

  1. 不可重写:将方法声明为final意味着该方法不能被子类重写。

  2. 实现固定final方法确保了所有继承类使用相同的实现,这在一些特定场景下非常有用,比如实现不可变类时。

抽象类和final的组合

虽然技术上可以将final与抽象类结合使用,但这在逻辑上是矛盾的:

  • 抽象类:设计为被继承的,它包含一个或多个抽象方法,需要子类来提供实现。
  • final:设计为不可被继承的,阻止了任何继承行为。

因此,将final与抽象类结合使用是没有意义的,因为抽象类就是为了继承而设计的,而final关键字却阻止了继承。在实际编程中,通常不会看到final abstract类,因为这两个概念本质上是相反的。

示例

public abstract class FinalAbstractClass { // 逻辑上不合理的组合public final void someMethod() {// 方法体}public abstract void anotherMethod();
}// FinalAbstractClass不能被实例化
// FinalAbstractClass obj = new FinalAbstractClass(); // 编译错误// 也不能被继承,除非子类提供一个anotherMethod的实现
public class SomeConcreteClass extends FinalAbstractClass {@Overridepublic void anotherMethod() {// 方法实现}
}// 子类不能重写final方法
// @Override
// public void someMethod() {// 这将导致编译错误
// }

在这个示例中,尽管技术上可以在抽象类中包含final方法,但整个类被声明为final是没有意义的,因为它阻止了类的继承,而抽象类的目的正是为了被继承。

总结

虽然Java允许将final关键字与抽象类结合使用,但这样做在逻辑上是不合理的。抽象类设计为需要被子类继承并实现其抽象方法,而final关键字则阻止了继承。在实际编程实践中,应避免创建final抽象类,因为这违背了面向对象设计的原则。

这篇关于整理好了!2024年最常见 100 道 Java基础面试题(三十六)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/972442

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2