分分钟搞定Java中的抽象类和接口!!!(abstract & interface)

这篇具有很好参考价值的文章主要介绍了分分钟搞定Java中的抽象类和接口!!!(abstract & interface)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java中的抽象类与接口

一、抽象类

1.抽象类的定义

概述:我们创建一个动物类,并且在这个类中创建动物对象,但是当你提到动物类,你并不知道我说的是什么动物,只有看到了具体的动物,你才知道这是什么动物,所以说动物本身并不是一个具体的事物,而是一个抽象的事物。只有真正的猫,狗才是具体的动物,同理我们也可以推理不同的动物,他们的行为习惯应该是不一样的,所以我们不应该在动物类中给出具体体现,而是给出一个声明即可。

概念:如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

2.如何定义一个抽象类

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

语法格式:

abstract class Shape {
    public int a;//抽象类成员变量
    abstract public void func();//抽象类成员方法 
}

抽象类中也可以有其他普通方法、普通成员、构造方法和被static修饰的成员变量.

abstract class Shape {
    //普通成员变量
    public int b;
    public static int num;
    private int a;
    protected int c;
    
    abstract public void func1();//抽象方法

    public void func2() {
        //普通方法
    }
    public Shape() {
        //构造方法
    }
}

3.关于抽象类的细节

(1)抽象类和普通类不一样,抽象类可以包含抽象方法。

(2)抽象方法是使用abstract修饰的(该方法不能被具体实现)。

(3)抽象类不能被实例化。

java abstract interface,My_Java,java,开发语言,算法,eclipse,idea

(4)如果一个普通类继承了一个抽象类,此时必须在普通类里面重写抽象类里面的抽象方法,否则报错。

Demo:

abstract class Shape {
    public abstract void func();
}
class Circle extends Shape{
    @Override
    public void func() {
        System.out.println("圆!");
    }
}

(5)如果一个抽象类A继承了抽象类B,此时类A当中不需要重写类B中的抽象方法,但如果类A再被普通类继承就需要重写类B中的抽象方法。

Demo:

abstract class B {
    public abstract void func();
}
abstract class A extends B {
    
}
class C extends A {
    @Override
    public void func() {
        
    }
}

(6)抽象方法不能是private修饰。

(7)抽象方法也不能被final、static修饰,因为该类被继承,此方法还要重写。

(8)重写抽象方法也要遵守重写的规则(public>protected>default>private)。

4.抽象类的作用

讲到这里,可能很多人会说,这抽象类怎么这么复杂,明明普通类就能搞定的事情,为什么还要存在抽象类?

其实这里是因为实际工作不应该由父类完成, 而应由子类完成. 那么此时如果不小心误用成父类
了, 使用普通类编译器是不会报错的. 但是父类是抽象类就会在实例化的时候提示错误, 让我们尽早发现问题。


二、接口

1.接口的概念

概念:接口(Interface),在Java编程语言中是一个抽象类型,是抽象方法的集合,接口用interface来声明,从而继承接口的抽象方法,在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。

2.语法形式

接口的定义格式与定义类的格式基本相同,将class关键字换成 interface 关键字,就定义了一个接口.

Demo:

interface A {
    public abstract void func1();
    
    void func2();
}

注:func1和func2的修饰访问权限符都是一样的,都是public abstract.

3.关于接口的细节

(1)接口当中的成员方法不能有具体的实现.

(2)从JDK1.8开始,允许在接口中有可以实现的方法,但只能被default修饰.

(3)接口中可以实现静态方法.

(4)接口中的成员变量默认是public static final 修饰的.

(5)接口也不能被实例化.

A a = new A();//会报错的

(6)类和接口之间用implements来实现多个接口,类中必须重写接口当中的抽象方法,其他的方法可以选择重写或者不重写.

(7)子类重写抽象方法,必须是public修饰(因为抽象方法默认是public abstract修饰,所以子类只能为public)

(8)接口当中不能有静态代码块和构造方法( 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错),所以不能含有静态代码块以及静态方法,不能有构造方法原因是因为接口不能被实例化所以就不能有构造方法) .

(9)如果一个类没有实现接口当中所有的抽象方法,则此类必须设置为抽象类(用abstract修饰),如果这个抽象类被其他类继承必须要重写.

4.代码演示

Demo:

interface A {
    void func1();
}
class B implements A {
    @Override
    public void func1() {
        
    }
}

一个类也可以实现多个接口,使用逗号隔开.

Demo:

interface A {
    void func1();
}
interface B {
    void func2();
}
class C implements A,B {
    public C() {
        super();
    }

    @Override
    public void func1() {

    }

    @Override
    public void func2() {

    }
}	

5.接口的使用

我们知道,如果某个设备需要向电脑中读取或者写入某些东西,这些设备一般都是采用USB方式与电脑连接的,我们发现,只要带有USB功能的设备就可以插入电脑中使用了,那么我们可以认为USB就是一种功能(接口),只要实现了USB标准的设备我们就认为它已经拥有了USB这种功能。下面是具体的例子:

Demo:

interface USB {
    void openEquipment();
    void closeEquipment();
}
class KeyBroad implements USB {
    @Override
    public void openEquipment() {
        System.out.println("正在打开键盘!");
    }
    @Override
    public void closeEquipment() {
        System.out.println("正在关闭键盘!");
    }
    public void inPut() {
        System.out.println("键盘正在输入!");
    }
}
class Mouse implements USB {
    @Override
    public void openEquipment() {
        System.out.println("正在打开鼠标!");
    }
    @Override
    public void closeEquipment() {
        System.out.println("正在关闭鼠标!");
    }
    public void click() {
        System.out.println("鼠标正在点击!");
    }
}
public class TestDemo {
    public static void main(String[] args) {
        //生成一个实现可USB接口(标准)的鼠标对象
        Mouse mouse = new Mouse();
        //调用Mouse里面的openEquipment方法
        mouse.openEquipment();
        //调用Mouse里面的click方法
        mouse.click();
        //调用Mouse里面的closeEquipment方法
        mouse.closeEquipment();
        System.out.println("=====================");
        //生成一个实现可USB接口(标准)的键盘对象
        KeyBroad keyBroad = new KeyBroad();
        //调用KeyBroad里面的openEquipment方法
        keyBroad.openEquipment();
        //调用KeyBroad里面的inPut方法
        keyBroad.inPut();
        //调用KeyBroad里面的closeEquipment方法
        keyBroad.closeEquipment();
    }
}


//执行结果:
正在打开鼠标!
鼠标正在点击!
正在关闭鼠标!
=====================
正在打开键盘!
键盘正在输入!
正在关闭键盘!

6.实现多个接口

在Java中,类和类之间是单继承的,一个类只能有一个父类,即Java中不支持多继承,但是一个类可以实现多个接
口。

接下来,我们用一组例子来演示:

Demo:

interface Flying {
    void flying();
}
interface Running {
    void running();
}
interface Swimming {
    void swimming();
}
class Animal {
    public String name;

    public Animal() {

    }
}
class Dog extends Animal implements Running,Swimming {
    public Dog(String name) {
        super();
        this.name = name;
    }

    @Override
    public void running() {
        System.out.println(name+"正在跑!");
    }

    @Override
    public void swimming() {
        System.out.println(name+"正在游泳!");
    }
}
class Bird extends Animal implements Flying {
    public Bird(String name) {
        super();
        this.name = name;
    }

    @Override
    public void flying() {
        System.out.println(name+"正在飞!");
    }
}
class Duck extends Animal implements Flying,Swimming,Running {
    @Override
    public void flying() {
        System.out.println(name+"正在飞");
    }

    @Override
    public void running() {
        System.out.println(name+"正在跑");
    }

    @Override
    public void swimming() {
        System.out.println(name+"正在游泳");
    }
    public Duck(String name) {
        super();
        this.name = name;
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Dog dog = new Dog("小黑");
        dog.running();
        dog.swimming();
        System.out.println("===========");
        Bird bird = new Bird("小翔");
        bird.flying();
        System.out.println("===========");
        Duck duck = new Duck("小嘎");
        duck.swimming();
        duck.flying();
        duck.running();
    }
}


//执行结果:
小黑正在跑!
小黑正在游泳!
===========
小翔正在飞!
===========
小嘎正在游泳
小嘎正在飞
小嘎正在跑

7.接口之间的继承

在Java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承,使用extends符号。即:用接口可以达到
多继承的目的。

举个例子,苹果和香蕉都是水果:

Demo:

interface Fruit{
    
}
interface Apple extends Fruit{
    
}
interface Banana extends Fruit {
    
}

三、抽象类和接口的区别

核心区别:抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中
不能包含普通方法, 子类必须重写所有的抽象方法.

区别 抽象类(abstract) 接口(interface)
结构组成 普通类(普通类能包含的抽象类都有)+抽象方法 抽象方法+全局变量
权限 各种权限 public
子类使用 使用extends继承抽象类 使用implements实现接口
关系 一个抽象类可以实现多个接口 一个接口可以使用extends继承多个接口
子类限制 一个子类只能继承一个抽象类 一个子类可以实现多个接口

好啦!本期的博客就到此结束了,如果各位小伙伴们或者发现博客知识点有问题,欢迎后台tt!!!


博主在这里祝大家:

前程似锦!!!!文章来源地址https://www.toymoban.com/news/detail-788733.html

到了这里,关于分分钟搞定Java中的抽象类和接口!!!(abstract & interface)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 搬运工让你分分钟了解Web接口测试

    百度说:接口泛指实体把自己提供给外界的一种抽象化物(可以为另一实体),用以由内部操作分离出外部沟通方法,使其能被内部修改而不影响外界其他实体与其交互的方式 上面这句有点抽象,网上的资料也是一大把,来自某个大佬的通俗解释: 设计概念的接口 就是一系

    2024年02月21日
    浏览(22)
  • 【羚珑AI智绘营】分分钟带你拿捏SD中的色彩控制

    颜色控制一直是AIGC的难点,prompt会污染、img2img太随机… 今天带来利用controlnet,实现对画面颜色的有效控制。都说AIGC是抽卡,但对把它作为工具而非玩具的设计师,必须掌握如何控制它,让我们一起开始可控AI生成。 大家或许已经通过各种《三分钟包会》《五分钟出道》的

    2024年02月08日
    浏览(23)
  • Linux 中某个目录中的文件数如何查看?这篇教程分分钟教会你!

    如果一个目录中文件数不是很多,那就可以一眼看出其中有多少个文件。但是如果计算子目录在内的文件数呢?或者如果文件数量很多,比如几百上千个,那么怎么确切地知道该目录下的文件数呢? 今天我们总结一下查看 Linux 中目录下文件数量的方法。 最简单的方法是使用

    2023年04月13日
    浏览(21)
  • 分分钟穿透手机,实现远程控制

    大家好,我是鸟哥。一个半路出家的程序员。 之前给大家分过一篇文章——一行命令就把女友们的手机彻底监控了~我可以为所欲为了...,教大家使用Scrcpy实现电脑对手机的无线监控(更确切的说应该是投屏),但是受限于只能在局域网下使用,这就非常鸡肋了。不过在文末

    2024年02月04日
    浏览(25)
  • 电脑上怎么进行pdf合并?这几招分分钟解决

    电脑上怎么进行pdf合并 ? 在现代办公中,PDF文件已经成为了我们处理文档的常用格式之一。有时候,我们需要将多个PDF文件合并成一个文件,以方便阅读或打印。那么,如何在电脑上进行PDF合并呢?下面就给大家介绍几种简单易行的方法,让你轻松搞定PDF合并。 方法一:使

    2024年01月20日
    浏览(23)
  • Python + Selenium,分分钟搭建 Web 自动化测试框架!

    在程序员的世界中,一切重复性的工作,都应该通过程序自动执行。 「自动化测试」就是一个最好的例子。 随着互联网应用开发周期越来越短,迭代速度越来越快,只会点点点,不懂开发的手工测试,已经无法满足如今的业务要求,只能被企业逐步裁员淘汰。 「自动化测试

    2024年02月02日
    浏览(47)
  • CSDN官方创作助手InsCode AI 教你分分钟搞定一篇好文章

    CSDN官方推出 创作助手InsCode AI 很多天了,有心人都能发现,在写作界面的右上角多了一个 创作助手 的浮动按钮,点击后出现如下界面: 现阶段是“限免”状态,不好好利用它来创作,就有点辜负CSDN官方大佬们的良苦用心了。 以主题“动态规划法”写一篇博客,以下是我用

    2024年02月05日
    浏览(23)
  • 【小白慎入】还在手动撸浏览器?教你一招分分钟自动化操作浏览器(Python进阶)

    大家好啊,辣条哥又来猛货了! 小白慎入! Puppeteer 是 Google 基于 Node.js 开发的一个工具,而 Pyppeteer 又是什么呢?它实际上是Puppeteer 的 Python 版本的实现,但它不是Google 开发的,是一位来自于日本的工程师依据Puppeteer 的一些功能开发出来的非官方版本。 在 Pyppetter 中,实际

    2024年02月16日
    浏览(34)
  • 近4w字吐血整理!只要你认真看完【C++编程核心知识】分分钟吊打面试官(包含:内存、函数、引用、类与对象、文件操作)

    🌈个人主页:godspeed_lucip 🔥 系列专栏:C++从基础到进阶 🏆🏆关注博主,随时获取更多关于C++的优质内容!🏆🏆 🍉配套markdown文件下载:请翻阅至文章底部获取 本阶段主要针对C++ 面向对象 编程技术做详细讲解,探讨C++中的核心和精髓。 C++程序在执行时,将内存大方向划

    2024年01月17日
    浏览(21)
  • Java 抽象类和接口

    登神长阶 第三阶 抽象类和接口 🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀 目录 🐕‍🦺 一.抽象类 🐱1.定义及其作用 🦌2.语法 🦙3.特性 🦏4.意义 🦛二.接口  🐀1.定义及其作用 🦦2.语法 🦘3.具体使用 🐰4.特性 🫏5.多个接口的实现 🐻‍❄️6.接

    2024年03月18日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包