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抽象类和接口六连问?的更多相关文章

  1. Java面试题-基础知识

    参考文章:Java面试题-基础知识 基础能力 什么是值传递和引用传递 线程状态有哪些,它们之间是如何转换的 进程与线程的区别,进程间如何通讯,线程间如何通讯? HashMap的数据结构是什么?如何实现 ...

  2. java基础知识回顾之抽象类和接口的区别

    /* 抽象类和接口的异同点: 相同点: 都是不断向上抽取而来的. 不同点: 1,抽象类需要被继承,而且只能单继承. 接口需要被实现,而且可以多实现. 2,抽象类中可以定义抽象方法和非抽象方法,子类继承 ...

  3. 漫漫Java路1—基础知识—初涉java

    前言 主学信息安全,在编程的路上还是一个孩子,还在一步一步探索,有些东西可能是站在自己的位置思考的,很可能会出现一些啼笑皆非的错误,如果有误,还希望各位斧正. Java安装 jdk的安装 甲骨文官网选 ...

  4. Java面试题基础知识(收集)

    1.集合类:list和Set比较,各自的子类比较(Arraylist,Vector,inkedLIst,HashSet,TreeSet) List:存入元素有序,元素可以重复,允许null值得存在,主 ...

  5. Java并发(基础知识)—— Java中断机制

    上文讲解了Java线程的创建.启动以及停止,在讲到停止线程时说到了Java中断,Java中断是停止线程的一种协作机制,本文打算对Java中断机制进行详细讲解. 在网上搜索Java中断机制,发现两篇好文 ...

  6. 【JAVA】【基础知识】Java程序执行过程

    1. Java程序制作过程 使用文本编辑器进行编辑 2. 编译源文件,生成class文件(字节码文件) javac源文件路径. 3.运行程序class文件.

  7. 【Java面试】基础知识篇

    [Java面试]基础知识篇 Java基础知识总结,主要包括数据类型,string类,集合,线程,时间,正则,流,jdk5--8各个版本的新特性,等等.不足的地方,欢迎大家补充.源码分享见个人公告.Ja ...

  8. 020 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 14 变量与常量 知识总结

    020 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 14 变量与常量 知识总结 本文知识点:变量与常量 知识总结 Java中的标识符 Java中的关键字 目前常 ...

  9. 第二十八节:Java基础-进阶继承,抽象类,接口

    前言 Java基础-进阶继承,抽象类,接口 进阶继承 class Stu { int age = 1; } class Stuo extends Stu { int agee = 2; } class ...

  10. 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封装 ...

随机推荐

  1. 力扣326(java)-3的幂(简单)

    题目: 给定一个整数,写一个函数来判断它是否是 3 的幂次方.如果是,返回 true :否则,返回 false . 整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == 3x 示例 1: 输 ...

  2. HarmonyOS NEXT应用开发——Navigation开发 页面切换场景范例

    简介 在应用开发时,我们常常遇到,需要在应用内多页面跳转场景时中使用Navigation导航组件做统一的页面跳转管理,它提供了一系列属性方法来设置页面的标题栏.工具栏以及菜单栏的各种展示样式.除此之外 ...

  3. Serverless Devs 的官网是如何通过 Serverless Devs 部署的

    简介: 只有自己吃自己的狗粮,自己做的东西才不"".Serverless Devs 自发展之处到现在,已经经历了几个月的时间,在这几个月,Serverless Devs 的成长是迅 ...

  4. Soluton Set - ZJOI历年真题

    upd:不考浙江省选了.这个题解贴应该不会再更新了. upd:进省队了.再做点,再写点. ZJOI2022 Day1T1 Link&Submission. tag:组合计数,容斥 假设固定了第 ...

  5. 【zabbix】snmp监控linux主机

    1.安装net-snmp # yum install -y net-snmp 2.配置文件 /etc/snmp/snmpd.conf 添加如下内容 view systemview included . ...

  6. docker-compose 安装 mysql:5.7.31

    目录 一.新建一个启动服务的目录 二.新建文件docker-compose.yml 三.新建角本文件 init-mysql.sh 四.实使化目录和配置文件 启动服务 登陆mysql 其它操作 参考文档 ...

  7. 《Modern C++ Design》之上篇

    如下内容是在看侯捷老师翻译的<Modern C++ Design>书籍时,整理的code和摘要,用于不断地温故知新. 第一章 1. 运用 Template Template 参数实作 Po ...

  8. Docker使用docker compose部署zfile 实现在线浏览下载

    需要先安装docker-compose curl -L https://get.daocloud.io/docker/compose/releases/download/v2.2.3/docker-c ...

  9. Centos7安装openJdk17

    yum 安装 安装 EPEL 软件源:使用以下命令安装 EPEL 软件源,它包含了 OpenJDK 17 的安装包. sudo yum install epel-release sudo yum in ...

  10. 🔥 Java Solon v2.7.6 发布

    Java Solon 是什么框架? Java "新的"应用开发框架.开放原子开源基金会,孵化项目.从零开始构建(非 java-ee 架构),有灵活的接口规范与开放生态. 追求: 更 ...