首页 > 其他分享 >关于抽象类和接口(详解)

关于抽象类和接口(详解)

时间:2024-04-10 18:31:39浏览次数:25  
标签:name void 接口 abstract 详解 抽象类 public

关于抽象类和接口

一、抽象类

有些方法是抽象的,没有实际工作的方法, 我们可以把它设计成一个抽象方法,比如draw(画画),不能实例化对象。包含抽象方法的类我们称为 抽象类(abstract class)。

1.语法规则

 abstract class Shape { 
    abstract public void draw(); 
} 

(1)在 draw 方法前加上 abstract 关键字, 表示这是一个抽象方法. 同时抽象方法没有方法体(没有 { }, 不能执行具体代码)。
(2)对于包含抽象方法的类, 必须加上 abstract 关键字表示这是一个抽象类。

2.注意事项

  1. 抽象类不能直接实例化。
Shape shape = new Shape(); 
// 编译出错 
Error:(30, 23) java: Shape是抽象的; 无法实例化
  1. 抽象方法不能是 private 的。
abstract class Shape { 
    abstract private void draw(); 
} 
// 编译出错 
Error:(4, 27) java: 非法的修饰符组合: abstract和private 
  1. 抽象类中可以包含其他的非抽象方法, 也可以包含字段. 这个非抽象方法和普通方法的规则都是一样的, 可以被重写,也可以被子类直接调用。
abstract class Shape { 
    abstract public void draw(); 
    void func() { 
        System.out.println("func"); 
    } 
} 
class Rect extends Shape { 
    ... 
} 
public class Test { 
    public static void main(String[] args) { 
        Shape shape = new Rect(); 
        shape.func(); 
    } 
} 
// 执行结果 
func 

3.抽象类的作用

(1)抽象类存在的最大意义就是为了被继承。
(2)抽象类本身不能被实例化, 要想使用, 只能创建该抽象类的子类. 然后让子类重写抽象类中的抽象方法。
(3)使用抽象类的场景就如上面的代码, 实际工作不应该由父类完成, 而应由子类完成. 那么此时如果不小心误用成父类了,
(4)使用普通类编译器是不会报错的. 但是父类是抽象类就会在实例化的时候提示错误, 让我们尽早发现问题.
(5)很多语法存在的意义都是为了 “预防出错”, 例如我们曾经用过的 final 也是类似. 创建的变量用户不去修改, 不就相当于常量嘛? 但是加上 final 能够在不小心误修改的时候, 让编译器及时提醒我们.充分利用编译器的校验, 在实际开发中是非常有意义的.

二、接口

接口是抽象类的更进一步. 抽象类中还可以包含非抽象方法, 和字段. 而接口中包含的方法都是抽象方法, 字段只能包含静态常量.

1.语法规则

interface IShape { 
    void draw(); 
} 
class Cycle implements IShape { 
    @Override 
    public void draw() { 
        System.out.println("○"); 
    } 
} 
public class Test { 
    public static void main(String[] args) { 
        IShape shape = new Rect(); 
        shape.draw(); 
    } 
}

(1)使用 interface 定义一个接口
(2)接口中的方法一定是抽象方法, 因此可以省略 abstract
(3)接口中的方法一定是 public, 因此可以省略 public
(4)Cycle 使用 implements 继承接口. 此时表达的含义不再是 “扩展”, 而是 “实现”
(5)在调用的时候同样可以创建一个接口的引用, 对应到一个子类的实例.
(6)接口不能单独被实例化
接口中只能包含抽象方法. 对于字段来说, 接口中只能包含静态常量(final static).

interface IShape { 
    void draw(); 
    public static final int num = 10; 
} 

2.实现多个接口

(1)有的时候我们需要让一个类同时继承自多个父类. 这件事情在有些编程语言通过 多继承 的方式来实现的.
(2)然而 Java 中只支持单继承, 一个类只能 extends 一个父类. 但是可以同时实现多个接口, 也能达到多继承类似的效果.
(3)现在我们通过类来表示一组动物

class Animal { 
protected String name; 
    public Animal(String name) { 
        this.name = name; 
    } 
}

另外我们再提供一组接口, 分别表示 “会飞的”, “会跑的”, “会游泳的”.

 interface IFlying { 
    void fly(); 
} 
interface IRunning { 
    void run(); 
} 
interface ISwimming { 
    void swim(); 
} 

接下来我们创建几个具体的动物
猫, 是会跑的

class Cat extends Animal implements IRunning { 
    public Cat(String name) { 
        super(name); 
    } 
} 
    @Override 
    public void run() { 
        System.out.println(this.name + "正在用四条腿跑"); 
    

青蛙, 既能跑, 又能游(两栖动物)

class Frog extends Animal implements IRunning, ISwimming { 
    public Frog(String name) { 
        super(name); 
    } 
    @Override 
    public void run() { 
        System.out.println(this.name + "正在往前跳"); 
    } 
    @Override 
    public void swim() { 
        System.out.println(this.name + "正在蹬腿游泳"); 
    } 
} 

上面的代码展示了 Java 面向对象编程中最常见的用法: 一个类继承一个父类, 同时实现多种接口

标签:name,void,接口,abstract,详解,抽象类,public
From: https://blog.csdn.net/ZCY_c/article/details/137605846

相关文章

  • Vue生命周期详解(八个钩子)
    定义:    一个Vue实例从开始创建一直到销毁的整个过程,称之为生命周期作用:    Vue框架的内置函数,随着组件的生命周期阶段的不同,会自动执行的函数,并且在特定的阶段做某件事,只需要调用相应的钩子函数即可。        我们可以通过使用生命周期(钩子)函......
  • zhipuAI接口兼容openai
    zhipuAI接口兼容openai最近debug发现质谱AI的接口是兼容openai这个库的首先访问官网,获取一个key然后使用下面的代码生成jwttoken,apikey天获取的key,exp_seconds是过期时间defgenerate_token(apikey:str,exp_seconds:int):try:id,secret=apikey.sp......
  • 某狗网歌曲接口逆向之加密算法刨析
    逆向网址aHR0cHM6Ly93d3cua3Vnb3UuY29t逆向链接aHR0cHM6Ly93d3cua3Vnb3UuY29tL21peHNvbmcvN2dxcGVzNjguaHRtbA== 逆向接口aHR0cHM6Ly93d3dhcGkua3Vnb3UuY29tL3BsYXkvc29uZ2luZm8= 逆向过程 请求方式:GET逆向参数        signature:1898d8f157837fa......
  • WiFi6详解
    移动互联网时代,“WiFi”和“4G”一直是两个并存的名词——4G网络在室外给我们提供高速流量,WiFi则在室内给我们提供了真正的不用操心的“无限流量”。可以说生活在当下的我们,这两样东西一个不但都离不了且一刻也离不开。想想看如果你的手机断了网,你的焦虑症恐怕就上来了。关于......
  • java中实现Runnable接口
    在Java中,要实现Runnable接口,你需要创建一个类,并让这个类实现Runnable接口中的run方法。Runnable接口是一个只有一个抽象方法的函数式接口,该方法是run。以下是一个简单的例子,展示了如何实现Runnable接口:java//实现Runnable接口的类publicclassMyRunnableimplementsRunnabl......
  • MQTT协议特点及数据包结构详解(值得珍藏)
    点击下载《MQTT协议特点及数据包结构详解(值得珍藏)》1.前言MQTT(MessageQueuingTelemetryTransport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,用极少的代码和有......
  • Oracle分析函数- count()/sum() over(partition by 分组 order by 排序) 详解
    优点:代码简单明了,并且执行效率高,(不影响总的记录数)如果不用这种函数去写,按照平时我们的思路首先想到的可能是子查询,那么将至少会走4次以上的全表扫描:(1)每个订单中产品数量大于3的产品至少1个(003,004)(2)每个订单中折扣标志为'1'的产品至少有2个(002,004)(3)每个订单......
  • 国税发票查验接口、电子增值税发票查验接口、数电票查验接口
    翔云发票查验接口支持增值税发票管理系统开具发票的真伪,通过发票代码、号码、日期、金额、校验码四要素信息进行真伪的查验,支持返回全票面信息,API接口便于集成,可适用于多种应用场景。发票查验接口python调用示例:importrequestsimportjsondefmain():url="https:/......
  • 那些场景需要进行实名认证?python身份证实名认证接口案例
    身份证实名认证接口是用来核验用户身份证信息真伪的接口,从而确保用户身份的真实性,常见的应用场景包含:1、在线教育:线上教育平台为了保障学习者身份的真实性和安全性,通常通过集成身份证实名认证接口来验证学习者身份是否为本人。2、企事业单位:政务部门、企事业单位等......
  • 【SpringBoot实战篇】注册接口
    目录1 明确需求 2 阅读接口文档2.1基本信息2.2请求参数2.3响应数据3思路分析(1)UserController(2)UserService(3)UserMapper4开发4.1三层架构(1)UserController.java(2)UserService(3)UserMapper.java4.2工具类5 测试......