zoukankan      html  css  js  c++  java
  • Java基础(三)——抽象类和接口

    一、抽象类

    1、介绍

      使用:abstract定义抽象类;abstract定义抽象方法,只有声明,不用实现;包含抽象方法的类必须定义为抽象类;抽象类中可以有普通方法,也可以有抽象方法;抽象类不能被实例化,但可以定义引用变量。
      抽象关键字 abstract 和哪些不可以共存?final,private,static。
      应用场景:在某些情况下,父类只知道其子类应该包含什么方法,但不知道这些子类如何实现这些方法;从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。
      作用:限制规定子类必须实现某些方法,但不关注实现细节。

    2、应用

      在某些情况下,某个父类只知道其子类应该包含怎样的方法,但不知道这些子类如何实现这些方法。从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。
      其他概念等,其他博客或书籍已介绍的很清楚,请读者自行百度,这里不做介绍。

    3、案例

      下面定义了两个类,一个学生类,一个老师类。学生有姓名和年龄属性,还有吃饭和学习两个方法。老师也有姓名和年龄属性,还有吃饭和教书两个方法。

     1  class Student {
     2      private String name;
     3      private String age;
     4  
     5      public void eat() {
     6          System.out.println("学生在吃饭");
     7      }
     8  
     9      public void study() {
    10          System.out.println("学生在学习");
    11      }
    12  }
    13  
    14  class Teacher {
    15      private String name;
    16      private String age;
    17  
    18      public void eat() {
    19          System.out.println("老师在吃饭");
    20      }
    21  
    22      public void teach() {
    23          System.out.println("老师在教书");
    24      }
    25  }

      很明显,这两个类,学生和老师,都有共同的属性,姓名和年龄,也有共同的方法,吃饭。那么,就可以向上抽取一个抽象类,人。修改代码如下:

     1 /**
     2  * 父类Person
     3  * 通过关键字 abstract 定义Person是一个抽象类
     4  */
     5 abstract class Person {
     6     private String name;
     7     private String age;
     8 
     9     /**
    10      * abstract 抽象方法
    11      * 只有方法的定义,没有方法的实现。
    12      */
    13     public abstract void eat();
    14 }
    15 
    16 class Student extends Person {
    17 
    18     /**
    19      * 不同的子类有不同的实现
    20      */
    21     @Override
    22     public void eat() {
    23         System.out.println("学生在吃饭");
    24     }
    25 
    26     public void study() {
    27         System.out.println("学生在学习");
    28     }
    29 
    30 }
    31 
    32 class Teacher extends Person {
    33 
    34     /**
    35      * 不同的子类有不同的实现
    36      */
    37     @Override
    38     public void eat() {
    39         System.out.println("老师在吃饭");
    40     }
    41 
    42     public void teach() {
    43         System.out.println("老师在教书");
    44     }
    45 }

      补充一下:①抽象类不可以实例化,②如果子类不想实现父类的抽象方法的话,可以将子类也申明为 abstract ,再由他的子类来实现即可。
      很明显,这样做,可以简化代码。但是,请读者不要以为只要是有共有的属性或者方法,就去使用抽象类,向上抽取为一个类。Java是面向对象的语言,封装、继承、多态是它的三大的特性(默认读者有一定的Java基础)。且这些概念百度到处都是,所以不赘述。那么,什么情况下,适合向上抽取一个抽象类呢?
      抽象类,向上抽取,必须要有继承关系,也就是 is a 。这里,学生是一个人,老师也是一个人。所以抽取抽象类 Person。
      代码示例:反例。

     1 class Student {
     2     private String name;
     3     private String age;
     4 
     5     public void eat() {
     6         System.out.println("学生在吃饭");
     7     }
     8 
     9 }
    10 
    11 class Cat {
    12     private String name;
    13     private String age;
    14 
    15     public void eat() {
    16         System.out.println("猫在吃鱼");
    17     }
    18 }

      这里,定义了学生类,猫类。同样,他们都有姓名和年龄属性,还有吃饭方法。最好就不要抽取抽象类。因为猫和人的共同父类是什么?在现实生活中是找不到的。Java中,所谓一切皆对象,程序代码也只是将现实生活中的事物在计算机中的映射。所以,这里不要为了代码的简介而胡乱抽取一个父类。有读者可能会说,他们都是生物啊,可以抽取一个Biology类,那如果是一个球类和学生类呢?这里只是举了一个例子,希望说明问题。实际开发中,读者可灵活定义! 

    二、接口

    1、介绍

      接口可以理解成一种特殊的类,由静态常量和公共的抽象方法所组成。
      类是一种具体实现体,而接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部数据,也不关心这些类里方法的实现细节,它只规定这些类里必须提供某些方法。语法:

      [修饰符] interface 接口名 [extends 父接口1,父接口2...] {
        public static final String var1;
        public static final String var2;
        public abstract [返回类型] method1();
        public abstract [返回类型] method2();
      }

      使用:接口只能用public修饰,不能使用private和protected;一个类可以实现一个或多个接口;Java中一个类只能继承一个父类,是不够灵活的,接口的出现将"多继承"通过另一种形式体现出来,即"多实现";还可以与匿名内部类配合使用,多用于关注实现而不关注类的名称。其本质是利用了多态,而创建的是一个实现了该接口的类的实例。
      成员固定格式:

      成员常量:public static final
      成员函数:public abstract

      特点:接口是对外暴露的规则;接口是程序的功能扩展;接口可以用来多实现;类与接口之间是实现关系,且类可以继承一个类的同时实现多个接口;接口与接口之间可以有继承关系;接口中的方法只能是抽象方法。

    作者:Craftsman-L

    本博客所有文章仅用于学习、研究和交流目的,版权归作者所有,欢迎非商业性质转载。

    如果本篇博客给您带来帮助,请作者喝杯咖啡吧!点击下面打赏,您的支持是我最大的动力!

  • 相关阅读:
    疫情环境下的网络学习笔记 python 5.8 数据库入门终章
    疫情环境下的网络学习笔记 python 5.7 navicat数据库,例题,sql注入
    疫情环境下的网络学习笔记 python 5.6 暂时看看
    疫情环境下的网络学习笔记 python 5.5 MYSql 表关系,外键
    疫情环境下的网络学习笔记 python 5.4 数据库基础
    疫情环境下的网络学习笔记 python 4.30 初识数据库
    疫情环境下的网络学习笔记 python 4.29 网络小项目
    XJOI 夏令营501-511测试11 游戏
    XJOI 夏令营501-511测试11 统计方案
    CF1197D Yet Another Subarray Problem
  • 原文地址:https://www.cnblogs.com/originator/p/13894166.html
Copyright © 2011-2022 走看看