Java----抽象类和接口

欢迎大家来这次博客-----抽象类和接口。 

1.抽象类

1.1 抽象类概念

在Java中我们都是通过类来描述对象,但反过来并不是所有的类都是用来描述对象的。当一个类中没有足够的信息来描述一个具体对象,我们就将该类称为抽象类

如上图中的Shape类,我们想通过Shape类中的draw()方法来实现画各种图形,但由于Shape类不是具体的图形,所以Shape类中的draw()方法也无法实现画各种图形,所以我们将Shape类设置成抽象类。

代码演示

abstract class Shape{public abstract void draw();
}
class Triangle extends Shape{@Overridepublic void draw() {System.out.println("画一个三角形");}
}
class Cycle extends Shape{@Overridepublic void draw() {System.out.println("画一个圆");}
}
class Rect extends Shape{@Overridepublic void draw() {System.out.println("画一个矩形");}
}
public class Test {public static void main(String[] args) {Shape[] shapes={new Triangle(), new Cycle(), new Rect()};for(Shape shape:shapes){shape.draw();}}
}

代码演示

abstract class Animal{public abstract void Bark();
}
class Dog extends Animal{@Overridepublic void Bark() {System.out.println("小狗在汪汪叫");}
}
class Cat extends Animal{@Overridepublic void Bark() {System.out.println("小猫在喵喵叫");}
}
public class Test {public static void func(Animal animal){animal.Bark();}public static void main(String[] args) {Dog dog=new Dog();func(dog);Cat cat=new Cat();func(cat);}
}

注意,如以上代码有些地方看不懂,后面回一 一介绍。

1.2 抽象类语法

在Java中,当一个类被关键字abstract修饰,该类就被称为抽象类,抽象类中如果有方法被abstract修饰,则该方法就被称为抽象方法,抽象方法不需要具体实现

//抽象类
abstract class Animal{//抽象方法public abstract void Bark();
}

注意事项:

抽象类中也可以包含普通的方法,甚至也可以包含构造方法。 

1.3 抽象类的特性

1. 抽象类不能实例化对象

2. 抽象方法不能被private修饰。

3. 抽象方法不能被final和static修饰,因为子类要重写抽象方法。

4. 抽象类必须被继承,继承抽象类的子类必须重写抽象类中的抽象方法。否则子类也是抽象类,必须用abstract修饰。

5. 抽象类中不一定有抽象方法,但有抽象方法的类一定是抽象类。

6. 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量。

1.4 抽象类的作用

抽象类本身是不能实例化的,要想使用抽象类,必须需要继承的子类重写抽象类中的抽象方法。

有人这时候就很疑惑,普通类不是也能被继承吗?

确实如此,但是使用抽象类多了一层编译器的校验。

如上面的代码,我们完成的操作都是由子类去完成的,但是如果交由父类去完成,普通编译器是不会报错的,但使用了抽象类,父类在实例化的时候就会报错,起到一个提醒的作用。

2. 接口

2.1 接口的概念

在生活中,接口比比皆是,如插座,USB插口。

接口通俗来说就是一种固定行为规范,只要你的操作符合规范,就能使用接口。

在Java中,接口可以看作为多个类的行为规范,是一种引用数据类型。 

2.2 接口的语法规则

关键字interface  接口名字

举例,如下图,

2.3 接口的特性

1.接口是一种引用数据类型,但是不能直接new关键字来创建对象。

2.接口中的每一个方法都是默认由public abstract 修饰的,也就是说接口中的方法不能被其他关键字修饰。(可以不写修饰接口中方法的关键字,编译器默认为public abstract)

3. 接口中的方法不能在接口中实现,只能在使用接口的类中实现。(有特殊情况)

 4. 如果接口中的方法被default或者static修饰,可以有具体实现。

5.  重写接口中的方法时,不能使用默认的访问权限。

6. 接口中可以含有变量,但会默认为被 public static final 修饰。  

7. 接口中不能含有静态代码块和构造方法

8.如果类中没有重写接口中所有的抽象方法,则该类要用abstract修饰

9.接口虽然不是类,但接口编译完成后的字节码文件的后缀也是 .java 。

2.4 接口的使用

接口不能直接使用,必须要有一个 “实现类” 来重写接口中的抽象方法,通过这个实现类来使用接口。

如果一个类想使用一个接口,要用到implements关键字。

语法格式

public class 类名称 implements 接口名称{// ...
}

注意:父类与子类之间的关系为extends,类与接口之间的关系为implements。

实现一个USB接口

interface USB{void close();void open();
}
class Mouse implements USB{@Overridepublic void close() {System.out.println("关闭鼠标");}public void open(){System.out.println("打开鼠标");}public void click(){System.out.println("点击鼠标");}
}
class KeyBoard implements USB{public void close(){System.out.println("关闭键盘");}@Overridepublic void open() {System.out.println("开启键盘");}public void input(){System.out.println("输入功能");}
}
class Computer implements USB{@Overridepublic void close() {System.out.println("关闭电脑");}public void open(){System.out.println("打开电脑");}public void use(USB usb){usb.open();if(usb instanceof Mouse){((Mouse) usb).click();}else{((KeyBoard)usb).input();}usb.close();}}
public class Test {public static void main(String[] args) {Computer computer=new Computer();computer.open();USB usb1=new Mouse();computer.use(usb1);System.out.println("=======");USB usb2=new KeyBoard();computer.use(usb2);computer.close();}
}

2.5  实现多个接口

一个类不能同时继承多个类,但是一个类可以同时使用多个接口。

举个例子:用Java来描述鸭子会飞,会游泳和会跑。

我们可以将会飞,会游泳,会跑设置为三个接口。

ISwimming接口

public interface ISwimming {void swim();
}

IRunning接口

public interface IRunning {void run();
}

IFly接口

public interface IFly {void fly();
}

Duck类

public class Duck extends Animal implements IFly,IRunning,ISwimming{public Duck(String name){super(name);}@Overridepublic void fly() {System.out.println(this.name+"会飞");}@Overridepublic void run() {System.out.println(this.name+"会跑");}@Overridepublic void swim() {System.out.println(this.name+"会游泳");}
}

测试类

public class Test {public static void main(String[] args) {Duck duck=new Duck("小鸭");duck.fly();duck.run();duck.swim();}
}

 快捷操作:CTRL+I键 快速实现接口

 使用接口的好处就是可以让程序员忘记类的限制,只需要关注该类有没有此接口对应的功能。

class Robot implements IRunning{@Overridepublic void run() {System.out.println("机器人再跑1");}
}
public class Test {public static void func(IRunning running){running.run();}public static void main(String[] args) {Duck duck=new Duck("小鸭");func(duck);Robot robot=new Robot();func(robot);}
}

如以上代码,我们给func函数穿的参数可以是Duck类,也可以是Robot类,只要这两个类具备跑的能力就行了。

2.6 接口之间的继承

在Java中,类与类之间只允许单继承,不允许多继承。但是对于接口来说,接口之间既可以单继承,也可以多继承。

接口之间的继承也是用到extends关键字。

 代码演示

interface Double extends IRunning,ISwimming{
}
class Dog implements Double{@Overridepublic void run() {System.out.println("狗会跑");}@Overridepublic void swim() {System.out.println("狗会游泳");}
}
public class Test {public static void main(String[] args) {Dog dog=new Dog();dog.run();dog.swim();}
}

到此,抽象类和接口的基础内容就介绍完了,感谢观看。

 

 

 

 

 

 

 

 

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

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

相关文章

通用Mapper基础学习

一、引入 二、快速入门 1.创建测试数据 2.搭建MyBatis+Spring 开发环境 3.集成Mapper 4.第一个操作 Mapper接口源码介绍: 创建测试类: 三、常见操作

统计信号处理基础 习题解答10-9

题目 某质检员的工作是监控制造出来的电阻阻值。为此他从一批电阻中选取一个并用一个欧姆表来测量它。他知道欧姆表质量较差,它给测量带来了误差,这个误差可以看成是一个的随机变量。为此,质检员取N个独立的测量。另外,他知道阻值…

FreeRTOS基础(十三):队列集

队列集(Queue Set)通常指的是一组队列,它们可以用于处理不同的任务或数据流。每个队列可以独立地处理自己的元素,但作为一个集群,它们可以协同工作来完成更复杂的任务。下面进行介绍。 目录 一、队列集简介 二、队列…

详解 Flink 的 ProcessFunction API

一、Flink 不同级别的 API Flink 拥有易于使用的不同级别分层 API 使得它是一个非常易于开发的框架最底层的 API 仅仅提供了有状态流处理,它将处理函数(Process Function )嵌入到了 DataStream API 中。底层处理函数(Process Func…

HarmonyOS开发-鸿蒙UiAbility 组件间跳转

前言 随着春节假期结束各行各业复产复工,一年一度的春招也持续火热起来。最近,有招聘平台发布了《2024年春招市场行情周报(第一期)》。总体来说今年的就业市场还是人才饱和的状态,竞争会比较激烈。 但是,…

Unity编辑器扩展,快捷键的使用

代码部分 编辑器界面 使用方法: 使用方法和如图1一样,只需要在Menuitem的路径后面加上标识符号就行。 "#"对应的是shift "&"对应的是Alt "%"对应的是ctrl 比如我图中的是,%#s对应的是CtrlShifts&…

基于51单片机的串口乒乓球小游戏

基于51单片机的乒乓球小游戏 (仿真+程序) 功能介绍 具体功能: 1.用两块单片机串口进行通信; 2.一排LED模拟乒乓球运动(哪里亮表示运动到哪); 3.当最左边LED亮,表示球…

【java、lucene、python】互联网搜索引擎课程报告二:建立搜索引擎

一、项目要求 建立并实现文本搜索功能 对经过预处理后的500个英文和中文文档/网页建立搜索并实现搜索功能对文档建立索引,然后通过前台界面或者已提供的界面,输入关键字,展示搜索结果前台可通过网页形式、应用程序形式、或者利用已有的界面…

Databricks Data Warehouse

Warehouse features 原来的data warehouse痛点: 用例不兼容的支持模型的安全和管理不兼容不相交和重复的数据 ETL workloads Streaming Architecture Data Science and ML

matplotlib 动态显示训练过程中的数据和模型的决策边界

文章目录 Github官网文档简介动态显示训练过程中的数据和模型的决策边界安装源码 Github https://github.com/matplotlib/matplotlib 官网 https://matplotlib.org/stable/ 文档 https://matplotlib.org/stable/api/index.html 简介 matplotlib 是 Python 中最常用的绘图…

js理解异步编程和回调

什么是异步 计算机在设计上是异步的。 异步意味着事情可以独立于主程序流发生。 当你打开一个网页,网页载入的过程,你又打开了编译器,那么你在网页载入时启动了编译器的行为就是计算机的异步, 可以看出计算机时一个超大的异步…

华为防火墙 1

华为防火墙1 实验拓扑: 实验步骤: 1.完成终端基本IP信息配置 2.配置防火墙: 2.1配置IP地址 sys Enter system view, return user view with CtrlZ. [USG6000V1]undo in e Info: Saving log files… Info: Information center is disabled. […

基于小波脊线的一维时间序列信号分解方法(MATLAB R2018A)

信号分解技术是把一个复杂信号分解为若干含有时频信息的简单信号,研可通过分解后的简单信号来读取和分析复杂信号的有效特征。因此,信号分解技术对分析结果的影响是不言而喻的。 傅里叶分解是早期常用的信号分解方法,最初被用于分析热过程&a…

JavaScript基础(十二)

截取字符串 //对象名.toLowerCase();将字符串转为小写 var strLAOWANG; strstr.toLowerCase(); console.log(str); //对象名.toUpperCase();将字符串转为大写 var str1laowang str1str1.toUpperCase(); console.log(str1); 截取字符串 //方法1:对象名.substr(a,b); …

Unity世界坐标下UI始终朝向摄像机

Unity世界坐标下UI始终朝向摄像机 1、第一种方法UI会反过来 void Update(){this.transform.LookAt(Camera.main.transform.position);}2、第二种方法 Transform m_Camera;void Start(){m_Camera Camera.main.transform;}void LateUpdate(){transform.rotation Quaternion.Lo…

kafka-生产者事务-数据传递语义事务介绍事务消息发送(SpringBoot整合Kafka)

文章目录 1、kafka数据传递语义2、kafka生产者事务3、事务消息发送3.1、application.yml配置3.2、创建生产者监听器3.3、创建生产者拦截器3.4、发送消息测试3.5、使用Java代码创建主题分区副本3.6、屏蔽 kafka debug 日志 logback.xml3.7、引入spring-kafka依赖3.8、控制台日志…

关于烫烫烫和屯屯屯

微较的msvc编译器,调试模式下为了方便检测内存的非法访问,对于不同的内存做了初始化, 未初始化栈: 0xCCCCCCCC 未初始化堆: 0xCDCDCDCD 已释放的堆: 0xDDDDDDDD 0xCCCC解释为GB2312字符即是烫&#xff…

Django 鸡与蛋问题

"Django 的鸡与蛋问题"通常指的是在开始 Django 项目时,你可能会遇到的一个困境:是先设计数据库模型还是先编写视图和控制器(即视图函数)? 这个问题的实质是在于,Django 的核心部分是由数据库模…

Qt5/6使用SqlServer用户连接操作SqlServer数据库

网上下载SQLServer2022express版数据库,这里没啥可说的,随你喜欢,也可以下载Develop版本。安装完后,我们可以直接连接尝试, 不过一般来说,还是下载SQLServer管理工具来连接数据更加方便。 所以直接下载ssms, 我在用的时候,一开始只能用Windows身份登录。 所以首先,我…

入门matlab

常识 如何建一个新文件 创建新文件,点击新建,我们就可以开始写代码了 为什么要在代码开头加入clear 假如我们有2个文件,第一个文件里面给x赋值100,第二个文件为输出x 依次运行: 结果输出100,这是因为它们…