Java学习之抽象类和接口

目录

抽象方法和抽象类

示例

使用要点

接口(interface)

作用

定义及使用

声明格式

定义接口的详细说明

要点

示例

接口中定义静态方法和默认方法(JDK8及以后)

默认方法

示例

静态方法

接口的多继承

示例


抽象方法和抽象类

  • 抽象方法

    • 使用abstract修饰的方法,没有方法体,只有声明

    • 定义的是一种"规范",就是告诉子类必须要给抽象方法提供具体的实现

  • 抽象类

    • 包含抽象方法的类就是抽象类

    • 通过抽象类,我们就可以做到严格限制子类的设计,使子类之间更加通用

示例

package AbstarctLearn;
​
public abstract class Test01 {
​int age;public abstract void rest();public abstract void play();public abstract void learn();
​public void shout(){System.out.println("啊啊啊啊啊啊啊");}
}
​
class zhang extends Test01{// 子类必须实现父类的抽象方法@Overridepublic void rest(){System.out.println("该休息咯~");System.out.println("zhang.rest");}
​@Overridepublic void play(){System.out.println("该玩耍咯~");System.out.println("zhang.play");}
​@Overridepublic void learn() {System.out.println("该学习咯~");System.out.println("zhang.learn");}
}
​
class san extends Test01{
​// 子类必须实现父类的抽象方法@Overridepublic void rest() {System.out.println("san.rest");}
​@Overridepublic void play() {System.out.println("san.play");}
​@Overridepublic void learn() {System.out.println("san.learn");}
}

使用要点

  • 有抽象方法的类只能定义成抽象类

  • 抽象类不能实例化,即不能用new来实例化抽象类

  • 抽象类可包含属性、方法、构造方法,但构造方法不能用new来实例,只能用来被子类调用

  • 抽象类只能用来被继承

  • 抽象方法必须被子类实现

接口(interface)

一组规范,所有实现类都要遵守

作用

  • 更加规范的对子类进行约束,全面且专业的实现了:规范和具体实现的分离

  • 接口是两个模块之间通信的标准,通信的规范

  • 接口和实现类不是父子关系,是实现规则的关系

定义及使用

声明格式

[访问修饰符] interface 接口名 [extends 父接口1,父接口2...]{

常量定义;

方法定义;

}

定义接口的详细说明
  • 访问修饰符:只能是pubic或默认

  • 接口名:和类名采用相同命名机制

  • extends:接口可以多继承

  • 常量:接口中的属性只能是常量,总是:public static final修饰,不写也是

  • 方法:接口中的方法只能是:public abstract,省略也是

要点
  • 子类通过implements实现接口中的规范

  • 接口不能创建实例,但可用于声明引用变量类型

  • 一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是public的

  • JDK1.8(不含8以前),接口中只能包含静态变量,抽象方法,不能有普通方法、构造方法、普通方法

  • JDK1.8(不含8)后,接口中包含普通的静态方法,默认方法

示例
package InterfaceLearn;
​
public interface Volant {
​/* (public static final 自动写) */int h = 100;/* (public abstract 自动写)*/void Fly();
}
​
//定义好人接口
interface Honest{void helpOther();
}
​
class GoodMan implements Honest{@Overridepublic void helpOther() {System.out.println("你真是个好人!");}
}
​
class BirdMan implements Volant{@Overridepublic void Fly(){System.out.println("你真是个鸟人啊!");}
}
​
class Angel implements Volant,Honest{@Overridepublic void Fly(){System.out.println("你是个天使哎");}@Overridepublic void helpOther(){System.out.println("天使实锤!");}
}
package InterfaceLearn;
​
import duotaiLearn.Animal;
​
public class TestVolant {public static void main(String[] args) {GoodMan g = new GoodMan();BirdMan b = new BirdMan();Angel a = new Angel();g.helpOther();  // 你真是个好人!b.Fly();        // 你真是个鸟人啊!a.Fly();        // 你是个天使哎a.helpOther();  // 天使实锤!System.out.println(Volant.h); // 通过类名可访问常量 : 100}
}

接口中定义静态方法和默认方法(JDK8及以后)

默认方法
  • 允许给接口添加一个非抽象的方法实现,只需要使用default关键字即可,这个特征叫做默认方法(扩展方法)

  • 默认方法和抽象方法的区别:抽象方法必须被实现,默认方法不是。作为替代方式,接口可以提供默认方法的实现,所有这个接口的实现类都可得到默认方法

示例
package InterfaceLearn;
​
public interface TestDefault {void printInfo();
​default void printDefault(){System.out.println("哈哈哈哈~管不着我~!");}
}
​
class TestDefault01 implements TestDefault{@Overridepublic void printInfo(){System.out.println("哦莫,我必须在!");}
}
package InterfaceLearn;
​
public class Test01 {public static void main(String[] args) {TestDefault t = new TestDefault01();t.printInfo();       // 哦莫,我必须在!t.printDefault();    // 哈哈哈哈~管不着我~!}}
静态方法
  • 如果子类定义了相同名字的静态方法,那就是完全不同的方法了,直接从属于子类,可通过子类名直接调用

  • 可在接口中直接定义静态方法的实现,这个静态方法直接从事与接口,可通过接口名调用

package InterfaceLearn;
​
public interface TestStatic {public static void teststatic01(){System.out.println("我是静态方法哟~");}
}
​
class static02 implements TestStatic{public static void teststatic01(){System.out.println("hi hi hi hi");}
}
package InterfaceLearn;
​
public class TestStatic01 {public static void main(String[] args) {
​// 一个属于接口,一个属于子类,完全独立,不是实现的关系TestStatic.teststatic01();  // 我是静态方法哟~static02.teststatic01();    // hi hi hi hi}
}

注意:默认方法中可以调用静态方法,但反之不行

接口的多继承

接口支持多继承,与类的继承类似,子接口extends父接口,会获得父接口中的一切

示例
package InterfaceLearn;
​
public interface DuojichengInterface {public static void main(String[] args) {C c = new C01();c.testC();      // C小子是抽象得,还得重写本身非默认方法!c.testA();      // C继承了本A,所以C你得重写本Ac.testB();      // C继承了本B,所以C你还得重写本B}
}
​
interface A{void testA();
}
​
interface B{void testB();
}
​
interface C extends A,B{void testC();
}
​
class C01 implements C{@Overridepublic void testA() {System.out.println("C继承了本A,所以C你得重写本A");}
​@Overridepublic void testB() {System.out.println("C继承了本B,所以C你还得重写本B");}
​@Overridepublic void testC() {System.out.println("C小子是抽象得,还得重写本身非默认方法!");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/793789.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity之PUN实现多人联机射击游戏的优化(Section 2)

目录 🎮一、准备工作 🎮二、实现手雷投掷动作 🎮三、手雷投掷同步 💤3.1 photonView.RPC 🎮四、同步手雷伤害 这几周都给我布置任务了,最近可忙。现在终于有机会更新了,也谢谢大家的阅读&a…

JavaSE-11笔记【多线程2(+2024新)】

文章目录 6.线程安全6.1 线程安全问题6.2 线程同步机制6.3 关于线程同步的面试题6.3.1 版本16.3.2 版本26.3.3 版本36.3.4 版本4 7.死锁7.1 多线程卖票问题 8.线程通信8.1 wait()和sleep的区别?8.2 两个线程交替输出8.3 三个线程交替输出8.4 线程通信-生产者和消费者…

C++枚举类型

在 C++ 中,枚举(Enumeration)是一种用户定义的数据类型,用于定义一组有限的命名常量。枚举类型可以简化代码,提高代码的可读性。 C++ 中的枚举类型有两种:普通枚举和枚举类。 1. 普通枚举 普通枚举使用关键字 enum 定义,可以指定枚举常量的取值。 #include <iost…

Tailwind 4.0 即将到来:前端开发的“速度与激情”

随着前端开发技术的不断进步&#xff0c;我们每天都在寻找更快、更简洁的解决方案来提升我们的开发效率和用户体验。今天&#xff0c;我要为大家介绍一项令人振奋的新技术进展——Tailwind 4.0的来临&#xff01; 对于经常使用Tailwind的朋友们来说&#xff0c;这个消息无疑是激…

阿里云短信服务业务

一、了解阿里云用户权限操作 1.注册账号、实名认证&#xff1b; 2.使用AccessKey 步骤一 点击头像&#xff0c;权限安全的AccessKey 步骤二 设置子用户AccessKey 步骤三 添加用户组和用户 步骤四 添加用户组记得绑定短信服务权限 步骤五 添加用户记得勾选openApi访问 添加…

Educational Codeforces Round 162 (Rated for Div. 2) ----- E. Count Paths --- 题解

E. Count Paths&#xff1a; 题目大意&#xff1a; 思路解析&#xff1a; 根据题目中定义的美丽路径&#xff0c;我们可以发现路径只有两种情况&#xff1a; 当前结点作为起始结点&#xff0c;那我们只需要知道它的子树下有多少个相同颜色的结点&#xff0c;并且相同颜色的结…

使用 HTMX 和 Bun 进行全栈 Web 开发

将 HTMX 放在前端&#xff0c;Bun 放在后端&#xff0c;然后将它们与 Elysia 和 MongoDB 连接起来&#xff0c;形成快速便捷的技术栈&#xff0c;使开发 Web 应用程序变得轻而易举。 Bun 和 HTMX 是目前软件领域最有趣的两个事情。 Bun 是一个速度极快的一体化服务器端 JavaSc…

如何创建一个TCP多人聊天室?

一、什么是TCP&#xff1f; TCP&#xff08;Transmission Control Protocol&#xff09;是一种可靠的 面向连接的协议 &#xff0c;可以保证数据在传输过程中不会丢失、重复或乱序。 利用TCP实现简单聊天程序&#xff0c;需要客户端和服务器端之间建立TCP连接&#xff0c;并通…

STC8H8K64U 学习笔记 - 位运算

STC8H8K64U 学习笔记 -位运算 环境说明引脚说明 位运算实例 环境说明 该内容仅针对我自己学习的开发板做的笔记&#xff0c;在实际开发中需要针对目标电路板的原理图进行针对性研究。 芯片&#xff1a;STC8H8K64U烧录软件&#xff1a;stc-isp-v6.92G编码工具&#xff1a;天问 …

蚂蚁退地,房价猛跌

蚂蚁退地&#xff0c;房价猛跌 2020年-2021年&#xff0c;蚂蚁集团先后拿下之江度假区钱塘江岸 XH1710-B1/B2-23 和 XH1708-02 地块。 一时间&#xff0c;"蚂蚁集团坐拥大量土地&#xff0c;欲打造全球总部"的消息传遍全国&#xff0c;之江板块房价连夜猛涨&#xff…

MATLAB近红外光谱分析技术应用

郁磊副教授&#xff0c;主要从事MATLAB编程、机器学习与数据挖掘、数据可视化和软件开发、生理系统建模与仿真、生物医学信号处理&#xff0c;具有丰富的实战应用经验&#xff0c;主编《MATLAB智能算法30个案例分析》、《MATLAB神经网络43个案例分析》相关著作。已发表多篇高水…

【Python语法实例】-12猜单词游戏

一、游戏背景与需求 猜单词游戏是一种经典的文字游戏,玩家需要通过提示的字母组合,猜出正确的单词。这个游戏不仅考验玩家的词汇量和推理能力,还能在娱乐中提升编程技能。我们的目标是创建一个简单易懂的猜单词游戏,让玩家在享受游戏乐趣的同时,也能感受到Python编程的实…

C# MES通信从入门到精通(8)——C#调用Webservice服务进行数据交互

前言 在上位机开发领域,使用webservice来访问客户的终端Mes系统是一项必备的技能,本文详细介绍了如何在c#中调用webservice服务,不仅介绍了使用添加服务引用直接调用webservice中的方法外还介绍了使用http的post方法调用webservice方法,过程详细且均为实战经验总结,对于初…

港口核心!达梦数据助力上港集团罗泾码头 I-TOS 系统升级改造

港口作为交通运输的枢纽和联通世界的窗口&#xff0c;肩负着带动区域经济发展及服务国际经贸的双重责任。在信息化浪潮推动下&#xff0c;自动化、数字化、智能化成为港口航运业转型发展的关键。 达梦数据积极推进港口数字化转型升级 &#xff0c;助力上港集团罗泾码头实现 I-T…

iOS Widget Custom Intent 去除邮件警告

当实现了可编辑小组件功能后,打包上传到app store,收到了苹果发来的邮件。 邮件详情 Hello, We noticed one or more issues with a recent delivery for the following app: • Version 4.0.5 • Build 116 Although delivery was successful, you may want to correct the …

青蛙过河(二分+前缀和)

题目描述 小青蛙住在一条河边&#xff0c;它想到河对岸的学校去学习。小青蛙打算经过河里的石头跳到对岸。 河里的石头排成了一条直线&#xff0c;小青蛙每次跳跃必须落在一块石头或者岸上。不过&#xff0c;每块石头有一个高度&#xff0c;每次小青蛙从一块石头起跳&#xf…

[问题记录] oracle问题汇总记录

plsql问题 1、oracle-initialization error could not locate OCI.dll 下载plsql客户端后&#xff0c;登录显示如图所示的错误 解决方法&#xff0c;点击下方链接&#xff0c;下载64位客户端 Instant Client for Microsoft Windows (x64) 64-bit (oracle.com) 2、显示中文乱…

深度学习训练中“num_workers”的作用

在深度学习训练中&#xff0c;num_workers是一个常见的参数&#xff0c;特别是在使用数据加载器&#xff08;如PyTorch的DataLoader&#xff09;时。num_workers指定了用于数据加载的子进程数量。这个参数对于提高数据加载的效率和加速训练过程至关重要。 num_workers的作用&a…

【资源分享】最全ChatGPT镜像免梯子

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

LeetCode 707. 设计链表(单链表、(非循环)双链表 模板)

你可以选择使用单链表或者双链表&#xff0c;设计并实现自己的链表。 单链表中的节点应该具备两个属性&#xff1a;val 和 next 。val 是当前节点的值&#xff0c;next 是指向下一个节点的指针/引用。 如果是双向链表&#xff0c;则还需要属性 prev 以指示链表中的上一个节点…