【Java面试题-基础知识02】Java抽象类和接口六连问?
1、抽象类和接口分别是什么?
- 抽象类是一种类,可以包含抽象方法和非抽象方法,抽象方法是没有具体实现的方法,需要在子类中被具体实现。
- 接口是一种完全抽象的类,其中的所有方法都是抽象方法,没有方法体,它只是定义了一组方法的契约。
2、接口中一定不可以有实现方法吗?
不一定,Java 8 引入了默认方法(Default Methods)的概念,允许在接口中包含具有默认实现的方法。
public interface MyInterface {
// 抽象方法
void abstractMethod();
// 默认方法
default void defaultMethod() {
System.out.println("This is a default method in MyInterface.");
}
}
3、抽象类和接口的使用场景?
- 抽象类适合于那些有一定相似功能的类,其中一些方法需要在子类中实现,而其他方法已经实现了一部分,可以被子类直接继承和复用。
// 抽象类 Animal
abstract class Animal {
private String name; public Animal(String name) {
this.name = name;
} // 抽象方法,需要在子类中实现
public abstract void makeSound(); // 具体方法,被子类继承和复用
public void eat() {
System.out.println(name + " is eating.");
}
} // 子类 Dog 继承自抽象类 Animal
class Dog extends Animal {
public Dog(String name) {
super(name);
} // 实现抽象方法
@Override
public void makeSound() {
System.out.println("Dog " + super.name + " barks.");
}
} // 子类 Cat 继承自抽象类 Animal
class Cat extends Animal {
public Cat(String name) {
super(name);
} // 实现抽象方法
@Override
public void makeSound() {
System.out.println("Cat " + super.name + " meows.");
}
} public class Main {
public static void main(String[] args) {
Dog dog = new Dog("Buddy");
dog.makeSound(); // Output: Dog Buddy barks.
dog.eat(); // Output: Buddy is eating. Cat cat = new Cat("Whiskers");
cat.makeSound(); // Output: Cat Whiskers meows.
cat.eat(); // Output: Whiskers is eating.
}
}
- 接口适合于定义类的行为,而不关心类的内部数据状态。如果多个不同类具有相同的行为,但是其内部实现不同,可以通过接口来实现这种行为的统一。
// 定义接口 Animal
interface Animal {
void makeSound();
} // 实现接口 Animal 的类 Dog
class Dog implements Animal {
@Override
public void makeSound() {
System.out.println("Dog barks.");
}
} // 实现接口 Animal 的类 Cat
class Cat implements Animal {
@Override
public void makeSound() {
System.out.println("Cat meows.");
}
} public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
dog.makeSound(); // Output: Dog barks. Animal cat = new Cat();
cat.makeSound(); // Output: Cat meows.
}
}
4、抽象类可以直接实例化吗?
抽象类不能被直接实例化(不可以 Animal dog =new Animal()),在上面的示例中,抽象类 Animal 不能直接被实例化,但是可以创建其子类 Dog 和 Cat 的实例来使用:
Animal dog = new Dog("Buddy");
Animal cat = new Cat("Whiskers");
5、说一个使用抽象类实现的设计模式?
模板方法模式,代码如下:
// 步骤 1:创建一个抽象类,定义算法的骨架。
abstract class Beverage { // 模板方法,定义了算法的骨架
public final void prepareBeverage() {
boilWater();
brew();
pourInCup();
if (customerWantsCondiments()) {
addCondiments();
}
} // 具体步骤由子类实现
abstract void brew(); abstract void addCondiments(); // 公共步骤,已经实现
void boilWater() {
System.out.println("Boiling water");
} void pourInCup() {
System.out.println("Pouring into cup");
} // 钩子方法,子类可以覆盖它以提供特定实现
boolean customerWantsCondiments() {
return true;
}
} // 步骤 2:创建具体子类,实现抽象类中的抽象方法。
class Coffee extends Beverage { @Override
void brew() {
System.out.println("Dripping Coffee through filter");
} @Override
void addCondiments() {
System.out.println("Adding Sugar and Milk");
} // 通过重写钩子方法,可以选择不添加调料
@Override
boolean customerWantsCondiments() {
// 重写钩子方法,这里返回false表示不添加调料
return false;
}
} class Tea extends Beverage { @Override
void brew() {
System.out.println("Steeping the tea");
} @Override
void addCondiments() {
System.out.println("Adding Lemon");
}
} // 步骤 3:使用模板方法创建对象并调用其方法。
public class TemplatePatternDemo { public static void main(String[] args) {
Beverage coffee = new Coffee();
System.out.println("Making coffee...");
coffee.prepareBeverage(); System.out.println("\n"); Beverage tea = new Tea();
System.out.println("Making tea...");
tea.prepareBeverage();
}
}
6、说一个使用接口实现的设计模式?
策略模式,代码如下:
// 步骤 1:创建一个接口,定义算法的统一接口。
interface DiscountStrategy {
double applyDiscount(double originalPrice);
} // 步骤 2:创建具体策略类,实现接口中定义的算法。
class ChristmasDiscountStrategy implements DiscountStrategy {
@Override
public double applyDiscount(double originalPrice) {
return originalPrice * 0.8; // 圣诞节打八折
}
} class BlackFridayDiscountStrategy implements DiscountStrategy {
@Override
public double applyDiscount(double originalPrice) {
return originalPrice * 0.7; // 黑色星期五打七折
}
} // 步骤 3:创建使用策略的客户类。
class ShoppingCart {
private DiscountStrategy discountStrategy; public ShoppingCart(DiscountStrategy discountStrategy) {
this.discountStrategy = discountStrategy;
} public double checkout(double totalPrice) {
// 应用促销策略
double finalPrice = discountStrategy.applyDiscount(totalPrice);
System.out.println("Final price after discount: " + finalPrice);
return finalPrice;
}
} // 步骤 4:使用策略模式进行测试。
public class StrategyPatternDemo {
public static void main(String[] args) {
// 圣诞节促销
ShoppingCart christmasCart = new ShoppingCart(new ChristmasDiscountStrategy());
christmasCart.checkout(100); // 应付 80 System.out.println(); // 黑色星期五促销
ShoppingCart blackFridayCart = new ShoppingCart(new BlackFridayDiscountStrategy());
blackFridayCart.checkout(100); // 应付 70
}
}

【Java面试题-基础知识02】Java抽象类和接口六连问?的更多相关文章
- Java面试题-基础知识
参考文章:Java面试题-基础知识 基础能力 什么是值传递和引用传递 线程状态有哪些,它们之间是如何转换的 进程与线程的区别,进程间如何通讯,线程间如何通讯? HashMap的数据结构是什么?如何实现 ...
- java基础知识回顾之抽象类和接口的区别
/* 抽象类和接口的异同点: 相同点: 都是不断向上抽取而来的. 不同点: 1,抽象类需要被继承,而且只能单继承. 接口需要被实现,而且可以多实现. 2,抽象类中可以定义抽象方法和非抽象方法,子类继承 ...
- 漫漫Java路1—基础知识—初涉java
前言 主学信息安全,在编程的路上还是一个孩子,还在一步一步探索,有些东西可能是站在自己的位置思考的,很可能会出现一些啼笑皆非的错误,如果有误,还希望各位斧正. Java安装 jdk的安装 甲骨文官网选 ...
- Java面试题基础知识(收集)
1.集合类:list和Set比较,各自的子类比较(Arraylist,Vector,inkedLIst,HashSet,TreeSet) List:存入元素有序,元素可以重复,允许null值得存在,主 ...
- Java并发(基础知识)—— Java中断机制
上文讲解了Java线程的创建.启动以及停止,在讲到停止线程时说到了Java中断,Java中断是停止线程的一种协作机制,本文打算对Java中断机制进行详细讲解. 在网上搜索Java中断机制,发现两篇好文 ...
- 【JAVA】【基础知识】Java程序执行过程
1. Java程序制作过程 使用文本编辑器进行编辑 2. 编译源文件,生成class文件(字节码文件) javac源文件路径. 3.运行程序class文件.
- 【Java面试】基础知识篇
[Java面试]基础知识篇 Java基础知识总结,主要包括数据类型,string类,集合,线程,时间,正则,流,jdk5--8各个版本的新特性,等等.不足的地方,欢迎大家补充.源码分享见个人公告.Ja ...
- 020 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 14 变量与常量 知识总结
020 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 14 变量与常量 知识总结 本文知识点:变量与常量 知识总结 Java中的标识符 Java中的关键字 目前常 ...
- 第二十八节:Java基础-进阶继承,抽象类,接口
前言 Java基础-进阶继承,抽象类,接口 进阶继承 class Stu { int age = 1; } class Stuo extends Stu { int agee = 2; } class ...
- 094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 04 static关键字(续)
094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
随机推荐
- Java单元测试技巧之PowerMock
简介: 高德的技术大佬向老师在谈论方法论时说到:"复杂的问题要简单化,简单的问题要深入化." 这句话让我感触颇深,这何尝不是一套编写代码的方法--把一个复杂逻辑拆分为许多简单逻辑, ...
- 大型 Web 应用插件化架构探索
简介: 随着 Web 技术的逐渐成熟,越来越多的应用架构趋向于复杂,例如阿里云等巨型控制台项目,每个产品下都有各自的团队来负责维护和迭代.不论是维护还是发布以及管控成本都随着业务体量的增长而逐渐不可控 ...
- IphoneX(10) 重启/关机, 强制重启/关机
正常关机是同时长按 音量+ 和 右侧电源键,屏幕出现滑动按钮进行关机. 注意截图是同时短按 音量+ 和 右侧电源键. 强制关机是按照顺序按三个键:音量+ 音量- 长按右侧键 Other:苹果X怎 ...
- 记 dotnet 8.0.4 修复的 WPF 的触摸模块安全问题
本文记录 dotnet 8.0.4 版本修复的 WPF 的触摸模块安全问题,此问题影响所有的 .NET 版本,修复方法是更新 SDK 和运行时 宣布安全漏洞地址: https://github.com ...
- 数据可视化之pyecharts模块
1.简介 pyecharts 是一个用于生成 Echarts 图表的类库. Echarts 是百度开源的一个数据可视化 JS 库.主要用于数据可视化. # 安装 # 安装v1版本之上的有一些报错 py ...
- S/4 HANA 中的 Email Template
电子邮件是非常常见的业务需求. SAP 了解这一点,并在 S/4 HANA(cloud和on premise)中引入了非常有趣的功能--Email Template.它将CDS视图和HTML模板结合了 ...
- oracle RDBMS Kernel Executable 占用内存过高
oracle RDBMS Kernel Executable 占用内存过高 参考:https://www.cnblogs.com/markkang/archive/2019/11/25/1192540 ...
- 大营销抽奖系统,DDD开发要如何建模?
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 大家好,我是技术UP主小傅哥. 经过5.1假期的一顿框框输出,终于完成了<大营销项目 ...
- ansible(2)--ansible的安装与配置文件管理
目录 1 ansible的安装 1.1 yum安装 1.2 pip安装 2 ansible相关文件 2.1 ansible配置文件 2.2 ansible配置文件的优先级 2.3 ansible的主机 ...
- iceoryx源码阅读(一)——全局概览
一.什么是iceoryx iceoryx是一套基于共享内存实现的进程间通信组件. 二.源码结构 iceoryx源码包括若干工程,整理如下表所示: 下图展示了主要项目之间的依赖(FROM:iceoryx ...