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

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

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

  • 相关阅读:
    发布MeteoInfo 1.2.4
    发布MeteoInfo 1.2.3
    FY2E HDF格式数据处理绘图
    格点插值为站点数据批量处理
    Linux安装make无法使用
    sql语句优化
    在OSX狮子(Lion)上安装MYSQL(Install MySQL on Mac OSX)
    JetBrains IntelliJ IDEA for Mac 15.0 破解版 – Mac 上强大的 Java 集成开发工具
    Spring-data-redis: 分布式队列
    Spring Boot使用Redis进行消息的发布订阅
  • 原文地址:https://www.cnblogs.com/originator/p/13894166.html
Copyright © 2011-2022 走看看