Java中多继承的实现

news/2024/12/22 19:34:32/

1 问题

Java是一种面向对象的只允许单继承的语言,那么怎样在Java中实现多继承呢?

2 方法

  1. 多层继承
    如果要直接继承类,子类是不可以直接多继承的,但是可以通过多层继承来实现多继承,但多层继承一般不建议超过三次。

  2. 接口

接口可用于继承也可用于其它,比较灵活。定义类实现接口,需要实现其所有父接口的方法。

多层继承:
package weekbook;
class A{//父类A类
   private int num=10;
   public int getNum(){
       return this.num;
   }
   public void fun(){
       System.out.println("你今天天气真好!");
   }
}
class B extends A{//B类继承A类
   private String name="张三";
   public String getName(){
       return this.name;
   }
   public void fun(){//方法覆写
       System.out.println(this.getNum());
       //父类私有域被继承但不可直接使用,需通过getter方法间接获得私有域的内容
       //子类中没找到那么会去父类中寻找
   }
}
class C extends B{//C类继承B类,相当于间接继承A类
   private String name="李四";
   public String getName(){
       return this.name;
   }
   public void fun(){//方法覆写(结果为覆写后的内容)
       System.out.println(this.getName());
       System.out.println(this.name);
   }
}
public class Test{
   public static void main(String[] args){
       A a=new A();
       a.fun();
       print(new B());//向上转型(优点在于子类可自动进行向上转型,可实现参数的统一)
       print(new C());
   }
   public static void print(A a){
       a.fun();
   }
}
接口:
package weekbook;
interface IA{//父接口A(接口为更纯粹的抽象类,结构组成只含全局常量和抽象方法)
   void funA();
}
interface IB {//父接口B(接口前添加I用以区分接口)
   void funB();
}
interface CImpl extends IA,IB{//接口可继承多个父接口,用,分隔开即可,子接口的命名可选择较为重要的父接口进行命名或自行命名,一般子接口后添加Impl用以区分
   void funC();
}
class Impl implements CImpl{//定义类实现接口(也可直接实现父接口(多个))
   public void funC(){//抽象方法的实现
       System.out.println("昨天吃串串!");
   }
   public void funA(){
       System.out.println("今天吃火锅!");
   }
   public void funB(){
       System.out.println("明天吃冒菜!");
   }
}
public class Test1{
   public static void main(String[] args){
       Impl im=new Impl();//实例化对象
       im.funA();
       im.funB();
       im.funC();
   }
}

3 结语

针对如何实现多继承的问题,提出利用多层继承和接口的方法,通过实验,证明该方法是有效的,本文的每种方法都有各自的短处,多层继承一般不超过三层 。接口实现多继承时,一个Java接口加入一个新的方法时,所有实现这个接口的类都得编写具体的实现。在未来,我们可以探索利用成员内部类来实现多继承的方法。


http://www.ppmy.cn/news/25732.html

相关文章

【python百炼成魔】python之列表详解

文章目录一. 列表的概念1.1 列表是什么?1.2 为什么要使用列表?1.3 列表的定义二. 列表的增删改查操作2.1 列表的读取2.2 列表的切片2.3 列表的查询操作2.3.1 not in ,in 表达式2.3.2 列表元素遍历2.4 列表元素的增加操作2.4.1 append()的相关用法2.4.2 e…

【Azure 架构师学习笔记】-Azure Logic Apps(7)- 自定义Logic Apps 调度

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Logic Apps】系列。 接上文【Azure 架构师学习笔记】-Azure Logic Apps(6)- Logic Apps调用ADF 前言 在稍微了解Logic Apps的使用之后,需要开始考虑如何调度起来。在Logic Apps里面…

2023美国大学生数学建模竞赛(美赛)思路代码

2023美国大学生数学建模竞赛(美赛)思路&代码报名时间节点比赛说明问题A(数据分析题):收干旱影响的植物群落(MCM)第一问第二问问题B(仿真建模题):重塑马赛…

HTML中嵌入B站视频

HTML中嵌入B站视频 在网页中实现一个HTML播放器需要先从b站获取视频嵌入代码, 以前嵌入代码可以从视频分享那里拿到, 现在好像不行了 必须是自己投稿的视频, 从投稿管理页面才能找到 复制嵌入代码 建一个.html文件, 放入下面代码 <!DOCTYPE html> <html><head…

第八章 - 数据分组( group by , having , select语句顺序)

第八章 - 数据分组 group by数据分组过滤分组 having分组排序groub by语句的一些规定select语句顺序数据分组 在使用group by进行分组时&#xff0c;一般都会配合聚合函数一起使用&#xff0c;实现统计数据的功能。比如下面例子&#xff0c;需要按性别计算人数。按性别进行分组…

2023年美赛ICM问题E:光污染 这题很好做啊!

2023年美赛ICM问题E:光污染 这题很好做啊&#xff01;![在这里插入图片描述](https://img-blog.csdnimg.cn/e918cc6fc9214b53bf4859063bfe56b0.png#pic_center) 我看到DS数模的分析&#xff0c;看似头头是道&#xff0c;实则GouPi不通&#xff0c;我出一个&#xff0c;用于大家…

mysql事务隔离级别

mysql锁机制及原理1.隔离级别2.实践2.1查看事务隔离级别2.2 设置隔离级别2.3 不可重复读2.4 幻读3.幻读怎么解决3.1 Record Lock3.2 Gap Lock3.3 Next-Key Lock引用&#xff1a;https://blog.csdn.net/xinyuan_java/article/details/1284932051.隔离级别 SERIALIZABLE(序列化)…

微服务项目【分布式锁】

创建Redisson模块 第1步&#xff1a;基于Spring Initialzr方式创建zmall-redisson模块 第2步&#xff1a;在zmall-redisson模块中添加相关依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</a…