0

0

Java接口如何定义和使用

PHPz

PHPz

发布时间:2023-04-18 22:10:06

|

1017人浏览过

|

来源于亿速云

转载

    一、引入

    一方面,有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,java不支持多重继承。有了接口,就可以得到多重继承的效果。

    另一方面,有时必须从几个类中抽取出一些共同的行为特征,而它们之间又没有is-a的关系,仅仅是具有相同的行为特征而已。例如:鼠标、键盘、打印机、扫描仪、摄像头、充电器、MP3机、手机、数码相机、移动硬盘等都支持USB连接。

    二、理解

    接口就是规范,定义的是一组规则,体现了现实世界中“如果你是/要…则必须能…”的思想。继承是一个"是不是"的关系,而接口实现则是"能不能"的关系。

    接口的本质是契约,标准,规范,就像我们的法律一样。制定好后大家都要遵守。

    三、使用

    接口使用关键字interface来定义。

    立即学习Java免费学习笔记(深入)”;

    Java中,接口和类是并列关系,或者接口可以理解为一种特殊的类。从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义(JDK7.0及之前),而没有变量和方法的实现。

    定义Java类的语法格式:先写extends,后写implements

    class SubClass extends SuperClass implements InterfaceA{ }

    接口(interface)是抽象方法和常量值定义的集合。

    如何定义接口:

    JDK7及以前:只能定义全局常量和抽象方法

    1. 接口中的所有成员变量都默认是由public static final修饰的,可以省略不写。

    2. 接口中的所有抽象方法都默认是由public abstract修饰的。

    代码演示:

    public interface Runner {
      int ID = 1;//<=>public static final int ID = 1;
      void start();//<=>public abstract void start();
      public void run();//<=>public abstract void run();
      void stop();//<=>public abstract void stop();
    }

    JDK8:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法。

    1.静态方法:使用 static 关键字修饰。

    接口中定义的静态方法,只能通过接口来调用,并执行其方法体。我们经常在相互一起使用的类中使用静态方法。你可以在标准库中找到像Collection/Collections或者Path/Paths这样成对的接口和类。

    2.默认方法:默认方法使用 default 关键字修饰。可以通过实现类对象来调用。我们在已有的接口中提供新方法的同时,还保持了与旧版本代码的兼容性。比如:java 8 API中对CollectionListComparator等接口提供了丰富的默认方法。

    • 若一个接口中定义了一个默认方法,而另外一个接口中也定义了一个同名同参数的方法(不管此方法是否是默认方法),在实现类同时实现了这两个接口时,会出现:接口冲突。 解决办法:实现类必须覆盖接口中同名同参数的方法,来解决冲突。

    • 若一个接口中定义了一个默认方法,而父类中也定义了一个同名同参数的非抽象方法,那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数的方法,不会出现冲突问题。因为此时遵守:类优先原则。接口中具有相同名称和参数的默认方法会被忽略。

    • 如何在子类(或实现类)的方法中调用父类、接口中被重写的方法?

    代码演示1:

    微动100多用户微信服务平台带分销系统
    微动100多用户微信服务平台带分销系统

    系统包含模块:1、卖场系统适用客户:实体卖场,可以分类管理,每个分类设置一个客服,客服可以使用手机管理分类商品2、万能表单用户可以自定义表单字段,收集各样信息,并可以导出Excel3、第三方接口方便用户自己开发,目前仅支持text格式4、留言板可以显示用户的头像和昵称5、场景二维码这是高级接口的使用,方便统计用户来源6、一键分享一个仿微信公众号详情界面,可以分享到朋友圈7、婚纱摄影一个相册+店面展

    下载
    public void myMethod(){
    		method3();//调用自己定义的重写的方法
    		super.method3();//调用的是父类中声明的
    		//调用接口中的默认方法
    		CompareA.super.method3();
    		CompareB.super.method3();
    	}

    代码演示2:

    interface Filial {// 孝顺的
    	default void help() {
    		System.out.println("老妈,我来救你了");
    	}
    }
    interface Spoony {// 痴情的
    	default void help() {
    		System.out.println("媳妇,别怕,我来了");
    	}
    }
    class Father{
    	public void help(){
    		System.out.println("儿子,就我媳妇!");
    	}
    }
    class Man extends Father implements Filial, Spoony {
    	@Override
    	public void help() {
    		System.out.println("我该就谁呢?");
    		Filial.super.help();
    		Spoony.super.help();
    	}	
    }

    接口中不能定义构造器的!意味着接口不可以实例化。

    接口采用多继承机制。可以实现多个接口 ,弥补了Java单继承性的局限性。

    格式:class AA extends BB implements CC,DD,EE;

    Java开发中,接口通过让类去实现(implements)的方式来使用。

    • 如果实现类覆盖了接口中的所有抽象方法,则此实现类就可以实例化 。

    • 如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为一个抽象类。

    代码演示:

    /*
    实现类SubAdapter必须给出接口SubInterface以及父接口MyInterface
    中所有方法的实现。否则,SubAdapter仍需声明为abstract的。
    */
    interface MyInterface{
        String s=“MyInterface”;
        public void absM1();
        }
    interface SubInterface extends MyInterface{
        public void absM2();
        }
    public class SubAdapter implements SubInterface{
        public void absM1(){System.out.println(“absM1”);}
        public void absM2(){System.out.println(“absM2”);}
    }

    接口与接口之间可以继承,而且可以多继承。

    一个类可以实现多个无关的接口。

    代码演示:

    interface Runner { public void run();}
    interface Swimmer {public double swim();}
    class Creator{public int eat(){…}} 
    class Man extends Creator implements Runner ,Swimmer{
        public void run() {……}
        public double swim() {……}
        public int eat() {……}
    }

    与继承关系类似,接口与实现类之间存在多态性

    代码演示:

    public class Test{
      public static void main(String args[]){
        Test t = new Test();
        Man m = new Man();
        t.m1(m);
        t.m2(m);
        t.m3(m);
      }
      public String m1(Runner f) { f.run(); }
      public void m2(Swimmer s) {s.swim();}
      public void m3(Creator a) {a.eat();}
    }

    接口的匿名实现类匿名对象

    代码演示:

    public class USBTest {
    	public static void main(String[] args) {
    		Computer com = new Computer();
    		//1.创建了接口的非匿名实现类的非匿名对象
    		Flash flash = new Flash();
    		com.transferData(flash);
    		//2. 创建了接口的非匿名实现类的匿名对象
    		com.transferData(new Printer());
    		//3. 创建了接口的匿名实现类的非匿名对象
    		USB phone = new USB(){
    			@Override
    			public void start() {
    				System.out.println("手机开始工作");
    			}
    			@Override
    			public void stop() {
    				System.out.println("手机结束工作");
    			}			
    		};
    		com.transferData(phone);
    		//4. 创建了接口的匿名实现类的匿名对象
    		com.transferData(new USB(){
    			@Override
    			public void start() {
    				System.out.println("mp3开始工作");
    			}
    			@Override
    			public void stop() {
    				System.out.println("mp3结束工作");
    			}
    		});
    	}
    }
    class Computer{	
    	public void transferData(USB usb){//USB usb = new Flash();
    		usb.start();		
    		System.out.println("具体传输数据的细节");		
    		usb.stop();
    	}		
    }
    interface USB{
    	//常量:定义了长、宽、最大最小的传输速度等	
    	void start();	
    	void stop();	
    }
    class Flash implements USB{
    	@Override
    	public void start() {
    		System.out.println("U盘开启工作");
    	}
    	@Override
    	public void stop() {
    		System.out.println("U盘结束工作");
    	}	
    }
    class Printer implements USB{
    	@Override
    	public void start() {
    		System.out.println("打印机开启工作");
    	}
    	@Override
    	public void stop() {
    		System.out.println("打印机结束工作");
    	}	
    }

    四、应用-代理模式(Proxy)

    1. 应用场景

    • 安全代理:屏蔽对真实角色的直接访问。

    • 远程代理:通过代理类处理远程方法调用(RMI)。

    • 延迟加载:先加载轻量级的代理对象,真正需要再加载真实对象,比如你要开发一个大文档查看软件,大文档中有大的图片,有可能一个图片有100MB,在打开文件时,不可能将所有的图片都显示出来,这样就可以使用代理模式,当需要查看图片时,用proxy来进行大图片的打开。

    2. 分类

    • 静态代理(静态定义代理类)

    • 动态代理(动态生成代理类)

    3. 代码演示

    //举例一:
    interface Network {
        public void browse();
        }
    // 被代理类
    class RealServer implements Network { @Override
        public void browse() {
        System.out.println("真实服务器上
        网浏览信息");
        } 
    }
    // 代理类
    class ProxyServer implements Network {
        private Network network;
        public ProxyServer(Network network) {
        this.network = network; }
        public void check() {
        System.out.println("检查网络连接等操作");
    }
        public void browse() {
        check();
        network.browse();
        } 
    }
    public class ProxyDemo {
        public static void main(String[] args) {
        Network net = new ProxyServer(new
        RealServer());
        net.browse();
        } 
    }
    //举例二:
    public class StaticProxyTest {
    	public static void main(String[] args) {
    		Proxy s = new Proxy(new RealStar());
    		s.confer();
    		s.signContract();
    		s.bookTicket();
    		s.sing();
    		s.collectMoney();
    	}
    }
    interface Star {
    	void confer();// 面谈
    	void signContract();// 签合同
    	void bookTicket();// 订票
    	void sing();// 唱歌
    	void collectMoney();// 收钱
    }
    //被代理类
    class RealStar implements Star {
    	public void confer() {
    	}
    	public void signContract() {
    	}
    	public void bookTicket() {
    	}
    	public void sing() {
    		System.out.println("明星:歌唱~~~");
    	}
    	public void collectMoney() {
    	}
    }
    //代理类
    class Proxy implements Star {
    	private Star real;
    	public Proxy(Star real) {
    		this.real = real;
    	}
    	public void confer() {
    		System.out.println("经纪人面谈");
    	}
    	public void signContract() {
    		System.out.println("经纪人签合同");
    	}
    	public void bookTicket() {
    		System.out.println("经纪人订票");
    	}
    	public void sing() {
    		real.sing();
    	}
    	public void collectMoney() {
    		System.out.println("经纪人收钱");
    	}
    }

    五、接口和抽象类之间的对比

    No. 区别点 抽象类 接口
    1 定义 包含抽象方法的类 主要是抽象方法和全局常量的集合
    2 组成 构造方法、抽象方法、普通方法、常量、变量 常量、抽象方法、(jdk8.0:默认方法、静态方法)
    3 使用 子类继承抽象类(extends) 子类实现接口(implements)
    4 关系 抽象类可以实现多个接口 接口不能继承抽象类,但允许继承多个接口
    5 常见设计模式 模板方法 简单工厂、工厂方法、代理模式
    6 对象 都通过对象的多态性产生实例化对象 都通过对象的多态性产生实例化对象
    7 局限 抽象类有单继承的局限 接口没有此局限
    8 实际 作为一个模板 是作为一个标准或是表示一种能力
    9 选择 如果抽象类和接口都可以使用的话,优先使用接口,因为避免单继承的局限 如果抽象类和接口都可以使用的话,优先使用接口,因为避免单继承的局限

    六、经典题目(排错)

    //题目一:
    interface A {
        int x = 0;
        }
    class B {
        int x = 1;
        }
    class C extends B implements A {
        public void pX() {
        System.out.println(x);
        }
    public static void main(String[] args) {
        new C().pX();
        } 
    }
    //题目二:
    interface Playable {
        void play();
        }
    interface Bounceable {
        void play();
    }
    interface Rollable extends Playable, Bounceable {
        Ball ball = new Ball("PingPang");
    }
    class Ball implements Rollable {
        private String name;
        public String getName() {
        return name; 
        }
        public Ball(String name) {
        this.name = name; 
        }
        public void play() {
        ball = new Ball("Football");
        System.out.println(ball.getName());
        } 
    }

    相关文章

    java速学教程(入门到精通)
    java速学教程(入门到精通)

    java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

    下载

    相关标签:

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    热门AI工具

    更多
    DeepSeek
    DeepSeek

    幻方量化公司旗下的开源大模型平台

    豆包大模型
    豆包大模型

    字节跳动自主研发的一系列大型语言模型

    通义千问
    通义千问

    阿里巴巴推出的全能AI助手

    腾讯元宝
    腾讯元宝

    腾讯混元平台推出的AI助手

    文心一言
    文心一言

    文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

    讯飞写作
    讯飞写作

    基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

    即梦AI
    即梦AI

    一站式AI创作平台,免费AI图片和视频生成。

    ChatGPT
    ChatGPT

    最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

    相关专题

    更多
    C# ASP.NET Core微服务架构与API网关实践
    C# ASP.NET Core微服务架构与API网关实践

    本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

    16

    2026.03.11

    Go高并发任务调度与Goroutine池化实践
    Go高并发任务调度与Goroutine池化实践

    本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

    23

    2026.03.10

    Kotlin Android模块化架构与组件化开发实践
    Kotlin Android模块化架构与组件化开发实践

    本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

    75

    2026.03.09

    JavaScript浏览器渲染机制与前端性能优化实践
    JavaScript浏览器渲染机制与前端性能优化实践

    本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

    95

    2026.03.06

    Rust内存安全机制与所有权模型深度实践
    Rust内存安全机制与所有权模型深度实践

    本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

    218

    2026.03.05

    PHP高性能API设计与Laravel服务架构实践
    PHP高性能API设计与Laravel服务架构实践

    本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

    420

    2026.03.04

    AI安装教程大全
    AI安装教程大全

    2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

    168

    2026.03.04

    Swift iOS架构设计与MVVM模式实战
    Swift iOS架构设计与MVVM模式实战

    本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

    222

    2026.03.03

    C++高性能网络编程与Reactor模型实践
    C++高性能网络编程与Reactor模型实践

    本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

    33

    2026.03.03

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    Kotlin 教程
    Kotlin 教程

    共23课时 | 4.3万人学习

    C# 教程
    C# 教程

    共94课时 | 11.1万人学习

    Java 教程
    Java 教程

    共578课时 | 80.5万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号