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

抽象类与接口

时间:2023-11-10 11:45:19浏览次数:32  
标签:接口 抽象 Animal 抽象类 方法 public

抽象类

为什么要有抽象类?

假设我有一个父类:Animal类

 1 //创建一个动物类
 2 public class Animal {
 3     //动物有名字
 4     public String name;
 5     //动物有年龄
 6     public String age;
 7 
 8     //动物有吃的功能
 9     public void eat(){
10         System.out.println("动物在吃东西");
11     }
12 }

子类:Cat类和Dog类

 1 public class Dog extends Animal{
 2     @Override
 3     public void eat() {
 4         System.out.println("小狗吃骨头");
 5     }
 6 }
 7 class Cat extends Animal{
 8     @Override
 9     public void eat() {
10         System.out.println("小猫吃鱼");
11     }
12 }

发现每个子类都需要重写父类eat()方法,而且Animal类中eat()方法无法具体的写出动物吃什么,是无法确定的,因为动物是一个抽象的概念,无法具体为某种动物,所以这里需要用到抽象类。

抽象类和抽象方法的定义

抽象类的定义:需要用到abstract关键字来修饰。

抽象方法的定义:当不确定方法体的内容时,就需要用到抽象方法,需要用到abstract关键字修饰,而抽象方法不能有方法体,连{}都不能有。

语法:

abstract  class  类名{
   
代码块; }

举个例子:(而上面的例子就可以使用抽象类和抽象方法实现)

父类:Animal类

 1 //创建一个动物类,父类可以写成一个抽象类
 2 public abstract class  Animal {
 3     //动物有名字
 4     public String name;
 5     //动物有年龄
 6     public String age;
 7 
 8     //动物有吃的功能,但无法确定方法的具体实现,所以使用抽象方法
 9     public abstract void eat();
10 }

子类:Dog类和Cat类

 1 public class Dog extends Animal{
 2     //子类继承抽象类后,必须重写抽象类中的抽象方法
 3     //如果不实现抽象方法,则也需要定义成抽象类
 4     @Override
 5     public void eat() {
 6         System.out.println("小狗吃骨头");
 7     }
 8 }
 9 class Cat extends Animal{
10     //子类继承抽象类后,必须重写抽象类中的抽象方法
11     //如果不实现抽象方法,则也需要定义成抽象类
12     @Override
13     public void eat() {
14         System.out.println("小猫吃鱼");
15     }
16 }

注意:

①如果一个类继承抽象类时,必须实现抽象类中的所有抽象方法,否则该类也要是一个抽象类

②抽象类中可以抽象方法,也可以有普通的方法

③抽象类不能被实例化,但是有构造方法(是类就一定有构造方法)

④抽象方法必须使用abstract修饰,并且不能有方法体

⑤含有抽象方法的类一定是抽象类

接口

接口的理解

接口的本质是标准,规范,大家都要遵守的规则,比如现实中type-c接口,你想要充电就必须是圆口才可以插进去充电。

接口在jdk1.8以前接口中的所有方法都是抽象方法,所有的属性都是静态常量,而接口也能解决类中的局限性(单继承)

接口中的方法都是用 public  abstract 修饰

接口中的属性都是用 public  static  final修饰

如何定义接口

语法:

public interface 接口名{
     //成员-1.8以后
     //1.静态常量成员
     //2.抽象方法成员
}

举个例子:

 1 //定义接口
 2 public interface Animal {
 3     //定义常量,只能赋值一次
 4     //而接口中的属性都是静态常量,所以默认属性添加public  final  static修饰
 5     public final static  String name = "旺财";
 6     
 7     //定义抽象方法
 8     //而接口中的方法都是抽象方法,所以默认方法添加public  abstract
 9     public abstract  void eat();
10 }

 接口与接口之间继承关系

一个接口可以继承多个接口

语法:

interface   接口名   extends  接口名1,接口名2,.....,接口名n{

          //代码内容

}

举个例子:

interface   A{
    //代码内容
}

interface   B{
   //代码内容
}

interface  C  extends  A,B{

    //代码内容
}

接口与类之间实现关系

使用implements关键字

语法:

public class 类名   implements   接口1,接口2,接口3,...... ,接口n{

     //代码内容

}

举个例子:

 1 //定义接口
 2 public interface Animal {
 3     //定义常量,只能赋值一次
 4     //而接口中的属性都是静态常量,所以默认属性添加public  final  static修饰
 5     public final static  String name = "旺财";
 6 
 7     //定义抽象方法
 8     //而接口中的方法都是抽象方法,所以默认方法添加public  abstract
 9     public abstract  void eat();
10 }
11 //类实现接口
12 class Cat implements Animal{
13     //需要重写接口中所有抽象方法
14     @Override
15     public void eat() {
16         System.out.println("小猫吃鱼");
17     }
18 }

接口的知识点:

(1)接口中声明的静态方法只能被接口调用,不能被其他实现类进行调用

(2)接口中声明的默认方法可以被实现类继承,实现类在没有重写方法的情况下,默认调用接口中声明的方法,如果实现类重写方法,则调用的是自己重写的方法

(3)类实现两个接口,而两个接口中定义了同名同参的默认方法。则实现类在没有重写此两个接口默认方法下会报错---------->接口冲突

那如何继承父类,并实现接口呢?子类的格式要如何写呢?

很简单,先继承后实现接口。

举个例子:

 class A extends SuperA implement B,C {
     //代码内容

} 
A相较于SuperA来讲是子类,A相较于B,C来讲叫做实现类。

总结一下:

①同类型之间使用继承,类与接口使用实现

②类与类之间,允许单继承,使用extends关键字

③接口与接口之间:允许多继承,使用extends关键字

④类与接口之间:允许多实现。使用implements关键字

标签:接口,抽象,Animal,抽象类,方法,public
From: https://www.cnblogs.com/gzyhrc/p/17823524.html

相关文章

  • 支持在代码编辑器中调试接口,IDEA插件推荐
    今天给大家推荐一款IDEA插件:Apipost-Helper-2.0,写完代码IDEA内一键生成API文档,无需安装、打开任何其他软件;写完代码IDEA内一键调试,无需安装、打开任何其他软件;生成API目录树,双击即可快速定位API定义的代码…非常好用!主要包含以下功能:1、无侵入生成API文档编写完代码后,只需右键up......
  • elementui 自定义上传接口上传完图片之后无法再进行第二次上传,踩坑解决
    1,上传功能<el-upload action="" ref='upload' :http-request="handleFileUpload" :limit="1" :show-file-list="false"> <iclass="el-icon-upload2"></i></el-upload>2,在上传后......
  • Go 面向接口编程
    接口有什么用?就是存储未实现的方法,作为实现的此方法的结构体的实例的句柄。typeSayerinterface{ say()}typeDogstruct{}typeCatstruct{}func(*Dog)say(){ fmt.Println("Woewwoew")}func(*Cat)say(){ fmt.Println("Meowmeow")}funcmain(){ va......
  • OpenFeign 接口调用问题及解决方案
    问题描述如果在同一个工程中出现两个OpenFeign接口使用一样的服务名称会报以下错误:Description:Thebean'optimization-user.FeignClientSpecification',definedinnull,couldnotberegistered.Abeanwiththatnamehasalreadybeendefinedinnullandoverridin......
  • Python抽象类介绍
    抽象类什么是抽象类与java一样,python也有抽象类的概念。抽象类是一种特殊的类,它只能有抽象方法,不能被实例化,在子类继承抽象类时,不能通过实例化使用其抽象方法,必须实现该方法。抽象类的作用抽象类可以实现多个子类中共用的部分,而不需要重复写到实现类中。从设计角度去看,抽象类......
  • Go 接口:Go中最强大的魔法,接口应用模式或惯例介绍
    Go接口:Go中最强大的魔法,接口应用模式或惯例介绍目录Go接口:Go中最强大的魔法,接口应用模式或惯例介绍一、前置原则二、一切皆组合2.1一切皆组合2.2垂直组合2.2.1第一种:通过嵌入接口构建接口2.2.2第二种:通过嵌入接口构建结构体类型2.2.3第三种:通过嵌入结构体类型构建新结构......
  • 接口
      ......
  • Java中的抽象类
    注意:抽象类中也是有默认的无参构造函数的eg:抽象类中的构造方法父类publicabstractclass_168AbstractParent{privateintage=300;privatefinalintcode_200=200;public_168AbstractParent(){System.out.println("我是Parent的无参构造方法......
  • 商城系统 “牵手” 淘宝 API 接口 php java sdk
    随着互联网的快速发展,网络购物已成为人们日常生活中不可或缺的一部分。淘宝作为中国最大的电商平台之一,其商城系统中详情页面的重要性日益凸显。本文将阐述淘宝详情在商城系统中的重要性,从用户角度、商家角度和商城运营角度进行分析,并探讨如何优化详情页面,提升用户转化率和购物体验......
  • 抽象类
        ......