首页 > 其他分享 >Day15 抽象类与接口

Day15 抽象类与接口

时间:2023-12-04 17:57:40浏览次数:28  
标签:abstract 接口 Day15 抽象 抽象类 方法 public

1.抽象类格式 关键字: abstract


1.1抽象类:

abstract class 类名{}
public abstract class ClassName{
    int a;
    public abstract void fun();
}
  • 除非该继承的子类也是抽象类,否则继承了抽象类的所有类都要重写抽象类的抽象方法

  • 不能 new 一个 java 抽象类,有点像c++中的抽象类,即含纯虚函数的抽象类,需要子类完全重载(java中的重写)后才能生成实例

  • 抽象类内可以有变量,变量写法与普通类一致

  • 抽象类中有构造方法


1.2 抽象类内的抽象方法

修饰符 abstract 返回值类型 方法名(参数列表);
    
public abstract void fun();//不能写函数体代码块
  • 抽象类不一定有抽象方法,但是有抽象方法的类必须定义成抽象方法

  • 不包含抽象方法的抽象类,目的就是不想让调用者实例化该对象,通常用于某些特殊的类的结构设计

  • 抽象方法的修饰符可以是 public 或者是 protected, 省缺情况下默认是 public

  • 抽象类的构造方法能不能是抽象方法?

    public abstract class Student {
        String name;
        abstract Student();//直接报错!
    }
    /*抽象类的构造方法不能是抽象方法
    原因很简单:执行子类构造函数之前需要执行父类的构造函数,如果父类的构造函数可以是抽象方法的话,需要在子类重写,但是调用父类构造函数时,子类的构造函数尚未执行,拿来的重写?
    */
    

1.3 抽象类中静态方法的调用

  • 直接 [抽象类].[静态方法] !!!
public abstract class Student {
	public static void fun(){};
    public abstract void fun2();
}

public class main {
    public static void main(String[] args) {
        Student.fun();
    }
}

2.接口

​ **接口的本质是规范,定义的是一组规则 **

  • 类的关键字是class, 接口的关键字是 interface

    class Person{}//类
    interface Person{}//接口
    
  • 接口内的所有方法都是抽象的,不能写函数体代码块

  • 接口内的方法都是 (public abstract) 类型,不写的话编译器自动补全

  • 接口与抽象类一样,其内同样可以定义变量

  • 接口内定义的变量都是 (public static final) 类型的全局静态常量,所有比较少用

    interface Person{//接口
      public static final String name= “name”;
      void getName();
      public abstract void getName()
    }
    

2.1 实现类

  • 实现了接口的类简称实现类

  • 接口都需要有实现类, 用法类似于类继承,把关键字 extends 换成 implements

public class [实现类名 = "接口名" + Impl] implements [接口名],[接口名]{}

例如:
    public interface Person{}//接口
	public interface Man{}//接口
	public class PersonImpl implements Person,Man{}//实现类
	

注意:

  • 实现类还没有把继承的所有接口里的所有抽象方法全重写之前,编译器会一直报错,这是正常现象
  • 正如上面格式中所写,一个实现类是可以继承多个接口的,也就是伪多继承!!!
  • 接口的多继承,在 implements 后可跟多个接口名,用逗号隔开,且都不需要在接口名字面前写关键字interface
  • 实现类推荐的命名方式为 对应接口名 + Impl

2.2 JDK8的新变化

  • JDK 8 之前接口只能定义抽象方法,JDK8中接口也可以定义默认方法 default 和静态方法 static
  • 默认方法允许接口提供默认实现,从而减少实现类的工作量。当接口的实现类没有提供该方法的具体实现时,将使用默认方法
  • 静态方法可以为接口提供与接口相关的工具方法,静态方法可以直接通过接口名来调用,而不需要创建实现类的实例。因为静态方法无法被实现类覆盖或继承。
public interface MyInterface {
    default void fun1() {
        // 默认方法的实现代码,即实现代码是在接口中定义的
    }//default 需要明写,因为不写默认是public
    static void fun2(){
        //同上,实现代码是在接口中定义的
    }
}
public class main {
    public static void main(String[] args) {
        MyInterface.fun2();//用接口名直接调用静态方法
    }
}
2.2.1 默认方法冲突问题

当一个实现类继承了多个接口,且接口中有同名的默认方法时,必须 显式调用 接口A的默认方法(注意是显式调用!!!不是必须重写!,在不重写的情况下显式调用就不报错!)

格式:[接口名] . super . [默认方法名]

interface A {
    default void doSomething() {
        System.out.println("Do something in A");
    }
}

interface B {
    default void doSomething() {
        System.out.println("Do something in B");
    }
}

class MyClass implements A, B {
    @Override
    public void doSomething() {
        A.super.doSomething();  // 显式调用接口A的默认方法
    }
}

3.抽象类与接口的异同

异:

  • 接口中没有构造方法,抽象类中有构造方法
  • 接口的关键字为interface 和 implements,抽象类的关键字为 class 和 extends
  • 接口可以多继承,抽象类只有单继承
  • 接口中的方法必须全是抽象方法,抽象类中可以有非抽象方法(JDK8 后接口也可以定义默认方法和静态方法)
  • 接口中的变量都是 public static final 类型(全局静态常量),抽象了没有要求
  • 接口的抽象方法一定是 public abstract, 抽象类的抽象方法可以是public abstract 或者是 protected abstract。(此条不适用于 JDK8)
  • 接口的抽象方法省缺时默认为 public abstract, 抽象类的抽象方法只可以省缺public ,因为省缺默认是public, 而 abstract 必须写

同:

  • 接口和抽象类的抽象函数都是用abstract
  • 接口和抽象类都是为了定义一些约束
  • 接口和抽象类都不能直接实例化,只有继承其的子类(接口为实现类)在完全重写抽象方法后,才能生成子类实例

标签:abstract,接口,Day15,抽象,抽象类,方法,public
From: https://www.cnblogs.com/wendao101/p/17875551.html

相关文章

  • SAP接口出现的问题汇总
    问题:报错信息:o.a.cxf.phase.PhaseInterceptorChainInterceptorfor{http://www.xxxx.com/yyyy/zzzz}ZzzzService#{http://www.xxxx.com/yyyy/zzzz}yy_xxxx_zzz_ttthasthrownexception,unwindingnoworg.apache.cxf.interceptor.Fault:MarshallingError:n......
  • 基于DotNetty实现一个接口自动发布工具 - 通信实现
    基于DotNetty实现通信DotNetty:是微软的Azure团队,使用C#实现的Netty的版本发布。是.NET平台的优秀网络库。项目介绍OpenDeploy.Communication类库项目,是通信相关基础设施层Codec模块实现编码解码Convention模块定义约定,比如抽象的业务Handler,消息载体Ne......
  • Java 函数式接口
    在Java中,函数式接口(functionalinterface)是指仅包含一个抽象方法的接口。这种类型的接口通常用于表示简单的函数签名,并可与lambda表达式或方法引用结合使用,从而提供一种更简洁、更灵活的编程方式。Java8引入了函数式接口的概念,以及一个新的注解@FunctionalInterface。这个注解......
  • 基于DotNetty实现一个接口自动发布工具 - 背景篇
    故事背景小公司,单体项目,接口和页面都在一起,生产和测试环境都是Windows服务器和IIS,本地编译完成,把相关的页面和程序集拷贝到服务器上,尤其是涉及到多个页面,一个个页面找到对应的位置,再到服务器上找到对应的位置拷贝进去,甚至还有备份等操作,不胜其烦,因为历史遗留原因,......
  • charles-造数据,接口返回值固定怎么处理
    问题现象:界面请求第三方接口时,某个字段没有返回正确或者想要修改接口返回值,那么解决的办法是打断点,每次修改接口返回值,但是这样做太麻烦了,测试100次,得改100次。         所以有个简单的办法,只需要将接口返回保存到一个文件中,每次请求都走这个文件,就解决了这个......
  • 京东商品详情接口在电商行业中的重要性及实时数据获取实现
    一、引言随着电子商务的快速发展,商品信息的准确性和实时性对于电商行业的运营至关重要。京东作为中国最大的电商平台之一,其商品详情接口在电商行业中扮演着重要的角色。本文将深入探讨京东商品详情接口的重要性,并介绍如何通过API实现实时数据获取,帮助电商企业提高运营效率和用户体......
  • 统一接口返回结果实体
    REST接口封装统一返回数据工具类如下(记录):publicclassResult{/***响应状态码*/privateIntegercode;/***响应成功与否*/privatebooleansuccess;/***响应消息*/privateStringmsg;/***......
  • 全面的.NET微信网页开发之JS-SDK使用步骤、配置信息和接口请求签名生成详解
    JSSDK使用步骤步骤一:绑定安全域名:先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。步骤二:引入JS文件:在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.6.0.js如需进一步提升服务稳定性,当上述资源不......
  • 接口适配
    接口适配背景某个WebService接口在实现框架替换后,WSDL和请求响应报文中XML的格式与原实现存在差异,比如namespace别名定义,层级(是否应该带有in0之类的层级)等。因为接口被广泛使用,所以需要保证新的接口和原接口一摸一样。解决方案通过拦截器或能实现类似效果的截面层对请求和响......
  • “接口隔离模式”之外观模式(门面模式)
    1模式动机外观模式属于“接口隔离模式”的一种。  下图中,A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内......