第二十条:与抽象类相比,优先选择接口

news2025/1/19 8:20:38

要定义多种实现的类型:JAVA有两种机制:接口和抽象类。这两种机制都支持为某些实例方法提供实现,但二者有个重要的区别:要实现由抽象类定义的类型,这个类必须是抽象类的子类。因为Java只允许单继承,对抽象类的这种限制严重制约了将其用于类型的定义。而接口就宽松很多,只要定义了所有必须的方法,任何类都可以实现。

在正式介绍之前普及两个知识点:缺省方法和抽象方法。

这两个方法是相反的用途:缺省是为了避免子类重写其方法。抽象方法是为了让子类重写方法。

缺省方法(default)案例:

public interface SoyaMilk2 {



	default void select() {
		System.out.println("选择");
	}
}

子类:

public class RedInter implements SoyaMilk2 {

}

抽象方法案例:

public interface SoyaMilk2 {
	abstract void addCondiments();

}

子类:

接口优先于抽象类优点:

1.很容易改造现有的类使其实现一个新的接口。

2.接口是定义minxin(混合类型)的理想选择。

3.接口允许构建非层次结构的类型框架。

案例:

public interface Singer {
    //唱歌
    AudioClip sing(Song s);
}

public interface SongWriter {
    //作歌
    Song compose(boolean hit);
}
public intreface SingerSongWriter extends Singer, SongWriter {
    //弹奏
    AudioClip strum();
    //激情表演
    void actSensitive();
}

抽象类:

Singer.java
public abstract class Singer {
    //唱歌
    public abstract AudioClip sing(Song s);
}

SongWriter.java
public abstract class SongWriter {
    //作歌
    public abstract Song compose(boolean hit);
}

SingerSongWriter.java
//在设计的时候感觉很不好设计。因为继承只能继承自一个类,那势必其他的方法需要重新声明
public abstract class SingerSongWriter extends SongWriter {
    //唱歌
    public abstract AudioClip sing(Song s);

    //弹奏
    public abstract AudioClip strum();
    //激情表演
    public abstract void actSensitive();
}

在引入抽象骨架概念之前,先分别看下接口和抽象类的案例实现:

(1)接口案例:

定义接口:

public interface IPeple {

	void drink();
	void eat();
	void ethnicGroup();

}

分别定义子类:

public class AsiaPeple implements IPeple {
	@Override
	public void drink() {
		System.out.println("人都会喝水");
	}

	@Override
	public void eat() {
		System.out.println("人都会吃饭");
	}

	@Override
	public void ethnicGroup() {
		System.out.println("亚洲人大多数是黄种人");
	}
}
public class AmericanPeple implements IPeple {
	@Override
	public void drink() {
		System.out.println("人都会喝水");
	}

	@Override
	public void eat() {
		System.out.println("人都会吃饭");
	}

	@Override
	public void ethnicGroup() {
		System.out.println("美洲人大多数是白种人");
	}
}

问题:

drink和eat方法代码重复性很高,需要改造。

(2)抽象类案例:

定义抽象类:

public abstract class AbsPeple {
	void drink(){
		System.out.println("人都会喝水");
	}
	void eat() {
		System.out.println("人都会吃饭");
	}
	abstract void ethnicGroup();
}

分别定义子类:

public class AmericanPeple extends AbsPeple {

	@Override
	void ethnicGroup() {
		System.out.println("美洲人大多数是白种人");
	}
}

public class AsiaPeple extends AbsPeple{
	@Override
	void ethnicGroup() {
		System.out.println("亚洲人大多数是黄种人");
	}

	public static void main(String[] args) {
		AsiaPeple asiaPeple = new AsiaPeple();
		asiaPeple.eat();
		asiaPeple.drink();
		asiaPeple.ethnicGroup();
		AmericanPeple americanPeple = new AmericanPeple();
		americanPeple.eat();
		americanPeple.drink();
		americanPeple.ethnicGroup();
		System.out.println(asiaPeple);
		System.out.println(americanPeple);
	}
}

结果打印:

人都会吃饭
人都会喝水
亚洲人大多数是黄种人
人都会吃饭
人都会喝水
美洲人大多数是白种人
com.example.exceldemo.abstact.entity.AsiaPeple@7699a589
com.example.exceldemo.abstact.entity.AmericanPeple@58372a00

缺点:一旦一个类继承了抽象类AbsPeple,那么它就无法继承其它类。而且我们也知道,继承实现有很多问题,太多的继承会造成代码耦合性问题,不利于以后的维护和升级。抽象骨架氤氲而生。

(3)抽象骨架概念:(抽象类继承接口,不要求重写接口中缺省、抽象方法)

可以将接口和抽象类的优点结合到一起。其中,接口用来定义类型,可能还会提供一些默认的方法,而骨架实现类负责在基本接口方法之上实现其余的非基本接口方法(ethnicGroup()方法)。扩展骨架实现类可以省去实现接口需要的大部分工作。这就是模板方法【设计模式】(中级面试很多面试官喜欢问设计模式)

定义抽象骨架:

public abstract class AbsPeple implements IPeple{
	@Override
	public void drink() {
		System.out.println("人都要喝水");
	}

	@Override
	public void eat() {
		System.out.println("人都要吃饭");
	}
}

定义私有类及成员(AsiaPeple重写接口统一方法,成员变量获取单独的重写方法):

public class AsiaPeple implements IPeple {

	private AsiaPepleIpml asiaPepleIpml = new AsiaPepleIpml();
	private static class AsiaPepleIpml extends AbsPeple {

		@Override
		public void ethnicGroup() {
			System.out.println("亚洲人大多数都是黄种人");
		}
	}





	public static void main(String[] args) {
		AsiaPeple asiaPeple = new AsiaPeple();
		asiaPeple.eat();
		asiaPeple.drink();
		asiaPeple.asiaPepleIpml.ethnicGroup();

	}

	@Override
	public void drink() {
		asiaPepleIpml.drink();
	}

	@Override
	public void eat() {
		asiaPepleIpml.eat();
	}

	@Override
	public void ethnicGroup() {
		throw new UnsupportedOperationException("不重新方法");
	}
}

打印结果:

人都要吃饭
人都要喝水
亚洲人大多数都是黄种人

Process finished with exit code 0

AsiaPeple类 可以实现多个接口和定义多个抽象骨架实现类,使得AsiaPeple类非常非常灵活多变。

骨架实现类的美妙在于,他们提供了抽象类的所有实现帮助,又不存在将抽象类用于类型定义时所面临的严格限制。接口本身存在的任何默认方法,对于这个类还是有帮助的。此外,仍然可以利用骨架实现来帮助实现者完成任务:实现该接口的类可以引入一个私有的、扩展了骨架实现类的内部类,并包含一个这个内部类实例,然后将对接口方法的调用转发给这个实例。这种技术被称为模拟多重继承。

因为骨架实现是为了继承而设计的,好的文档在骨架实现中是绝对必要的,无论它是由接口上的默认方法组成还是单独的抽象类。

总而言之,要定义支持实现的类型,接口通常是最佳选择如果导出一个不是很简单的接口,请务必考虑配合提供一个骨架实现。在可能的情况下,应该通过接口上的默认方法来提供骨架的实现,以便该接口的所有实现者都可以使用。即便如此,接口上的限制常会使得抽象类形式成为骨架实现的不二之选。

所有文章无条件开放,顺手点个赞不为过吧!

                                                               

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1894722.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2025年中国国际新能源汽车技术零部件及服务展览会

中国国际新能源汽车技术零部件及服务展览会,从设计到制造、从使用到服务,精准“链”接新能源汽车全产业链的技术供应商和汽车制造商,专业面向新能源造车供应链的行业盛会。2024展会回顾:在展会的3天里,有62家车企核心供…

如何自动筛选螺丝不良品?

四角螺丝是一种特殊设计的螺丝,其螺纹头部呈四个平行的角状结构,与传统的六角螺丝相比具有独特的外观和功能。这种设计使得四角螺丝在安装和拆卸时更容易使用,并提供了更好的扭矩传递效率。四角螺丝头部呈现四个平行的角,与常见的…

Web前端开发——HTML快速入门

HTML:控制网页的结构CSS:控制网页的表现 一、什么是HTML、CSS (1)HTML (HyperText Markup Languaqe:超文本标记语言) 超文本:超越了文本的限制,比普通文本更强大。除了…

上海计算机考研炸了,这所学校慎报!上海大学计算机考研考情分析!

上海大学(Shanghai University),简称“上大”,是上海市属、国家“211工程”重点建设的综合性大学,教育部与上海市人民政府共建高校,国防科技工业局与上海市人民政府共建高校,国家“双一流”世界…

羊大师:羊奶养生,解锁健康之道的新密码

在探寻健康与养生的旅途中,我们总渴望找到那把开启健康之门的钥匙。而今,羊奶以其独特的营养价值和健康益处,正悄然成为那把解锁健康之道的新密码。 羊奶,自古以来便是自然赋予的珍贵礼物。它富含优质蛋白、多种维生素及矿物质&am…

【机器学习】Google开源大模型Gemma2:原理、微调训练及推理部署实战

目录 一、引言 二、模型简介 2.1 Gemma2概述 2.2 Gemma2 模型架构 三、训练与推理 3.1 Gemma2 模型训练 3.1.1 下载基座模型 3.1.2 导入依赖库 3.1.3 量化配置 3.1.4 分词器和模型实例化 3.1.5 引入PEFT进行LORA配置 3.1.6 样本数据清洗与加载 3.1.7 模型训练与保…

ERROR: No matching distribution found for numpy

1.原因: 出现这两行英文是因为原先输入pip install numpy的方式不安全,不被信任所以无法下载。 2.解决方法: 改成以下命令执行: pip install numpy -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun…

部署LVS-DR 群集

1 LVS-DR 集群 LVS-DR (Linux Virtual Server Director Server ) 工作模式, 是生产环境中最常用的一种工作模式 1.1:LVS-DR工作原理 LVS-DR 模式, Director Server 作为群集的访问入口, 不作为网关使用,…

Spring Boot 的机场投诉管理平台-计算机毕业设计源码22030

摘要 随着航空运输业的迅速发展,机场的客流量不断增加,旅客对机场服务的质量和效率也提出了更高的要求。为了提高机场的服务质量,及时处理旅客的投诉,建立一个高效、便捷的机场投诉管理平台显得尤为重要。 本项目旨在设计与实现一…

BeanUtils拷贝List数据

工具类: package com.ssdl.baize.pub;import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; import java.util.function.Supplier; import org.springframework.beans.BeanUtils;public class BeanConvertUti…

firewalld(8) policies

简介 前面的文章中我们介绍了firewalld的一些基本配置以及NAT的相关配置。在前面的配置中,我们所有的策略都是与zone相关的,例如配置的rich rule,--direct,以及NAT,并且这些配置都是数据包进入zone或者从zone发出时设置的策略。 我们在介绍…

理解神经网络的通道数

理解神经网络的通道数 1. 神经网络的通道数2. 输出的宽度和长度3. 理解神经网络的通道数3.1 都是错误的图片惹的祸3.1.1 没错但是看不懂的图3.1.2 开玩笑的错图3.1.3 给人误解的图 3.2 我或许理解对的通道数3.2.1 动图演示 1. 神经网络的通道数 半路出嫁到算法岗,额…

一分钟教你设置代理服务器的IP地址

许多人购买完代理IP却不会使用,我们来学习一下如何手把手地设置代理服务器的IP地址。无论是为了访问受限网站还是保护隐私,设置代理IP都是一个非常实用的技能。让我们一起来看看怎么做吧! 设置代理服务器的IP地址步骤 1. 选择代理服务提供商…

中国IDC圈探访北京•光子1号金融算力中心

今天,“AI”、“大模型”是最炙手可热的话题,全球有海量人群在工作生活中使用大模型,大模型产品涉及多模态,应用范围已涵盖电商、传媒、金融、短视频、制造等众多行业。 而回看2003年的互联网记忆, “上网”“在线”是…

数据库设计规范(DOC文件)

1 编写目的 2 数据库策略 2.1 数据库对象长度策略 2.2 数据完整性策略 2.3 规范化设计与性能之间的权衡策略 2.4 字段类型的定义与使用策略 3 命名规范 3.1 数据库命名规则 3.2 数据库对象命名的一般原则 3.3 表空间(Tablespace)命名规则 3.4 表(Table)命名规则 3.5…

Pandas数据清洗实战:精准捕捉并优雅过滤异常值,让数据分析更可靠!

1.describe():查看每一列的描述性统计量 # 导包 import numpy as np import pandas as pddf pd.DataFrame(datanp.random.randint(0,10,size(5,3)),indexlist("ABCDE"),columns["Python","NumPy","Pandas"]) dfdf.descri…

【Maven】使用idea将sdk打包部署到本地仓库

RT 如题。近日在接入外部支付的sdk,突然有点忘了如何引入外部sdk到自己的maven仓库中。就想着记录一下吧 改进,使用IDEA 在这里记录的同时,顺便给大家讲一下,如何使用idea引入这个外部SDK。 正常我们百度的话,它会提…

正弦波与单位圆关系的可视化 包括源码

正弦波与单位圆关系的可视化 包括源码 flyfish 正弦波与单位圆的关系 正弦波可以通过单位圆上的点在直线(通常是 y 轴)上的投影来表示。具体来说,考虑一个单位圆,其半径为 1,圆心在原点。我们可以通过旋转一个角度 …

加密与安全_ Jasypt (Java Simplified Encryption)不完全指北

文章目录 官网功能概述Code附 官网 http://www.jasypt.org/ 功能概述 Jasypt 是一个 Java 库,它允许开发人员以最小的努力添加基本的加密功能,并且不需要深入了解密码学的工作原理。 高安全性、基于标准的加密技术,适用于单向和双向加密。…

VBA中类的解读及应用第十三讲:限制复选选择,窗体模块的搭建

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。 类,是非常抽象的,更具研究的价值。随着我们学习、应用VBA的深入&#xff0…