java8 接口之间继承与覆盖

Java接口与类的实现规则及多重继承的探讨 本文深入探讨了Java中接口和类的实现规则,包括必须为接口中的所有抽象方法提供具体实现,以及如何正确使用多重继承。文章通过实例演示了接口和类的声明与实现,以及它们在Java 8中的新特性。此外,还讨论了方法覆盖和重载的返回类型规则,为读者提供了关于Java编程语言在实现多态性方面的深刻理解。 阅读详情

Java8的接口里面允许定义静态方法,与默认方法,那么当一个子接口继承父接口时,那么接口中的默认方法与静态方法的继承与覆盖是怎么样的呢?

我们知道两个类有继承关系时,子类会继承父类的实例方法,静态方法,实例变量与静态变量,而且子类的实例方法、实例成员变量与父类的实例方法相同时(返回类型相同,参数列表相同,方法名也形同),实例成员变量相同时,子类会将父类的实例方法进行覆盖,对父类实例成员变量隐藏,但子类继承父类的静态方法或静态成员变量时,不会将父类的静态方法进行覆盖,只会对父类静态方法或静态成员变量进行隐藏!

public class Fu {
    static int  a = 5;  //父类静态成员变量
    int  b = 4;         //父类实例成员变量
    
    static void show(){
        System.out.println("父类静态方法");
    }

    void show1(){
        System.out.println("父类实例方法");
    }
}

class Zi extends Fu{

}

class DemoTest{
    public static void main(String [] args){
        Zi z = new Zi();
        System.out.println(z.a);
        System.out.println(z.b);
        z.show();
        z.show1();           

    }
}

输出:

5
4
父类静态方法
父类实例方法

可见子类会继承父类的静态成员,实例成员,静态方法,实例方法!

另外若将DemoTest类中  Zi z = new Zi();改为Fu z = new Zi();输出结果跟上面的结果一致!因为Zi类只是完全继承父类,此时多态也就没发挥出作用!

如将子类改写成:

class Zi extends Fu{
    int b = 40;
    static int a = 50;
    static void show(){
        System.out.println("子类的静态方法");
    }
    void show1(){
        System.out.println("子类覆盖父类的实例方法");
    }
}
同样DemoTest类中  Zi z = new Zi();改为Fu z = new Zi();输出结果为:

5
4
父类静态方法
子类覆盖父类的实例方法

可见静态方法,实例成员变量,静态成员变量都不存在多态。编译和运行都由等式左边决定,左边是什么类型就调用该类的属性和静态方法!而实例方法的覆盖,存在继承,即编译时看左边,运行时看右边!


接口的默认方法(接口的默认方法由default修饰,可以有方法体,不能与static关键字共存!)与抽象方法都可以像实例方法一样的继承,但是,当类或接口的超类型提供具有相同签名的多个默认方法时,Java编译器遵循以下继承规则来解决名称冲突:

1、实例方法优于接口默认方法。

public class Horse {
    public String identifyMyself() {
        return "I am a horse.";
    }
}
public interface Flyer {
    default public String identifyMyself() {
        return "I am able to fly.";
    }
}
public interface Mythical {
    default public String identifyMyself() {
        return "I am a mythical creature.";
    }
}
public class Pegasus extends Horse implements Flyer, Mythical {
    public static void main(String... args) {
        Pegasus myApp = new Pegasus();
        System.out.println(myApp.identifyMyself());
    }
}
运行得到如下结果:

I am a horse.(因为Pegasus类即继承了Horse类,又实现了Flyer,Mythical接口,他们中都存在一个相同标签的方法(返回类型相同,函数名形同,参数列表也相同),但由于实例方法优于接口默认方法,所以输出I am a horse)
2、父接口里面默认方法被别的接口覆盖过了,当一个类实现该接口和父接口或者(和另外的继承了父接口但没有覆盖父接口的默认方法的接口),会表现出覆盖以后的方法,如:

public interface Animal {
    default public String identifyMyself() {
        return "I am an animal.";
    }
}

interface EggLayer extends Animal {
    default public String identifyMyself() {
        return "I am able to lay eggs.";
    }
}

interface FireBreather extends Animal {
}

class Dragon implements EggLayer, Animal,FireBreather {
    public static void main (String... args) {
        Dragon myApp = new Dragon();
        System.out.println(myApp.identifyMyself());
    }
}
输出:
I am able to lay eggs.

注意千万不能实现两个或以上都覆盖了相同父接口默认方法的接口,否则会出现编译错误!

如下:

public interface Animal {
    default public String identifyMyself() {
        return "I am an animal.";
    }
}

interface EggLayer extends Animal {
    default public String identifyMyself() {
        return "I am able to lay eggs.";
    }
}

interface FireBreather extends Animal {
    default public String identifyMyself(){
        return "I am able to lay Fire.";
    }
}

class Dragon implements EggLayer,FireBreather {
    public static void main (String... args) {
        Dragon myApp = new Dragon();
        System.out.println(myApp.identifyMyself());
    }
}
上面代码出现编译错误!
如果不想出现编译错误,可借助super关键字,在实现类里指定继承的是哪个接口的默认函数,如下
class Dragon implements EggLayer, FireBreather {
    public String identifyMyself(){
        return FireBreather.super.identifyMyself();  //注意使用方法
    }
    public static void main (String... args) {
        Dragon myApp = new Dragon();
        System.out.println(myApp.identifyMyself());
    }
}
编译通过,输出:
        I am able to fire
另外:接口里面的静态方法不能被继承!




        
机械臂电机力矩计算 设计 6 轴机械臂时,电机力矩计算是确保机械臂负载能力、运动精度和安全性的核心环节,需围绕和两大核心展开,结合机械臂结构参数(如关节长度、质量分布)、负载需求(如末端负载重量、惯性)和运动参数(如加速度、角速度)逐步推导。 阅读详情

相关推荐

计算机视觉(相机标定;内参;外参;畸变系数)

目录 一、预备知识 1、坐标系变换过程(相机成像过程) (1)相机坐标系转换为图像坐标系(透视投影变换遵循的是针孔成像原理) (2)齐次坐标的引入原因:(为什么引入齐次坐标???) 2、内参与外参矩阵的构成 3、畸变参数 二、相机标定 1、张正友标定法(光学标定)及其求解思路 2、求解内参矩阵与外参矩阵的思路: (1)计算内参与外参矩阵的乘积M (2)求解内参矩阵A (3)求解外参矩阵(R1 R2 T) 三、参数优化 1、L-M算法 2、相机标定步骤 四、相关代码及其实验结.

QYJ_WORKHARDING的博客 6万+

Java中10种覆盖方法的方式

1)子类方法的名称、参数签名和返回类型必须与父类方法的名称、参数签名和返回类型一致,修饰符可以相同也可以不同,但子类的访问权限不能低于父类的访问。 class Aball { Aball() { } public void method() { } } public class ExtendsMethod extends Aball {

食種之食物 3485

Coze平台智能体开发实战:打造测试工程师的AI助手

智能体是具备特定身份和能力的AI实体,由大语言模型(LLM)驱动,并通过插件、知识库和工作流扩展其能力。明确的角色定位:可以设定特定身份和专业领域扩展能力:通过插件连接外部工具和服务记忆能力:通过知识库存储和检索专属信息流程化处理:通过工作流执行复杂多步任务通过Coze平台创建测试工程师智能体,可以显著提升测试效率和质量。明确的角色定位:聚焦测试工程师的实际需求丰富的知识库:提供准确的领域知识支持合适的工具集成:通过插件连接现有工具链持续迭代优化:根据反馈不断改进智能体行为自动化测试生成。

hogwarts_beibei的博客 1005

Java多态十一:接口的继承;接口中默认方法的重写和覆盖

1.接口的继承 一个类实现“子接口”:该实现类,需要既实现“子接口”中的方法,又要实现“父接口”中的方法。 Java中的类是单继承的,即一个子类最多只能有一个父类。那么接口呐? Java中,接口是可以继承多个接口的 自然,如果一个类实现了接口ISon,那么该来需要实现接口,ISon,IFather,IFather2中的方法。 Java的接口多继承时:如果IFather和IFaher2两个父接口中同时存在同名的默认方法,connection(): 如果“子接口”不做任何处理

小枯林的博客 1万+

3小时学会AI建站!无需编程,个人简历独立站开发速成指南

3小时学会AI建站!个人简历独立站开发速成指南

pei_laoshi的博客 1259

AltiumDesigner 09安装过程破解问题 .

首先分享一下破解文件,网上总是下载不到,好不容易下载到了,放在网盘上,有需要的自取。AltiumDesigner 09破解文件。链接:https://pan.baidu.com/s/1ZGvbR_6T51hpcaFbQiMX5w 密码:qwvaAltiumDesigner 09安装安装文件,比较大,包含破解文件:链接:https://pan.baidu.com/s/1mfgragB519jpGfR...

xiaoxiao_rabbit的博客 3万+

java 覆盖方法,在Java中实现接口并覆盖方法?

Why do you have to override all methods of an interface?For instance if I havepublic class Foo extend JFrame implements ActionListener, KeyListener {foo(){}@Overridepublic void keyPressed(KeyEvent arg...

weixin_39628180的博客 357

车牌识别系统

随这图形图像技术的发展,现在的车牌识别技术准确率越来越高,识别速度越来越快。无论何种形式的车牌识别系统,它们都是由触发、图像采集、图像识别模块、辅助光源和通信模块组成的。车牌识别系统涉及光学、电器、电子控制、数字图像处理、计算视觉、人工智能等多项技术。触发模块负责在车辆到达合适位置时,给出触发信号,控制抓拍。辅助光源提供辅助照明,保证系统在不同的光照条件下都能拍摄到高质量的图像。图像预处理程序对抓拍的图像进行处理,去除噪声,并进行参数调整。然后通过车牌定位、字符识别,最后将识别结果输出。 牌照自动识别是一

FPGA/MATLAB学习教程/源码/项目合作开发 2万+

继承,覆盖,抽象,接口,子类实例化

Java学习笔记之------继承,抽象类,接口继承抽象类接口 继承 class species{ void show(){ System.out.println("吼叫"); } } class dog extends species{ void eat(){ System.out.println("骨头"); } } public class AbstractDemo{ public static void main(String args[]){ dog d = new dog

qq_44807271的博客 741

Serial RapidIO Gen2 IP 说明(三)

前言 继续接着上篇文章,介绍Serial RapidIO Gen2 IP 的具体端口信息。 一、端口描述 1、缓冲设计接口 2、物理层接口 参考说明 【1】Serial RapidIO Gen2 v4.1https://china.xilinx.com/content/dam/xilinx/support/documentation/ip_documentation/srio_gen2/v4_1/pg007_srio_gen2.pdf ...

记录所学,分享知识,结识挚友 1320

学Simulink——基于Simulink的Buck-Boost变换器双闭环PI+抗饱和设计建模示例

本文详细介绍了基于Simulink的非反相Buck-Boost变换器双闭环控制设计方法。针对Buck-Boost变换器特有的右半平面零点(RHPZ)和控制挑战,提出了电压-电流双闭环PI控制架构,并集成抗积分饱和机制。通过Simulink建模,实现了主电路、电流内环PI、电压外环PI、PWM及占空比限幅等模块的搭建,验证了在输入电压跌落(20V→10V)和负载突变(2A→4A)等场景下的稳定性能。仿真结果表明,输出电压波动小于0.35V,恢复时间快于1ms,电感电流有效限幅。文章还讨论了工程实践要点和扩展方

xiaoheshang_123的博客 318

【java基础】为什么子接口要覆盖父接口的方法

背景  研究java api[^1] – Queue时,对好奇的地方扩展阅读。发现Deque方法列表里有contains(),下方的继承于Collection的方法只是列出,产生疑问,contains()方法在Collection里也有,为啥子接口要重写父接口的方法呢? 研究  谷歌搜索"Why do some interfaces override the methods of the parent interface in java",找到两篇文章[^2,3],结合jdk源码看了下。 总结  文章[^3

harbor_lee的博客 678

PCL基础:getTransformation函数全流程解析与应用实例,一篇文章精通点云变换

在 Eigen 和 PCL 中,getTransformation是一个常用的函数,用于根据输入的平移和旋转信息(如欧拉角或四元数)生成一个仿射变换矩阵(Eigen::Affine3f或 Eigen::Affine3d)。1)在 Eigen 中,可以通过四元数和平移向量构造一个变换矩阵。2)讲解了从四元数转换到欧拉角,或者从欧拉角转换到四元数的方法。

weixin_42896234的博客 1368

第十六节 接口

●接口是用来被类实现(implements)的,实现接口的类称为实现类。4、一个类实现了多个接口,多个接口中存在同名的默认方法,不冲突,这个类重写该方法即可。3、一个类继承了父类,同时又实现了接口,父类中和接口中有同名方法,默认用父类的。5、一个接口继承多个接口,是没有问题的,如果多个接口中存在规范冲突则不能多继承。一个类实现接口,必须重写完全部接口的全部抽象方法,否则这个类需要定义成抽象类。接口和接口的关系:多继承,一个接口可以同时继承多个接口。从上面可以看出,接口可以被类单实现,也可以被类多实现。

hanhanT的博客 374

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Javase---接口概述

1、什么是接口? 接口是一种引用数据类型,是抽象方法的集合,以关键字 interface 来声明。接口无法被实例化,但是它可以被实现。 2、接口中可以包含的内容: Java 7 之后:常量 、抽象方法 Java 8 之后:默认方法、静态方法 Java 9 之后:静态方法、私有方法 public interface Iinterface { //定义常量 public static final int NU...

weixin_37963567的博客 225

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【Java】接口与继承

用接口实现多继承 在Java中一个子类只被允许继承一个父类,即只允许单继承。但一个类可以实现多个接口,通过实现多个接口的方式满足多继承的设计需求。如果多个接口中有相同的方法,由于它们都是抽象的,子类实现它们不会有冲突。 下面给出一组示例,其中有两个接口InterfaceA和InterfaceB,AB类实现了这两个接口,继承Object父类。 InterfaceA.java代码如下: package com.company; public interface InterfaceA { void me

CCH²¹的博客 3340

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JAVA 接口与接口、接口与父类之间方法同名

文章目录接口成员的特点java8接口变化静态方法的特性接口和父类的方法重名1. 接口:抽象方法,父类:成员方法2. 接口:默认方法,父类:成员方法3. 接口:静态方法,父类:成员方法4. 接口:抽象方法,父类:静态方法5. 接口:默认方法,父类:静态方法6. 接口:静态方法,父类:静态方法总结:实现的多个接口中有同名方法1. 两者均是抽象方法2.一个为抽象方法,一个为默认方法3. 两者均是默认方法4. 一个或者两个为静态方法5. 将某一个接口替换为抽象类总结方法重名总结父类子类实现同一个接口 接口成员的特

qq_41775852的博客 2785

java8 继承多重接口,接口之间也是继承关系时,执行的是哪个接口的default方法

1)距离近的,关系近的 优先级更高。 2)接口与class 同样距离时,优先继承class。 3) 参考

stomfeng的专栏 710

Java中【接口】【接口的多继承】详细讲解

Java【继承】详解连接: https://blog.youkuaiyun.com/qq_43436117/article/details/113825027. 史上最详细的接口讲解 1.接口 1.1 概述   接口,是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量、构造方法和成员方法,那么 接口的内部主要就是封装了方法,包含抽象方法(JDK 7及以前),默认方法和静态方法(JDK 8),私有方法 (JDK 9)。   接口的定义,它与定义类方式相似,但是使用 interface 关键字。它也会

qq_43436117的博客 3349

Java 8 类和接口的多继承详解

原文链接:http://colobu.com/2014/11/04/Java-8-default-method-and-multiple-inheritance/ 自从Java 8发布后, 接口中也可以定义方法了(default method)。 之所以打破以前的设计在接口中 增加具体的方法, 是为了既有的成千上万的Java类库的类增加新的功能, 且不必对这些类重新进行设计。 比如, 只需在Co...

shadow_zed的博客 864

《Java程序设计》实验报告——Java的接口与继承

浙江理工大学 《Java程序设计》 实验报告 20 19~20 20学年第 1学期 学 院 信息学院 班 级 计算机科学与技术18(3) 姓 名 申屠志刚 学 号 2018329621200 ...

无限迭代中...... 6502

【Java基础】接口与继承

(3)如果子类没有这个属性,就看父类有没有这个属性(如果父类有该属性,并且可以访问,就返回信息…(4)最终运行效果看子类(运行类型)的具体实现,即调用方法时,按照从子类(运行类 型)开始查找方法。接口就是约定一些方法,而这些方法的具体方法体由实现接口的类实现,形成一套规范的统一的方法体系。虽然构造器,代码块不能被继承,但是在创建子类实例的时候,会调用父类的代码块和构造器。(4)如果父类没有就按照(3)的规则,继续找上级父类,直到Object…当继承的方法和接口的默认方法相同时,调用继承的方法。

橙子的博客 1301

java中为什么不允许类多重继承,却允许接口多重继承

首先看下面这一段代码:(底下有热心网友更正,jdk1.8之后情况确实有点变化,等改天有空继续更) interface a{ void b(); } interface a1 extends a{ void b(); } interface a2 extends a{ void b(); } interface a12 extends a1,a2{ void b(...

liulangcheshou的博客 4816

Java 之接口 与继承

接口类的定义 接口实现与多继承的区别 总结 接口类的定义 1.接口就是多个类的公共规范 ,也是一种引用数据类型 ,最重要的是其中的抽象方法 2.public interface Interface { } 关键字interface 3.java 7 :可以定义 常量,...

wahaha 701

Java8中的“菱形继承”问题

Java中的“菱形继承”问题什么是菱形继承Java代码场景一场景二简单结论解决办法 什么是菱形继承 一张图说明。在C++中允许多继承,D类继承自B、C,而B、C有同一个父类A。那么这个时候调用say方法是否成功?答案是不能,编译器并不能判断这个say来自哪个父类。 #include<iostream> using namespace std; class A{ public: void say(){ cout<<"Say Hello"<<end

潇兮水寒的博客 1934

Java中extends与implements深度解析:继承与接口实现的本质区别

Java面向对象编程中,extends和implements是核心关键字,分别用于类继承(单继承)和接口实现(多实现)。extends建立"is-a"关系,实现代码复用和层次化分类;implements定义行为契约,支持多态和低耦合设计。关键区别在于:类只能继承一个父类但可实现多个接口,继承耦合度高而接口耦合度低。典型应用场景包括明确父子关系时用继承,需要多重行为或多态时用接口。Java 8后接口支持默认方法,需注意多重继承冲突问题。

m0_66884848的博客 2938
上一篇: Java集合框架(1)
下一篇: NIO.2:walkFileTree、FileVisitor(遍历文件/目录)
billion_Fu
博客等级 码龄9年 3粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值