澄清 Java 的接口与继承机制

接口多态(接口型多态)深度解析 + 实战示例 接口多态的核心接口类型 引用 = new 实现类(),调用方法时执行实现类的重写逻辑;核心价值解耦:调用方只依赖接口规范,不依赖具体实现;灵活:新增实现类无需修改调用逻辑,符合开闭原则;通用:同一方法可适配不同实现类(如 Android 的 OnClickListener)。典型应用Android 回调接口(点击、长按、网络请求回调);Java 集合框架(List/Set/Map 的多态调用);工具类方法参数(用接口接收任意实现类)。避坑点。 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 澄清 Java 的接口与继承机制 阅读次数1635 出处 “JAVA家”网站的Admin -------------------------------------------------------------------------------- 大多数人认为,接口的意义在于顶替多重继承。众所周知Java没有c 那样多重继承的机制,但是却能够实现多个接口。其实这样做是很牵强的,接口和继承是完全不同的东西,接口没有能力代替多重继承,也没有这个义务。接口的作用,一言以蔽之,就是标志类的类别(type of class)。把不同类型的类归于不同的接口,可以更好的管理他们。Java的精髓,我认为,是对对象的抽象,最能体现这一点的就是接口。为什么我们讨论设计模式都只针对具备了抽象能力的语言(比如c 、java、c#等),就是因为设计模式所研究的,实际上就是如何合理的去抽象。   设计模式中最基础的是工厂模式(Factory),在我最近的一个很简单的应用中,我想尽量的让我的程序能够在多个数据库间移植,当然,这涉及很多问题,单是如何兼容不同DBMS的SQL就让人头痛。我们不妨先把问题简单化,只考虑如何连接不同的数据库。   假设我有很多个类,分别是Mysql.java、SQLServer.java、Oracle.java、DB2.java,他们分别连接不同的数据库,统一返回一个Connection对象,并且都有一个close方法,用于关闭连接。只需要针对你的DBMS,选择不同的类,就可以用了,但是我的用户他会使用什么数据库?我不知道,我希望的是尽量少的修改代码,就能满足他的需要。我可以抽象如下接口:   package org.bromon.test;   public interface DB   {   java.sql.Connection openDB(String url,String user,String password);   void close();   }   这个接口只定义两个方法,没有任何有实际意义的代码,具体的代码由实作这个接口的类来给出,比如Mysql.java:   Package org.bromon.test;   import java.sql.*;   public class Mysql implements DB   {   private String url=”jdbc:mysql:localhost:3306/test”;   private String user=”root”;   private String password=””;   private Connection conn;   public Connection openDB(url,user,password)   {     //连接数据库的代码   }   public void close()   {     //关闭数据库   }   }   类似的当然还有Oracle.java等等,接口DB给这些类归了个类,在应用程序中我们这样定义对象:   org.bromon.test.DB myDB;   使用myDB来操作数据库,就可以不用管实际上我所使用的是哪个类,这就是所谓的“开-闭”原则。但是问题在于接口是不能实例化的,myDB=new DB(),这样的代码是绝对错误的,我们只能myDB=new Mysql()或者myDB=new Oracle()。麻烦了,我还是需要指定具体实例化的是哪个类,用了接口跟没用一样。所以我们需要一个工厂:   package org.bromon.test;   public class DBFactory   {   public static DB Connection getConn()   {     Return(new Mysql());   }   }   所以实例化的代码变成:myDB=DBFactory.getConn();这就是23种模式中最基础的普通工厂(Factory),工厂类负责具体实例化哪个类,而其他的程序逻辑都是针对DB这个接口进行操作,这就是“针对接口编程”。责任都被推卸给工厂类了,当然你也可以继续定义工厂接口,继续把责任上抛,这就演变成抽象工厂(Abstract Factory)。   整个过程中接口不负责任何具体操作,其他的程序要连接数据库的话,只需要构造一个DB对象,而不管工厂类如何变化。这就是接口的意义----抽象。继承的概念不用多说,很好理解。为什么要继承呢?因为你想重用代码?这绝对不是理由,继承的意义也在于抽象,而不是代码重用。如果对象A有一个run()方法,对象B也想有这个方法,所以有人就Class B extends A。这是不经大脑的做法。如果在B中实例化一个A,调用A的Run()方法,是不是可以达到同样的目的?如下:   Class B   {   A a=new A();   a.run();   }   这就是利用类的聚合来重用代码,是委派模式的雏形。那么继承的意义何在?其实这是历史原因造成的,请一定注意,继承的本意在于抽象,而非代码重用(虽然继承也有这个作用),这是初涉Java时最容易犯也是最严重的错误之一,在编程的过程中这个错误所造成的阴影,也许会对你的编程生涯造成严重的影响。什么时候应该使用继承?只在抽象类中使用,其他情况下尽量不使用。抽象类也是不能实例化的,它仅仅提供一个模版而已,这就很能说明问题。
Java编程语言的关键特性与实践解析 本文通过解析Java编程语言的关键特性,如类和接口的继承关系、编译时的错误检测、静态导入的正确使用,以及Java对封装和内存管理的支持等方面,旨在帮助读者深化对Java语言机制的理解,提高编程实践中的问题解决能力。 阅读详情

相关推荐

pytorch中dataloader的num_workers参数

结论速递 在Windows系统中,num_workers参数建议设为0,在Linux系统则不需担心。 1 问题描述 在之前的任务超大图上的节点表征学习中,使用PyG库用于数据加载的DataLoader,ClusterLoader等类时,会涉及到参数num_workers。在不同系统环境试验该参数的设定值时,会出现不同的结果 colab(Linux),设为12 有warning message,提示num_workers参数设置不合理,不影响继续运行 /usr/local/lib/python3.7/di

qq_40990057的博客 1万+

澄清Java(接口与继承)

设计模式中最基础的是工厂模式(Factory),在我最近的一个很简单的应用中,我想尽量的让我的程序能够在多个数据库间移植,当然,这涉及很多问题,单是如何兼容不同DBMS的SQL就让人头痛。我们不妨先把问题简单化,只考虑如何连接不同的数据库。    假设我有很多个类,分别是Mysql.java、SQLServer.java、Oracle.java、DB2.java,他们分别连接不同的数据库,统一

seawavecau的专栏 565

mysql数据库中使用存储过程带来的好处和示例(存储过程的概念、定义、作用等详解)

MySQL的存储过程(Stored Procedure)是一组SQL语句集合。用户通过指定的存储过程名和参数来调用并执行它。存储过程可以在数据库中预编译并存储,这样它们可以被多次调用而无需重新编写或解析SQL语句。 存储过程将复杂的SQL逻辑封装在一个可重用的单元中。多次调用存储过程,而不需要重复编写相同的SQL代码。- 通过封装,可以隐藏复杂的SQL逻辑,只向用户或应用程序提供简单的接口。MySQL的存储过程和编程语言中的函数的原理和目标是一致的:封装可重用的代码逻辑并提高代码的可维护性和可重用性。

weixin_70208651的博客 1719

解析Java中Thread与Runnable的区别

根据Java的文档,如果需要执行一个简单的任务,实现Runnable接口比继承Thread类更好。这是因为Java只允许单继承,如果继承Thread类,那么就不能再继承其他类。而实现Runnable接口可以避免这个问题。此外,实现Runnable接口还可以更好地支持线程池,因为线程池只能执行实现Runnable或Callable接口的任务。另一方面,如果需要进行复杂的线程操作,例如需要重写Thread类的一些方法,那么继承Thread类可能更合适。综上所述:1.Runnable需要实现其接口。

m0_74131274的博客 710

数字频率计设计中的常见误区:从VHDL代码到硬件实现的避坑指南

本文深入探讨了数字频率计从VHDL代码到FPGA硬件实现过程中的关键误区与解决方案。重点分析了闸门时间生成的精度与资源平衡、控制时序设计中的竞争冒险规避,以及如何利用EDA工具进行综合、时序约束与调试,确保设计稳定可靠。文章为开发者提供了从仿真成功到硬件可用的实战避坑指南。

spark7igniter的博客 213

超详细 Git创建仓库及上传项目至Github操作(Windows系统)

文章目录前言一、Git下载及安装二、创建代码仓库1.配置身份2.创建本地仓库3.提交本地代码三、使用Git上传代码至Github1.创建ssh keys2.在Github中新建仓库3.关联本地仓库与Github仓库4.推送代码至Github仓库总结 前言 本文对于Windows系统上git的安装及基本使用方法进行简单介绍,并介绍如何使用git将仓库中的项目上传至个人的Github中去。内容参考《第一行代码》以及一些博客。 本文适合新手阅读哦~ 一、Git下载及安装 打开网站 git下载 下载安装包(直接

lijianyi0219的博客 2万+

Java线程创建的两种方式:继承Thread vs 实现Runnable,到底该怎么选?

选择场景推荐方式默认选择实现Runnable需要继承其他类实现Runnable(必须选这个)需要返回值简单的演示代码继承Thread或Lambda配合线程池实现Runnable / Callable核心原则组合优于继承—— 将任务(Runnable)和线程(Thread)分离,是更灵活、更面向对象的设计。一句话记忆能实现接口就不继承,能传Lambda就不写匿名类,能交给线程池就不手动new Thread。

cheng13246的博客 374

HCLR-Net: 混合对比学习正则化与局部随机扰动用于水下图像增强

独特贡献在于开发了一种处理负样本的新策略,既保留了负样本的统计特性,又防止网络过度剖析这些样本中的特征信息。通过根据每个通道特征的重要性对模型进行加权,我们可以增强富含上下文信息的通道,从而获得更准确、更详细的特征表示。AHA 模块利用垂直方向上的 Avgpool 和水平方向上的 Maxpool 来捕捉远程依赖关系和准确的位置信息,从而有效确定不同方向上的特征退化。对比学习策略通常旨在最小化正样本之间的欧氏距离,使预测图像更接近理想图像,同时最大化负样本与预测图像之间的距离,使它们进一步远离非理想表征。

G-Howe的博客 1459

抽象类 vs 接口:一篇让面试官闭嘴的深度解析

但是仍然需要实现Cloneable接口才可以使用clone方法,这是JVM的硬性规定(JVM内部C++完成的,java层面感知不到),注意使用clone方法时要进行类型转换(因为默认是Object类型),Object类型下面会说。Java里面除了Object类,所有的类都是存在继承关系的。在Java中,类和类之间是单继承的,一个类只能有一个父类,即Java中不支持多继承,但是一个类可以实现多个接口。(4)对于接口的类来说,没什么可以继承的,没有重用的内容,反而严格按照接口提供的抽象方法在子类进行重写。

2301_79836318的博客 714

Cadence Allegro16.6怎么导出器件引脚信息的报告

当我们需要用到器件的引脚相关信息时,可以利用allegro中的reports这个功能导出器件的相关信息。下面是具体的操作步骤。

suyucheng66的博客 5767

Java接入DeepSeek大模型:从零实现流式对话+多轮会话管理(完整项目实战)

emitter.completeWithError(new RuntimeException("连接DeepSeek服务超时"));private static final Set<String> BLACK_WORDS = Set.of("暴力", "色情", "政治敏感");emitter.onCompletion(() -> log.info("SSE连接完成"));emitter.onTimeout(() -> log.warn("SSE连接超时"));// 每个路由基础连接数。

wjianwei666的专栏 933

接口&匿名内部类

和外部类的成员变量、成员方法同级,是 Java 中一种特殊的类结构。

2201_75400756的博客 1017

【第一章】核心思维:那个在此刻“消失”的 CPU

摘要:RTOS本质是"有状态的抢占"而非"多任务",单核MCU通过时间片分时复用实现任务切换。裸机编程的线性思维在RTOS中不再适用,开发者需接受代码随时被打断的现实。RTOS通过保存/恢复CPU寄存器组(上下文)实现任务切换,每个任务拥有独立栈空间。非原子操作(如全局变量自增)会导致竞态条件,必须使用临界区或互斥锁保护。RTOS编程需要建立并发思维,关注代码原子性、可重入性和栈空间分配。

一路往蓝-Anbo 的博客 106

基础测试查漏补缺

昨天基础测试结果出来了,成绩不如人意,该好好的改错,查漏补缺。 以下是测试改错: 1.继承父类的子类不可以调用父类的私有属性,私有属性其他类不可调用。 2.super代指父类对象,可以调用父类的属性方法。 3.this代指本身,可以调用本类的构造方法。 4.加载类时:静态属性->静态块加载并执行->静态方法加载    创建对象时: 非静态的属性->代码快加载并执行->普通方法加载 5

1024

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java多态:OOP的灵活之钥

多态”一词源自希腊语,“poly”意为“多种”,“morph”意为“形态”。在编程中,多态是指同一个接口或方法调用,在不同对象上表现出不同的行为。简单来说,多态意味着父类型的变量可以引用子类型的对象。即:一个名字,多种实现。通过方法重写(Override)和父类引用指向子类对象实现。·编译时多态(静态多态):通过方法重载(Overload)实现(但通常“多态”特指运行时多态)。

jx1205xx的博客 1003

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java面向对象问题——全

1.什么是泛型? 泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法 时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化, 类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/ 调用时传入具体的类型(类型实参)。 public class GenericTest { public static void main(String[] args) { /*List list = new ArrayList(

ChenBinBini的博客 519

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java常见面试题

加油

qq_44865726的博客 163

Java面试题及解析(判断题)

*答案:**正确。

m0_67401499的博客 898

Java知识点整理

关于Java基础的一些知识

weixin_36651507的博客 1492

python基础08(java和python的区别)

测试Python

solicitous的专栏 966

学习java过程中的理解

子类的静态方法不能被父类重写,静态方法只能被隐藏(Hide),而不能被重写。这是静态方法和实例方法的根本区别。重要概念:静态变量不被继承,而是被共享。静态方法不能是抽象的。

weixin_43186812的博客 52
上一篇: 基于java的图片文件格式转换和线性缩放
下一篇: 使用Java客户端类调用c# WebService和xml rpc server
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值