• 抽象类和接口的异同


       Java中的两种抽象定义:一为抽象类(Abstract Class),二为接口(Interface)。

    一、抽象类Abstract Class

      抽象类是关键字abstract修饰的类,既为抽象类,抽象抽象即不能被实例化。而不能被实例化就无用处,所以抽象类只能作为基类(父类),即被继承的类。抽象类中可以包含抽象方法也可以不包含,但具有抽象方法的类一定是抽象类。

      抽象类的使用原则如下:

    • (1)被继承性抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public
    • (2)抽象性抽象类不能直接实例化,需要依靠子类采用向上转型的方式处理;
    • (3)抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类;
    • (4)子类(如果不是抽象类)则必须覆写抽象类之中的全部抽象方法(如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

      比如:  

     1 package com.fzz.test;
     2 
     3 //抽象类A
     4 abstract class A{
     5     public void fun(){//普通方法
     6         System.out.println("存在方法体的方法");
     7     }
     8 
     9     public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰
    10 
    11 }
    12 //单继承特性
    13 class B extends A{//B类是抽象类的子类,是一个普通类
    14     @Override
    15     public void print() {//强制要求重写
    16         System.out.println("Why is more important than what!");
    17     }
    18 
    19 }
    20 //测试类
    21 public class TestDemo {
    22     public static void main(String[] args) {
    23         A a = new B();//多态:向上转型
    24         a.fun();//被子类所覆写的过的方法
    25     }
    26 }

      详细可参考:https://blog.csdn.net/wei_zhi/article/details/52736350

    二、接口Interface

      在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

      1、接口与类相似点

    • 一个接口可以有多个方法。
    • 接口文件保存在 .java 结尾的文件中,文件名使用接口名。
    • 接口的字节码文件保存在 .class 结尾的文件中。
    • 接口相应的字节码文件必须在与包名称相匹配的目录结构中。

      2、接口与类的区别

    • 接口不能用于实例化对象。
    • 接口没有构造方法。
    • 接口中所有的方法必须是抽象方法。
    • 接口不能包含成员变量,除了 static 和 final 变量。
    • 接口不是被类继承了,而是要被类实现。
    • 接口支持多继承。

      3、接口特性

    • 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
    • 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
    • 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。

      4、接口的继承

      当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。

      Java中类不允许多继承但接口可以。

     1 // 文件名: Sports.java
     2 public interface Sports
     3 {
     4    public void setHomeTeam(String name);
     5    public void setVisitingTeam(String name);
     6 }
     7  
     8 // 文件名: Football.java
     9 public interface Football extends Sports
    10 {
    11    public void homeTeamScored(int points);
    12    public void visitingTeamScored(int points);
    13    public void endOfQuarter(int quarter);
    14 }
    15  
    16 // 文件名: Hockey.java
    17 public interface Hockey extends Sports
    18 {
    19    public void homeGoalScored();
    20    public void visitingGoalScored();
    21    public void endOfPeriod(int period);
    22    public void overtimePeriod(int ot);
    23 }

    三、异同

      abstract class和interface是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。具体看下表:

      

  • 相关阅读:
    MySQL Explain优化
    mysql联合索引
    MySQL索引类型
    php常用的排序算法与二分法查找
    mysql 主从复制(mysql双机热备的实现)
    mysql 主从复制 (2)
    Linux 查看进程之PS命令
    PHP isset 和 array_key_exists 对比
    Linux md5sum 的用法
    Linux Sphinx 安装与使用
  • 原文地址:https://www.cnblogs.com/fzz9/p/8974403.html
Copyright © 2020-2023  润新知