在Java中模拟多重继承--扩展多个类的技巧

Java为什么禁止类多重继承?接口default方法与组合模式的工程解法 多重继承是面向对象编程中关于类间关系的核心概念,其本质是在单一类型中融合多个父类的行为与状态。然而该机制易引发菱形继承、方法歧义和维护复杂度飙升等原理性问题。Java通过严格限制类单继承、强化接口契约能力(如default method、private interface method)并倡导组合优于继承的设计哲学,在保障类型安全与可预测性的前提下,实现了更灵活、可测试、易演化的多重能力组装。这一技术路径广泛应用于Spring Boot微服务、高并发风控建模及领域驱动设计中,成为现代Java工程实践的底层范 阅读详情

摘要:虽然Java不允许多重继承,但是有些情况却允许其使用。本文将阐述在一个Web应用中模拟多重继承的技术。

在一般的开发中,Java的单继承限制一般不会引起什么问题。实际上,需要使用多重继承往往意味着糟糕的设计。然而还是存在一些情况,程序员们希望能够继承多个类。虽然Java不允许继承多个类,但是有些技巧能够模拟多重继承。

我在Swing应用程序和Web应用中都使用过这个技巧。Swing应用打包并部署服务到应用服务器上。这种情况下,因为我希望在不同组件间拖放对象而这些GUI组件共享同一个拖放方法,这样的话,所有GUI组件需要扩展两个类:GUI组件本身(JTree或JList)和通用的拖放类(drag-and-drop class)。本文中介绍的技术简化了拖放类的实现。

为了更好的阐述Java中多重继承的技术,让我们先来如何在一个Web应用中使用它。在这个Web应用中,Servlet类和其他类需要被扩展。我的这个应用很简单,是一个基于文本的信息传递系统,能够通过移动电话、PDA或者其他网络终端设备传递信息给另一个移动电话。
jw-1024-multiple.jpg
如上图所示,这个系统的核心是一个能够从客户端接受信息然后传递给移动电话的服务。为了简化客户端开发,我写了一个MessageClient类来包含所有用于与服务通信的通用方法。因为这个类可以最为基类被所有可能的终端设备使用,因此能够简化客户端开发。
MessageClient类的源代码如下:

import java.rmi.Naming;

public abstract class MessageClient
{
   private MessageServer messageServer;

   public MessageClient()
   {
      System.out.println("Initializing Message Client");
   }

   /**
    * Method used to connect to the message server
    *
    * @param serverName name of the server that contains the message server
    */

   protected void connectToServer()
   {
      String serverName = getServerName();
      try
      {
         String name = "//" + serverName + "/MessageServer";
         messageServer = ((MessageServer) Naming.lookup(name));
      }

      catch(Exception e)
      {
         System.out.println("Error connecting to Message Server.  Exception is " + e);
         e.printStackTrace();
      }

   }


   /**
    * Method used to send message to server
    *
    * @param phoneNum phone number to send message to
    * @param message message to send
    */

   public boolean sendMessage(String phoneNum, String message)
   {
      try
      {
         return(messageServer.sendMessage(phoneNum,message));
      }

      catch(Exception e)
      {
         System.out.println("Error Sending Message.  Exception is " + e);
         e.printStackTrace();
         return(false);
      }

   }


   public abstract String getServerName();
}
 
这个类包含3个方法:
sendMessage()方法将实际信息发送到服务器;
connectServer()方法负责连接服务。在本例中,服务是一个RMI服务;
getServerName()是一个抽象类,因为不同设备决定服务名字的方式不同。也就是说,任何继承自MessageClient的类都必须实现getServerName()方法。

在开发与信息服务通信的客户端程序时,我们需要多重继承。我们的网络客户端是一个简单的用来接收来自表单的信息并将其传送到服务器的Servlet。为了完成上述任务,这个Servlet必须既继承HttpServlet又继承MessageClient。由于Java不允许这种继承行为,我让主类继承HttpServlet,让主类中的内部类继承MessageClient,然后外部类创建了内部类的一个实例。代码如下:
public class SendMessageServlet extends HttpServlet{

   private MessageClient m_messageClient;
   private String m_serverName;

   public void doGet(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, IOException{
      try{
        //Get server name
         m_serverName = request.getServerName();
         System.out.println("ServerName is " + m_serverName);
         //Create message client to communicate with message server
         m_messageClient = new ServletMessageClient();
         System.out.println("Created Message Client");
         m_messageClient.connectToServer();

         //Get message and phone number
         String phoneNum = (String) request.getParameter("PhoneNum");
         String message = (String) request.getParameter("Message");

         //Send message
         m_messageClient.sendMessage(phoneNum,message);

         //Display page to tell user message was sent
         response.setContentType("text/html");
         RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/SendMessageForm.jsp");
         dispatcher.include(request, response);
      }
catch (Exception e){
         e.printStackTrace();
      }

   }
 

   public void doPost(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, IOException   {
      doGet(request, response);
   }


    /** Inner class used to extend MessageClient     */
    public class ServletMessageClient extends MessageClient {
       public ServletMessageClient(){
         super();
       }

       public String getServerName(){
          System.out.println("Returning ServerName " + m_serverName);
          return(m_serverName);
       }

    }

}
 
这种方法并不是真正的多重继承,因为我们使用了代理(例如:MessageClient被很多外部类继承,但并不是外部类本身),但是效果是一样的。虽然MessageClient能被单独的类扩展,但是使用内部类允许它访问外部类中的所有成员和方法。这让两个类之间的交互变得很容易。

这个例子只扩展了两个类,你当然可以使用这种技术扩展任意多类。

当然,其实这个信息传递服务的例子不用多重继承也能实现。如果MessageClient有一个能够接收服务服务名字的构造函数,那么getServerName()方法就可以不是抽象的。这意味着Web客户端可以不必继承MessageClient类。

最后提醒开发者,只有在有明确的理由,确定要使用上面技术时才使用,并且使用时要小心。因为多重继承使设计变得复杂,并且很容易被误用。
深入解析C++多重继承:内存布局、虚继承与工程实践 继承是面向对象编程的核心概念之一,它允许新创建的类(派生类)获取现有类(基类)的属性和行为,从而实现代码的复用和层次化组织。其原理在于派生类对象在内存中包含了基类子对象,并通过虚函数表(vtable)机制支持运行时多态,这使得程序能够以统一接口处理不同类型的对象,提升了代码的灵活性和可扩展性。在C++中,多重继承进一步扩展了这一能力,允许一个类同时从多个基类继承,这在设计需要融合多种角色或功能的类型时(如同时具备“学生”和“助理”特性的类)提供了强大的表达力。然而,多重继承也引入了菱形继承、二义性、复杂的内 阅读详情

相关推荐

Java接口与抽象类的多重继承特性探究

本文深入探讨了Java中接口和抽象类在实现多重继承时的规则和特性。通过分析抽象类实现接口的情况、类和接口的继承关系、接口中默认方法的引入及其在多重继承中的作用,文章揭示了Java如何通过接口扩展实现类似多重继承的机制,同时保持了语言的简单性与一致性。

weixin_42578963的博客 469

Java如何实现多继承

由上图我们可以知道,Java不能直接继承多个类,但是Java可以通过继承接口的方式来实现多继承。首先需要知道的是,Java是不支持像C++那样一次,一个类继承多个类的,不然会报错。

jakelihua 7576

DBC到ARXML:AUTOSAR CAN通信栈自动化配置完整指南

在AUTOSAR架构下,DBC(CAN数据库文件)与ARXML(AUTOSAR XML)分别扮演着描述总线通信和ECU内部配置的关键角色。DBC定义了网络上的报文与信号,而ARXML则是AUTOSAR工具链交换配置数据的标准格式。在实际的ECU开发中,如何将DBC中的通信信息高效、准确地转换为ARXML,并自动生成可编译的CAN通信栈BSW配置,是许多工程师面临的痛点。借助DaVinci Configurator等工具,我们可以通过自动化导入链路消除手工映射带来的字节序错误、信号起始位偏差等高风险问题,大幅

weixin_34183910的博客 534

java实现多继承

java实现多继承 1,多层继承 就是多个单继承积累,最下层在子类能具有上层类在特征,但这种方法重复高,一般不去用 2、内部类 一个类要继承多个类,在这个类的内部写多个内部类,然后让这些内部类都继承不同的类。 class dota { private String str = "let's play some dota"; public void play() { System.out.println(str); System.out.println("好

m0_57454517的博客 1万+

高通平台power_supply 框架下添加第三方充电IC的驱动方法

1.power_supply电源框架介绍: power supply framework在kernel/drivers/power/下。内核抽象出来power supply子系统为驱动提供了统一的框架。 功能包括: 1.抽象PSY设备的共性,向用户空间提供统一的API; 2.为底层PSY驱动的编写,提供简单、统一的方式,同时封装并实现公共逻辑。 power supply class位于d...

Change 1万+

信号完整性仿真SI之Cadence Sigrity SPEED2000_眼图仿真(四)

今天给大家分享一个仿真的操作流程,是关于Cadence Sigrity SPEED2000的时域波形仿真和眼图仿真。我们会经常看见硬件工程师调试示波器上的一些信号的波形变化,其实这些也可以通过仿真电路的搭建来做出投板前的仿真,来优化走线,以减少版本的迭代次数。如果要和实际的信号保持一致,就要求仿真设置的参数和实际的参数保持一致,这也是仿真的重点和难点。下面先让我们了解一下Cadence Sigrity SPEED2000时域仿真的操作流程: 1.仿真模式选择与文件导入 选择Cadence Sigrity下的

刘小同学的博客 1万+

Java中一个类可以继承多个类吗?揭秘多重继承的秘密!

在竞争激烈的职场中,面试是展现自己的绝佳机会。面试题是雇主了解我们技能和潜力的窗口。让我们一起揭开面试题的面纱,探索如何在这个关键时刻展现出最好的自己。

孤芳不自赏 9113

OpenBCI脑电数据处理实战:用MNE库从Raw对象到可视化分析全流程

本文提供了使用MNE-Python库处理OpenBCI脑电数据的完整实战指南。从通过BrainFlow库获取原始数据流、创建核心的Raw对象,到进行工频滤波、带通滤波等关键预处理步骤,最后实现时域信号、功率谱密度及地形图等多种专业可视化分析,手把手教你完成脑机接口数据处理的全流程。

gin88的博客 367

Java---继承

Java基础创作日记 Day04 时间:2021年2月5日下午 晴 趁兴把之前看的一些知识点再总结一下 文章目录继承的作用实现继承继承的特点重写父类方法super关键字super作用调用父类被重写成员的原体指定实例化子类时调用父类的哪个方法全部代码 继承的作用 实现多态 实现代码的多重利用 实现继承体系 实现继承 通过extends关键字 继承的特点 Java中只支持单继承(一个类只能有一个直接的父类) 多个类可以同时继承一个父类(一个父类可以有多个子类) Java可多重继承(可以存在子类的父类也.

你好牛蛙! 590

ESP32-CAM与TFT屏幕实时图像传输:Arduino环境下的OV2640驱动实践

本文详细介绍了在Arduino环境下实现ESP32-CAM与TFT屏幕实时图像传输的完整实践方案。重点解析了OV2640摄像头的驱动配置、硬件引脚连接、TFT屏幕初始化及图像显示优化技巧,帮助开发者快速构建稳定的实时图像显示系统,适用于物联网监控、门禁系统等场景。

cuda7parallel的博客 113

TexGen模型导出到ABAQUS的inp文件:如何快速修改纱线材料属性(避坑指南)

本文针对TexGen模型导出到ABAQUS的inp文件后纱线材料属性缺失或错误的问题,提供了高效的解决方案。文章详细解析了inp文件结构,指导用户如何手动定位并修改纱线材料属性,并提供了可批量处理的Python脚本,帮助用户快速、精准地完成材料参数赋值,有效提升复合材料仿真工作效率。

ice55的博客 602

java继承详解

多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。多个类可以称为子类,单独这个类称为父类超类或者基类。使用extends关键词class 父类 {class 子类 extends 父类 {继承之后,子类自动拥有父类的属性与方法(一般,有部分特殊情况)

cjhcjq122108的博客 1473

ROCm rocr-libhsakmt分析系列1-2:多GPU跨卡VRAM访问机制分析

本文基于ROCr-Runtime的libhsakmt库源码,深入分析了多GPU系统中跨设备内存访问的实现机制。主要内容包括: 实现流程概述:通过P2P拓扑发现、统一虚拟地址空间、页表映射和硬件转发四个步骤,实现零拷贝的跨GPU内存访问。

图形/计算GPU的驱动与虚拟化技术分享园地 2499

php实现多重继承,关于实现多重继承的10篇文章推荐

介绍接口之前,我们要知道,为什么要使用接口,这里向大家介绍一下。那为什么要使用接口呢?计算机语言中,只有少数的面向对象支持多重继承,我们所学习的PHP语言和大多数语言一样,并不支持多重继承。说白了就是一个父类可以有多个子类,但是子类只能有一个父类。什么又是多重继承呢?多重继承就是一个子类,继承了两个或多个父类,就是多重继承,在PHP中是不被允许的。如果要在PHP中实现多重继承功能,那么,我们就要用...

weixin_32596893的博客 405

小白也能懂!一步步教你用FPGA加速YOLO目标检测(入门篇)

安装到 PYNQ 开发板中。该库为 PYNQ 平台提供了对量化神经网络(如 YOLO)的硬件加速支持。确保你的电脑已连接到外网,如 WiFi 或热点(手机热点理论上也可用,未实测)。当你看到安装成功的提示后,打开 Jupyter Notebook,你会发现在。趁这个机会,泡了杯茶,刷了会儿手机,顺便感慨了一下开源社区的强大……页面中多出了一些新的项目文件夹 —— 这就是我们刚才安装的。参数,浅拷贝只克隆最近一次提交,减少数据量,避免超时问题。初始化,打开该文件,即可运行我们的Tiny YOLO。

FJN110的博客 1597

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

继承机制在Java中是如何工作的?

创建对象时,将对象的运行类型与方法绑定。在运行期间,根据实际对象的类型来调用相应的方法。每个对象都有一个方法表,包含方法名称和对应的地址,在运行时通过该表找到并调用相应的方法。

破损的天堂鸟博客 1099

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

HoRain云--Java中如何实现多重继承:原理与实践指南

《Java多重继承实现指南》摘要: 本文探讨Java中实现多重继承的两种方案。首先解析Java单继承的局限性,如游戏角色同时继承战斗、飞行等能力的场景需求。方案一使用接口实现,通过多接口继承+默认方法解决冲突,示例展示SuperHero类同时继承ActionCharacter并实现CanFly、CanSwim接口;方案二采用内部类模拟,通过多个内部类继承不同父类(如Son类内部继承Father/Mother),间接获得多重特性。文章对比了两种方案的优缺点:接口方式更灵活但受限于抽象,内部类更强大但增加复杂度

sinat_57153473的博客 1190

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

未来的.NET之多重继承

通过抽象接口引入有限形式的多重继承,这一.NET新提议颇具争议性。该特性是受Java默认方法(Default Methods)的启发。 默认方法的目的在于允许开发人员修改已发布的抽象接口。修改已发布接口将会产生破坏性的更改,因此在Java和.NET中通常是不允许的。默认方法的提出,为接口编写者提供了一种可重写的实现,缓解了向后兼容问题。 在C#版本的提议中,将包括用于如下部分的语法:

dotNET跨平台 375

任务2、创建笔记本电脑类(继承一个类,实现多个接口)

创建NetCard接口和USB接口,创建Computer抽象类,然后继承Computer类,实现NetCard接口和USB接口,创建笔记本电脑类Laptop。 Java简化了C++的多重继承,是单根继承,只能继承一个类,但是作为补偿,Java允许实现多个接口,让一个类可以实现更多的特性。 在Java里,继承一个类,实现多个接口,就好比是只有一个父亲,可以有多个叔叔。 (一)编程实现 1、创建NetCard接口 在net.huawei.p03.t02包里创建NetCard接口 package ne

qq_67308063的博客 193

java超类 子类,从超类的任何子类继承(Java)

我是C程序员,在C中我可以这样做:class SuperSuper{virtual void newItem()=0;}class SubSuperA:public SuperSuper{virtual void newItem(){//do something}}class SubSuperB:public SuperSuper{virtual void newItem(){//do somet...

weixin_39851974的博客 313

模拟继承

在面向对象编程中,继承是最重要的特性之一。继承允许将一个父类特殊化或者扩展为几个子类,对于创建和维护对象也是极有用的。JavaScript提供的继承特性对于大多数的c++或者Java程序员来说可能不是很熟悉,然而它确实提供对继承的支持。 方法: function Bird() { this.feet =2; this.feathers =true; retur

qq_27562577的博客 343

菜鸟Java面向对象 1. Java继承

继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。继承是面向对象编程中的一个重要概念,它允许在现有类的基础上创建新的类,并且新的类可以继承现有类的属性和方法,同时可以添加新的属性和方法,或者修改继承的方法的行为。在Java中,继承通过使用关键字extends来实现。

m0_46211715的博客 1082

Java接口与继承:构建灵活系统的基石

在Java中,接口可以被看作是一种规范或协议,它定义了一组方法,但不提供这些方法的实现。接口的目的是让不同的类可以遵循相同的方法签名,从而确保它们能够以一种统一的方式被使用。

2401_87195067的博客 657

Java 8 Lambda 表达式:模拟 Mixin 实现类的多重继承

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33991418的博客 262
上一篇: JAVA 的interface观念 与C++ 多重继承的比较
下一篇: osgi介绍(一)什么是osgi
ShenRui
博客等级 码龄20年 63粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值