Java_抽象类和接口(一)

news2025/7/11 8:01:36

作者:爱塔居的博客_CSDN博客-JavaSE领域博主

专栏:JavaSE

作者简介:大三学生,希望跟大家一起进步!

文章目录

目录

文章目录

一、抽象类

1.1 抽象类概念

1.2 抽象类语句

1.3 抽象类特性

1.4 抽象类和普通类的区别

1.5 抽象类的作用

二、接口

2.1 接口的概念

2.2 语法规则

2.3 接口使用

 2.3 接口特性

 2.5 实现多个接口

 三、抽象类和接口的区别

总结


一、抽象类

1.1 抽象类概念

抽象类:一个类中没有包含足够的信息来描绘一个具体的对象。

class Shape{
    public void shape(){
        System.out.println("画图形");
    }
}
class Star extends Shape{
    @Override
    public void shape() {
        System.out.println("⭐");
    }
}
class Heart extends Shape{
    @Override
    public void shape() {
        System.out.println("❤");
    }
}
class Sun extends Shape{
    @Override
    public void shape() {
        System.out.println("☀");
    }
}
class Main{
    public static void main(String[] args) {
Shape shape=new Star();
shape.shape();
    }
}

比如这个代码中的,Shape类 。虽然Shape类中也存在shape的方法,但是Shape类不是具体的图形,因此其内部的shape方法实际是无法实现的,因此可以被设计为“抽象类”。

1.2 抽象类语句

🎊在java中,一个类如果被abstract修饰称为抽象类。抽象类中被abstract修饰的方法称为抽象方法,抽象方法不用给出具体的实现体。

abstract class Shape{//抽象类
   public abstract void shape();//抽象方法
}
class Star extends Shape{
    @Override
    public void shape() {
        System.out.println("⭐");
    }
}
class Heart extends Shape{
    @Override
    public void shape() {
        System.out.println("❤");
    }
}
class Sun extends Shape{
    @Override
    public void shape() {
        System.out.println("☀");
    }
}
class Main{
    public static void main(String[] args) {
    Shape shape=new Star();
    shape.shape();
    }
}

1.3 抽象类特性

🎀1.抽象类使用abstract修饰类

2.抽象类不能被实例化

abstract class Shape{//抽象类
   public abstract void shape();//抽象方法
}

class Main{
    public static void main(String[] args) {
    Shape shape=new Shape();//实例化抽象类
    }
}

编译错误: 

3.在抽象类当中,可以有抽象方法或者非抽象方法。抽象类当中不一定有抽象方法。

4.抽象方法:一个方法被abstract修饰,没有具体的实现。只要包含抽象方法,这个类必须是抽象类

5.当一个普通类继承了这个抽象类,必须重写类当中的抽象方法。当一个子类没有重写抽象的父类的方法,可以把当前子类变成abstract修饰。

abstract class Shape{
public abstract void shape();
}
abstract class Star extends Shape{
//public void shape(){
//    System.out.println("⭐");
//}
}
class C extends Star{
    public void shape(){
        System.out.println("⭐");
    }
}
class Main{
    public static void main(String[] args) {
     Shape star=new C();
     star.shape();
    }
}

6.抽象类存在的最大意义是为了被继承。

7.抽象方法不能被private,final,static修饰,否则无法被重写

abstract class Shape{
   private abstract void shape();
}
class Star extends Shape{
    @Override
    public void shape() {
        System.out.println("⭐");
    }
}

class Main{
    public static void main(String[] args) {
    Shape shape=new Star();
    }
}

编译错误:

8.抽象类中可以有构造方法。 

1.4 抽象类和普通类的区别

🍓1.抽象类不能实例化,普通类可以

2.抽象类当中,可以包含非抽象类方法和抽象类方法。而普通类只能包含非抽象方法

1.5 抽象类的作用

抽象类本身不能被实例化 , 要想使用 , 只能创建该抽象类的子类 . 然后让子类重写抽象类中的抽象方法。所以,使用抽象类相当于多了一重编译器的校验。🍏实际工作不应该由父类来完成,而应由子类完成。 如果不小心误用成父类 , 使用普通类编译器是不会报错的。 但是父类是抽象类就会在实例化的时候提示错误 , 让我们尽早发现问题。

二、接口

2.1 接口的概念

在现实生活中,接口的例子比比皆是,比如:笔记本上的USB接口,电源插座等。

电脑的USB接口上,可以插:U盘、鼠标、键盘……所有符合USB协议的设备

电源插座插孔上,可以查:电脑、电视机、电饭煲……等所有符合规范的设备

通过上述例子可以看出:接口就是公共的行为规范标准。大家在实现时,只要符合规范标准,就可以通用。

🍰在java中,接口可以看成是多个类的公共规范,是一种引用数据类型。

2.2 语法规则

interface 接口名称{

//抽象方法

public abstract void method1();//public abstract 是固定搭配,可以不写

public void method2();

abstract void method3();

void method4();

//注意:在接口中上述写法都是抽象方法,更推荐mothod4,代码更简洁
}

🌮注意:

1.创建接口时,接口的命名一般以大写字母I开头

2.接口的命名一般使用“形容词”词性的单词

3.阿里编码规范中约定,接口中的方法和属性不要加任何修饰符号,保持代码的简洁性 

2.3 接口使用

class 类名称 implement 接口名称{

……

}

注意:子类和父类之间是extends继承关系,类与接口之间是implements实现关系

interface USB{//建立接口
    void openDevice();//抽象方法
    void closeDevice();
}
 class Mouse implements USB{//使用接口
    @Override//重写USB类中的抽象方法
    public void openDevice() {
        System.out.println("开机");
    }
     public void closeDevice() {
         System.out.println("关机");
     }
}
public class Computer {//测试接口
    public static void control(USB usb){
        usb.openDevice();
        usb.closeDevice();
    }
    public static void main(String[] args) {
    USB usb=new Mouse();
    control(usb);
    }
}

 2.3 接口特性

1.接口类型是一种引用类型,但是不能直接new接口的对象

interface USB{//建立接口
    void openDevice();//抽象方法
    void closeDevice();
}
 class Mouse implements USB{//使用接口
    @Override//重写USB类中的抽象方法
    public void openDevice() {
        System.out.println("开机");
    }
     public void closeDevice() {
         System.out.println("关机");
     }
}
public class Computer {//测试接口
    public static void control(USB usb){
        usb.openDevice();
        usb.closeDevice();
    }
    public static void main(String[] args) {
    USB usb=new USB();
    }
}

编译错误:

2.接口中的每一个方法都是public的抽象方法,即接口中的方法会被隐式地指定为public abstract(只能是 public abstract ,其他修饰符都会报错)

 我们可以看到第二行的代码,我多写了public abstract ,然后它变灰色的,这就说明已经默认接口中的方法是public abstract修饰的。

第三行代码,我把public 改成了protect,然后编译错误。

3.接口中的方法是不能在接口中实现的,只能由实现接口的类来实现

 4.接口中可以含有变量,但是接口中的变量会被隐式地指定为public static final 变量

interface USB{//建立接口
   int a=1;
   void openDevice();//抽象方法
    void closeDevice();
}
 class Mouse implements USB{//使用接口
    @Override//重写USB类中的抽象方法
    public void openDevice() {
        System.out.println("开机");
    }
     public void closeDevice() {
         System.out.println("关机");
     }
}
public class Computer {//测试接口
    public static void control(USB usb){
        usb.openDevice();
        usb.closeDevice();
    }
    public static void main(String[] args) {
    USB usb=new Mouse();
    USB.a=3;
    }
}

 编译错误:

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

 6.接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class

7.如果类没有实现接口中的所有抽象方法,则类必须设置为抽象类

8.在jdk8中,接口中还可以包含default方法

 这个样子,接口中的方法,写了内容也不会报错了。

 2.5 实现多个接口

Java 中,类和类之间是单继承的。但一个类可以实现多个接口,接口与接口之间可以多继承。即:用接口可以达到多继承的目的。 接口可以继承一个接口, 达到复用的效果 . 使用 extends 关键字 .
class Animal{
 String name;
    public Animal(String name) {
        this.name = name;
    }
    public void fly(){
        System.out.println(name+"会飞");
    }
    public void run(){
        System.out.println(name+"会跑");
    }
}
interface Irunning{
    void run();
}
interface Iflying{
    void fly();
}
interface Isiwmming{
    void swim();
}
class Bird extends Animal implements Iflying {
    public Bird(String name) {
        super(name);
    }
 public void fly(){
     System.out.println(name+"会飞");
 }
}
class Rabbit extends Animal implements Irunning {
    public Rabbit(String name) {
        super(name);
    }
    public void run(){
    System.out.println(name+"会跑");
}
}
class Flog extends Animal implements Irunning,Isiwmming{
    public Flog(String name) {
        super(name);
    }
    public void run(){
        System.out.println(name+"会跑");
    }
    public void swim(){
        System.out.println(name+"会游泳");
    }
}
public class Test {
    public static void fly(Bird bird){
        bird.fly();
    }
    public static void run(Rabbit rabbit){
        rabbit.run();
    }
    public static void run(Flog flog){
        flog.run();
    }
    public static void swim(Flog flog){
        flog.swim();
    }
    public static void main(String[] args) {
Bird bird=new Bird("小鸟");
fly(bird);
Rabbit rabbit=new Rabbit("小兔子");
run(rabbit);
Flog flog=new Flog("小青蛙");
run(flog);
swim(flog);
    }
}

输出结果:

 三、抽象类和接口的区别

抽象类和接口都是 Java 中多态的常见使用方式 . 都需要重点掌握 . 同时又要认清两者的区别 ( 重要 !!! 常见面试题 ).
🍝
核心区别 : 抽象类中可以包含普通方法和普通字段 , 这样的普通方法和字段可以被子类直接使用 ( 不必重写 ), 而接口中不能包含普通方法, 子类必须重写所有的抽象方法

总结

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

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

相关文章

赞不绝口!仅靠阿里P9分享的 Redis 工作手册,拿到60W年薪Offer

昨晚有六七位小伙伴告诉我说:“大佬,有没有Redis的面试教程啊,最近面试被问到好多” 这就帮小伙伴们专门整理了一份资料(不仅仅是面试题),从Redis核心原理到Redis设计与源码帮助大家梳理体系,快…

教你自己写Arcpy批处理程序

自己写Arcpy批处理栅格和矢量 先上代码,讲解各行代码的意思,从而达到自己写代码的目的 #....Edit by Longhao Wang.... import arcpy from arcpy import env from arcpy.sa import * import os import os.path import sys arcpy.env.workspace"D:…

Vue项目开发经验

文章目录前言网页组件echarts使用打包后显示包体积安装tensorflow和anaconda可能出现的错误![在这里插入图片描述](https://img-blog.csdnimg.cn/c1facd95a7f645c5af3e8dc1237913a3.png)总结前言 本博客仅做学习笔记,如有侵权,联系后即刻更改 科普&…

《调试九法》阅读笔记

1. 理解系统 阅读手册、仔细阅读每个细节、掌握基础知识、了解工作流程、了解工具。 2. 制造失败 制造失败、从头开始、引发失败、但不要模拟失败、查找不受你控制的条件、记录每件事情,并找到间歇性bug特征、不要过于相信统计数据、要认识到“那”是可能会发生的…

[附源码]java毕业设计商场日常维修管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【云原生】k8s 中的 hostNetwork 和 NetworkPolicy(网络策略)讲解与实战操作

文章目录一、hostNetwork 介绍二、k8s 网络策略 NetworkPolicy三、Pod 隔离的两种类型四、NetworkPolicy 资源1)NetworkPolicy 示例演示2)选择器 to 和 from 的行为五、总结一、hostNetwork 介绍 在k8s中,若pod使用主机网络,也就是…

UE5笔记【四】UE5主材质Master Materials和材质实例MI

上一篇我们讲解了关于鹅卵石的纹理材质。 假设:如果我们在关卡中每个材质都这么连接的话,那么将使得整个世界非常复杂,并且将浪费大量的时间。对此,解决方案是:主材质:master Materials。 新建一个新关卡…

springboot基于java的个性化推荐的电商购物商城平台设计与实现

本文主要探讨了个性化推荐的电商平台的设计与实现。并对其详细的设计方案、实现技术和运行情况做了分析和研究,最后对未来的工作做了研究与探讨。本文重点研究了以下几个方面: (1)系统的体系结构、主要功能模块、主要数据的工作流…

次元裂缝已打开,AI绘画突飞猛进,其潜力究竟有多大

目录 次元裂缝已打开 AI绘画 起源 人工智能画的画在美术比赛得第一名 原理 关键的CLIP 总结 次元裂缝已打开 #次元裂缝已打开#的一个话题火了~大量新人老玩家共赴无界AI 上面是AI绘画根据真实图片合成的图片与真图的对比,可以看出还原度还是很高的&#xff…

JUC学习笔记——共享模型之无锁

在本系列内容中我们会对JUC做一个系统的学习,本片将会介绍JUC的无锁 我们会分为以下几部分进行介绍: 无锁操作CAS与Volatile原子类型原理篇Unsafe 并发无锁操作 这一小节我们将讲解如何用无锁操作完成并发操作 问题展现 我们给出一段之前并发展示代…

机器人学优质资源

引言 实验室闲着查资料,发现西北大学有个很好的机器人学线上资源课程,Coursera上也有,记录一下,感觉还挺全的,而且GitHub上也开放了很多相应的学习资源。 Coursera的视频: Modern Robotics: Mechanics, Pla…

GitHub标星75k,阿里15W字的Spring高级文档(全彩版),真的太香了

随着 Spring 使用越来越广泛,Spring 已经成为 Java 程序员面试的必问知识点,很多同学对于Spring理解不是那么的深刻,经常就会被几个连环追问给干趴了! 今天小编整理了一下一线架构师的Spring源码高级文档:SpringSprin…

Java三大特征之一——继承

继承继承概述、使用继承的好处继承得儿设计规范,内存运行原理继承的特点继承后:成员变量、成员方法的访问特点继承后:方法重写继承后:子类构造器的特点继承后:子类构造器访问父类有参数构造器this、super总结继承概述、…

挂耳耳机十大品牌排行榜哪个好,目前排行靠前的五款耳机推荐

耳机作为生活的必需品,随着我们生活水平的提高,对于耳机的需求也随之加强,既需要在运动中使用,又要能够在日常佩戴照常无误,那么在此我的建议是对于防水性能一定要高,毕竟高的防水能够抵挡运动中的汗水&…

WPF MVVM

WPF MVVM MVVMModelViewViewModel Model:现实世界中对象抽象的结果,也就是实体模型View:UI界面ViewModel:为UI界面服务的模型,可以理解为数据传输对象(DTO) ViewModel和View的沟通有两个方面:数据和操作传递数据–使…

“综合”web项目编写------手把手0基础教学(二)

上一节介绍了编写综合项目的基本流程 “综合”web项目编写------手把手0基础教学(一) 这里将继续介绍项目的编写,一个一个功能挨个实现。 目录 实现用户的登录功能 一 . 编写工具包---封装数据库链接 二 . 构建数据模型 三 . 构建功能…

ASEMI代理艾赛斯IGBT管IXYB82N120C3H1

编辑-Z 艾赛斯IGBT管IXYB82N120C3H1参数: 型号:IXYB82N120C3H1 漏极-源极电压(VCES):1200V 连续漏电流(IC):82A 功耗(PC):1040W 工作结温度…

spring cloud在bootstrap.properties配置spring.profiles.active无效

bootstrap.properties 配置 bootstrap.properties spring.profiles.activeprofiles.active bootstrap-dev.properties / bootstrap-test.properties #服务器地址 spring.cloud.nacos.config.server-addr127.0.0.1:8848 #项目的命名空间的ID spring.cloud.nacos.config.name…

m基于FPGA和MATLAB的数字CIC滤波器设计和实现

目录 1.算法概述 2.仿真效果预览 3.MATLAB/FPGA部分代码预览 4.完整MATLAB/FPGA程序 1.算法概述 CIC滤波器由一对或多对积分-梳状滤波器组成,在抽取CIC中,输入信号依次经过积分,降采样,以及与积分环节数目相同的梳状滤波器。在…

Facebook账号复审的问题。

Facebook账号复审主要指的就是: Facebook个人广告账号,或者是你的企业bn广告系统当中的 Facebook投手号。在投放广告的过程当中,因为违规。或者其他原因。 Facebook需要审核这个Facebook账号的主体。简单的说就是他的合法性。 所以会要求你。…