当前位置: 首页 > news >正文

一个小时搞定JAVA面向对象(5)——抽象与接口

文章目录

  • 抽象
      • 抽象的注意事项
        • static\final\private是否可以修饰抽象方法
        • 继承和抽象知识点回顾
  • 接口
      • 接口实现总结
      • 抽象方法
      • 默认方法
      • 静态方法
      • 成员变量
      • 接口的特点
      • 接口和抽象类的区别

抽象

  1. 关键字: abstract

  2. 抽象方法:
    修饰符 abstract 返回值类型 方法名(参数);

  3. 抽象类:
    public abstract class 类名{ }

public abstract calss pet{String name;/*父类中的方法,我们可以仅仅定义为一个声明,具体的实现交给子类去实现*/public abstract void eat();
}

注意:
a.抽象方法所在的类一定是抽象类
b.抽象类中不一定非得有抽象方法
c.子类继承父类之后,需要重写父类
中所有的抽象方法,不然编译报错
d.抽象类不能new对象,只能通过new子类对象调动重写方法

抽象的注意事项

  1. 抽象类不能直接new对象,只能创建非抽象子类的对象
  2. 抽象类中不一定非得有抽象方法,但是抽象方法所在的类一定抽象类
  3. 抽象类的子类,必须重写父类中的所有抽象方法,否则,编译报错,除非该子类也是抽象类
  4. 抽象类中可以有成员变量,构造,成员方法
  5. 抽象类中可以有构造方法,是供子类创建对象时,初始化父类属性使用的
  6. 抽象类虽然不能被实例化,但是可以通过多态的方法来赋值
  7. 作为抽象类的子类

没有抽象方法的抽象类意义是啥?

为了不让外界创建对象,被实例化.

static\final\private是否可以修饰抽象方法
  1. **static和abstract:**是不能够共存的。static是为方便调用,abstract为了给子类重写的,没有方法体
  2. **final和abstract:**是相互冲突的,final修饰的方法不能被重写,而abstract修饰的方法就是为了让子类重写的。
  3. **private和abstract:**也是冲突的,private修饰
继承和抽象知识点回顾
  1. 继承:子类继承父类,可以直接使用父类中非私有成员,子类不用写重复性代码
  2. 关键字: extends
  3. 成员访问特点:
  4. 成员变量:看等号左边是谁
  5. 成员方法:看new的是谁
  6. 方法的重写:子类中有一个和父类从方法名以及参数列表上一样的方法
  7. 检测:@Override
  8. 使用场景:功能的升级
  9. 继承中构造的特点:
  10. new子类对象先初始化父类
  11. super:代表的是父类引用
  12. 调用父类构造:super() super(实参)
  13. 调用父类成员变量: super.成员变量名
  14. 调用父类成员方法:super.成员方法名(实参)

7.this:代表的是当前对象(哪个对象调用的this所在的方法,this就代表哪个对象)

​ a.作用:区分重名的成员变量和局部变量

​ b.使用:

​ 调用当前对象构造:this() this(实参)

​ 调用当前对象成员变量:this.成员变量名

​ 调用当前对象成员方法:this.成员方法名(实参)

​ c.注意:在构造中使用this和super,都必须要在第一行,所以两者不能同时出现

8.继承的特点:

​ a.继承只支持单继承,不支持多继承

​ b.继承支持多层继承

​ c.一个父类可以拥有多个子类

9.抽象:

​ a.抽象方法: 修饰符 abstract 返回值类型 方法名(形参)

​ b.抽象类:public abstract class 类名{}

​ c.特点:

​ 抽象方法所在的类一定是抽象类

​ 抽象类中不一定非得有抽象方法

​ 子类继承抽象父类时,需要重写抽象方法

​ 抽象类不能new对象,只能new子类对象

​ 抽象类中啥都可以有,私有属性,构造,其他方法等

​ 抽象类中的构造是供创建子类对象时初始化父类属性使用的

接口

  1. 接口是一个引用数据类型

  2. 关键字:

    1. interface接口

      public interface 接口名{ }
      
    2. implements实现

      实现类 implements 接口名{ }
      
  3. 接口中可以定义的成员:

    1. JDK7以及比之前:
      1. 抽象方法
        public abstract ( 即使不写public abstract,默认也有)
      2. 成员变量
        public static final 数据类型 变量名 = 值
        (即使不写public static final,默认也有)
        (final是最终的,被final修饰的变量不能二次赋值,所以我们一般将final修饰的变量视为常量)
    2. JDK8:
      1. 默认方法
        public default 返回值类型 方法名(形参){}
      2. 静态方法
        public static 返回值类型 方法名(形参){}
    3. JDK9开始:
      1. 私有方法
        1. private的方法(实际开发中用的不是特别多)

接口实现总结

  1. 定义接口:public interface 接口名{ }
  2. 实现:public class 实现类类名 implements 接口名{ }
  3. 使用方法:
    1. 实现类实现接口
    2. 重写接口中的抽象方法
    3. 创建实现类对象(接口不能new对象)
    4. 调用重写的方法
//接口实现代码案例
public interface USB {	//定义接口public abstract void open();public abstract void close();
}public class Mouse implements USB{	//定义接口实现类@Overridepublic void open() {System.out.println("鼠标打开");}@Overridepublic void close() {System.out.println("鼠标关闭");}
}public class Test01 {	//测试类public static void main(String[] args) {Mouse mouse = new Mouse();mouse.open();mouse.close();}
}

抽象方法

  1. 定义格式:public abstract 返回值类型 方法名(形参)
  2. 注意事项:不写public abstract默认也是有的
  3. 使用方法:
    1. 定义实现类\实现接口
    2. 需要重写抽象方法
    3. 创建实现类对象,调用重写的方法
public interface USB {//定义抽象方法public abstract void open();String close();
}//调用抽象方法制作实现类
public class Mouse implements USB{@Overridepublic void open() {System.out.println("鼠标打开");}@Overridepublic String close() {return "鼠标关闭";}
}public class Test01 {public static void main(String[] args) {Mouse mouse = new Mouse();mouse.open();String result = mouse.close();System.out.println("result = " + result);}
}

默认方法

  1. 定义格式:

    public default 返回值类型 方法名(形参){方法体return 结果
    }
    
  2. 使用方法:

    1. 定义实现类\实现接口
    2. 默认方法可以重写,也可以不重写
    3. 创建实现类对象,调用默认方法

静态方法

  1. 定义格式:

    public static 返回指类型 方法名(形参){方法体retuan 结果
    }
    
  2. 使用方法:

    1. 接口名直接调用

默认方法和静态方法的作用:

可以作为临时加的一个小功能来使用

public interface USB {//默认方法public default void methodDef(){System.out.println("我是默认方法");}
}
public class Mouse implements USB {//默认方法public default void methodDef(){System.out.println("我是默认方法");}//静态方法public static void methodSta(){System.out.println("我是接口中的静态方法");}//重写默认方法@Overridepublic void methodDef(){System.out.println("我是重写接口中的默认方法");}
}
public class Test01 {public static void main(String[] args) {Mouse mouse = new Mouse();mouse.methodDef();System.out.println("=============");USB.methodSta();静态方法可以直接调用接口名}
}

成员变量

  1. 定义格式:

     public static final 数据类型 变量名 =
  2. 使用方法:

    1. 接口名直接调用
    2. 可不写public static final ,默认会有
  3. 注意事项:

    1. static final修饰的成员变量需要手动赋值
    2. 习惯上我们将static final修饰的成员变量名称用大写
    public interface USB {public static final int NUM1 = 100;int NUM2 = 200;//不写public static final 默认也有
    }public class Test01 {public static void main(String[] args) {System.out.println(USB.NUM1);System.out.println(USB.NUM2);	//修饰的成员变量名称用大写}
    }
    

接口的特点

  1. 接口可以多继承

    public interface InterfaceA extends InterfaceB,InterfaceC{}
    
  2. 接口可以多实现

    public class InterfaceImpl implements InterfaceA,InterfaceB{}
    
    1. 当一个类实现多个接口时,如果接口中的抽象方法有重名并且参数一样,只需要重写一次

      public interface InterfaceA {public abstract void method();
      }public interface InterfaceB {public abstract void method();
      }public class InterfaceImpl implements InterfaceA,InterfaceB{@Overridepublic void method() {System.out.println("重写的method方法");}
      }
      
    2. 当一个类实现多个接口时,如果多个接口中的默认方法有重名的且参数一样,必须重写一次默认方法

      public interface InterfaceA {public abstract void method();public default void methodDef(){System.out.println("我是接口A中的默认方法");}
      }public interface InterfaceB {public abstract void method();/*    public default void methodDef(){System.out.println("我是接口B中的默认方法");}*/public default void methodDef(int a) {System.out.println("我是接口B中的默认方法");}
      }public class InterfaceImpl implements InterfaceA,InterfaceB{@Overridepublic void method() {System.out.println("重写的method方法");}/*    @Overridepublic void methodDef() {System.out.println("重写后的默认方法");}*/
      }public class Test01 {public static void main(String[] args) {InterfaceImpl anInterface = new InterfaceImpl();anInterface.methodDef();anInterface.methodDef(10);}
      }
  3. 一个子类可以继承一个父类的同时可以是实现一个或者多个接口

    public class Zi extends Fu implements  InterfaceA,InterfaceB{}
    
  4. 注意事项:

    1. 只要是父类中或者接口的抽象方法,子类或者实现类都要重写

接口和抽象类的区别

  • 相同点:

    1. 都位于继承体系,用于被其他类实现或者继承
    2. 都不能new
    3. 都包含抽象方法,其子类或者实现类都必须从重写这些抽象方法
  • 不同点:

    1. 抽象类:一般作为父类使用,可以有成员变量\构造\成员方法\抽象方法
    2. 接口:成员单一(一般抽取接口)抽取的都是方法,作为实现功能的大集合
    3. 类不能多继承,但是接口可以

java中类\抽象类\接口之间的区别:

  1. 类中不能有抽象方法
  2. 抽象类中可以有抽象方法,也可以有非抽象方法
  3. 接口中只能由抽象方法,接口中的所有方法均为public abstract

相关文章:

一个小时搞定JAVA面向对象(5)——抽象与接口

文章目录 抽象抽象的注意事项static\final\private是否可以修饰抽象方法继承和抽象知识点回顾 接口接口实现总结抽象方法默认方法静态方法成员变量接口的特点接口和抽象类的区别 抽象 关键字: abstract 抽象方法: 修饰符 abstract 返回值类型 方法名(参数); 抽象类: public a…...

图像关键特征描述方法-小目标

图像关键特征描述方法主要包括以下几种: SIFT(尺度不变特征变换): SIFT是一种广泛使用的特征描述方法,它通过尺度空间和梯度方向直方图来描述图像中的关键点。SIFT特征描述具有尺度不变性和旋转不变性,对于光照和视角变化也具有一定的鲁棒性。 SURF(加速稳健特征): SURF…...

【qt15】windeployqt 安装依赖

debug模式vs可以使用qt插件新建qt文件 D:\Qt15\5.15.2\msvc2019\bin\windeployqt.exe Warning: Cannot find Visual Studio installation directory, VCINSTALLDIR is not set.D:\Qt15\5.15.2\msvc2019\bin\windeployqt.exe .\filecopier.exeWindows PowerShell Copyright (C) …...

DETR论文重点

DETR就是 DEtection TRansformer 的缩写。 论文原名:End-to-End Object Detection with Transoformers。 重点有两个:端到端、Transformer结构 论文概述 注意:斜体的文字为论文原文,其他部分内容则是为增进理解而做的解释。 …...

slf4j等多个jar包冲突绑定的排查方法使用IDEA的maven help解决

1.安装 2.使用maven help解决,找到对应包存在的冲突 使用exclude直接解决即可...

MySQL主从的延迟怎么解决呢?

以下是一些减少或解决MySQL主从延迟的策略: 优化查询和索引: 确保所有的查询都经过优化,以减少主服务器上的负载。使用合适的索引来加速查询速度,减少锁的时间。 分散复制负载: 使用多个从服务器分散读取负载。使用并…...

【一百】【算法分析与设计】N皇后问题常规解法+位运算解法

N皇后问题 链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 给出一个nnn\times nnn的国际象棋棋盘,你需要在棋盘中摆放nnn个皇后,使得任意两个皇后之间不能互相攻击。具体来说,不能存在两个皇后位于同…...

GPT-4:人工智能领域的新里程碑

近期,OpenAI推出了备受瞩目的GPT-4。作为GPT系列的最新成员,GPT-4在自然语言处理(NLP)领域再次刷新了记录,引发了广泛的关注和讨论。在试用GPT-4之后,我深感其在技术能力、应用场景等方面都取得了显著的进步…...

mysql inset bug

在 SQL 中,日期值需要用单引号包围,这是因为 SQL 将日期值视为字符串格式。数据库引擎在处理这些值时会将它们解析为适当的日期类型。如果不使用单引号,数据库引擎会将它们视为数字或列名,从而导致语法错误。 日期格式 MySQL 支…...

oracle查看序列

在Oracle数据库中,查看序列的方式主要有以下几种: 查看当前用户下的所有序列名称: sql复制代码 SELECT sequence_name FROM user_sequences; 查看所有用户的序列: sql复制代码 SELECT sequence_name FROM all_sequences; 查看…...

flask-slqalchemy使用详解

目录 1、flask-sqlalchemy 1.1、flask_sqlalchemy 与sqlalchemy 的关系 1.1.1、 基本定义与用途 1.2、flask_sqlalchemy 的使用 1.2.1、安装相关的库 1.2.2、项目准备 1.2.3、创建ORM模型 1.2.3.1、使用db.create_all()创建表的示例 1.2.3.2、创建多表关联ORM模型 1.…...

Scala学习笔记8: 包

目录 第八章 包1- 包2- 包的作用域3- 串联式包语句4- 包对象5- 引入end 第八章 包 在Scala中, 包(Package) 用于组织和管理代码, 类似与 Java 中的包 ; 包可以包含类、对象、特质等Scala代码, 并通过层次结构来组织代码 ; 可以使用 package 关键字来定义包, 并使用 . 来表示…...

分享一份糟糕透顶的简历,看看跟你写的一样不

最近看了一个人的简历,怎么说呢,前几年这么写没问题,投出去就有回复,但从现在开始,这么写肯定不行了。下面我给大家分享一下内容: 目录 🤦‍♀️这是简历文档截图 🤷‍♀️这是基本…...

VMware 三种网络模式

目录 一、网卡、路由器、交换机 二、虚拟网络编辑器 三、网络模式 1.桥接模式 通信方式 特点 配置 连通情况 使用场景 2.NAT模式 通信方式 特点 配置 连通情况 使用场景 3.仅主机 通信方式 特点 配置 连通情况 使用场景 一、网卡、路由器、交换机 网卡(Ne…...

红绿二分查找

《英雄算法零基础》之 二分查找 https://articles.zsxq.com/id_ib4xgs0cogic.html 在写模版之前我们先搞清楚二分查找是怎样运行的,我们把一个数组分成红绿两种颜色,可以理解为绿色就是符合情况的,红色就是不符合情况的(类似红绿灯…...

C51单片机 串口打印printf重定向

uart.c文件 #include "uart.h"void UartInit(void) //4800bps11.0592MHz {PCON | 0x80; //使能波特率倍速位SMODSCON 0x50; //8位数据,可变波特率。使能接收TMOD & 0x0F; //清除定时器1模式位TMOD | 0x20; //设定定时器1为8位自动重装方式TL1 0xF4; //设…...

PieCloudDB Database Flink Connector:让数据流动起来

面对客户环境中长期运行的各种类型的传统数据库,如何优雅地设计数据迁移的方案,既能灵活地应对各种数据导入场景和多源异构数据库,又能满足客户对数据导入结果的准确性、一致性、实时性的要求,让客户平滑地迁移到 PieCloudDB 数据…...

主机CPU访问PCIe设备内存空间和PCIe设备访问主机内存空间

在x86体系架构中,主机CPU访问PCIe设备内存空间和PCIe设备访问主机内存空间的过程涉及多个层次的地址映射和转换。以下是详细的解释: 主机CPU访问PCIe设备内存空间 1. CPU生成虚拟地址(Virtual Address, VA): 在x86架构中&#…...

在家AIAA(美国航空航天学会)文献如何查找下载

今天有位同学的求助文献来自AIAA(美国航空航天学会),下面就讲一下不用求助他人自己就可搞定文献下载的途径并实例操作演示。 首先我们先对AIAA(美国航空航天学会)数据库做个简单的了解: 美国航空航天学会…...

dnf手游版游玩感悟

dnf手游于5月21号正式上线,作为一个dnf端游老玩家,并且偶尔上线ppk,自然下载了手游版,且玩了几天。 不得不说dnf手游的优化做到了极好的程度。 就玩法系统这块,因为dnf属于城镇地下城模式,相比…...

AspectJ 在 Android 中的完整使用指南

一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

2023赣州旅游投资集团

单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐)​​ 在 save_images 方法中,​​删除或注释掉所有与 metadata …...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇

根据 QYResearch 发布的市场报告显示,全球市场规模预计在 2031 年达到 9848 万美元,2025 - 2031 年期间年复合增长率(CAGR)为 3.7%。在竞争格局上,市场集中度较高,2024 年全球前十强厂商占据约 74.0% 的市场…...

简单介绍C++中 string与wstring

在C中,string和wstring是两种用于处理不同字符编码的字符串类型,分别基于char和wchar_t字符类型。以下是它们的详细说明和对比: 1. 基础定义 string 类型:std::string 字符类型:char(通常为8位&#xff09…...

智警杯备赛--excel模块

数据透视与图表制作 创建步骤 创建 1.在Excel的插入或者数据标签页下找到数据透视表的按钮 2.将数据放进“请选择单元格区域“中,点击确定 这是最终结果,但是由于环境启不了,这里用的是自己的excel,真实的环境中的excel根据实训…...

Springboot多数据源配置实践

Springboot多数据源配置实践 基本配置文件数据库配置Mapper包Model包Service包中业务代码Mapper XML文件在某些复杂的业务场景中,我们可能需要使用多个数据库来存储和管理不同类型的数据,而不是仅仅依赖于单一数据库。本技术文档将详细介绍如何在 Spring Boot 项目中进行多数…...

5. TypeScript 类型缩小

在 TypeScript 中,类型缩小(Narrowing)是指根据特定条件将变量的类型细化为更具体的过程。它帮助开发者编写更精确、更准确的代码,确保变量在运行时只以符合其类型的方式进行处理。 一、instanceof 缩小类型 TypeScript 中的 in…...