IT虾米网

深入理解 抽象类和接口详解

admin 2018年06月09日 编程语言 428 0

使用场景

当需要使得多个类看起来一样时,使用接口或者抽象类。
例如:当有四个类,分别为Basketball,Football,Baseball,Badminton。这四个类都有的方法为play(),stop(),pause(),这时可以把这些方法抽象出来,在抽象类中或者接口中声明,再让这四个类继承或实现。这样这四个类看起来就一样了。

抽象类

首先记住一句话,抽象类的存在是为了被继承,如果没有类继承它,它的抽象毫无意义。
使用步骤:
创建抽象类,包含抽象方法的类称为抽象类

abstract class Ball{ 
    public abstract void play(); 
    public abstract void stop(); 
    public abstract void pause(); 
}

抽象方法是没有方法体的,并且要用abstract修饰。

类继承抽象类:

class Basketball extends Ball{ 
 
    @Override 
    void play() { 
        //实现具体方法逻辑 
    } 
 
    @Override 
    void stop() { 
        //实现具体方法逻辑 
    } 
 
    @Override 
    void pause() { 
        //实现具体方法逻辑   
    } 
 
}

创建抽象类和抽象方法非常有用,因为它可以使类的抽象性明确起来,并告诉用户和编译器打算怎么使用它们。

接口

接口使得抽象性更加明确,是比抽象类更抽象的存在,接口表示:“所有实现了该特定的接口的类都应该看起来这样”。
该注意的地方:
- 接口的方法默认是public,并且只能为public
- 接口也可以包含域,域默认是static和final的(SE5之后一般用enum,接口的 域一般不采用)
- 接口允许被向上转型,因此很灵活

使用步骤:
创建接口:

interface Ball{ 
    void play(); 
    void stop(); 
    void pause(); 
}

类实现接口:

class Basketball implements Ball{ 
 
    @Override 
    public void play() { 
        //实现具体方法逻辑 
    } 
 
    @Override 
    public void stop() { 
        //实现具体方法逻辑 
    } 
 
    @Override 
    public void pause() { 
        //实现具体方法逻辑   
    } 
}

为什么使用接口

接口存在的意义在哪?或者说使用接口有什么好处,仅仅是让它们看起来一样会不会太牵强?
看看下面这个例子:

class Ball{ 
    public String play(){ 
        return getClass().getName()+" play";//返回类的名字 
    } 
} 
 
class Basketball extends Ball{ 
    @Override 
    public String play() { 
        return super.play(); 
    } 
} 
 
public class Test{ 
 
    public static void use(Ball ball){ 
        System.out.println(ball.play()); 
    } 
 
    public static void main(String[] args){ 
        use(new Basketball()); 
    } 
}

例子很容易理解,就是打印出继承了哪个类调用了play这个方法(实际情况会更复杂的需求),还有Football之类这里就不写出来了。但是更好的方式是使用接口,即让Ball成为一个接口。为什么明明类可以实现,却用接口实现更好?

想想当你用上述的代码完成了一个项目,项目中大量使用到了块代码,假如有一天,一个名叫 Paino 的类,你也想知道它的名,那你怎么办?
方法1:再写一个play()方法,但是假如又有其它的类,也要获取名字呢?难道你要写一个又一个的方法吗?这样会很多冗余代码!
方法2:让 Paino 继承Ball,那假如你已经无法修改这个类了呢?例如Paino已经继承了其他的类。

这是你是不是束束手无策了?假如使用接口呢?

interface Ball{ 
    String play(); 
} 
 
class Basketball implements Ball{ 
 
    @Override 
    public String play() { 
        return "Basketball play"; 
    } 
 
} 
 
public class TestInterface { 
 
    public static void use(Ball ball){ 
        System.out.println(ball.play()); 
    } 
 
    public static void main(String[] args){ 
        use(new Basketball()); 
    } 
 
}

使用接口的情况下,Paino也需要调用play这个方法,无论Paino有没有继承其他类或者实现其他接口,都能再实现Ball,因为接口是多实现的。这样一看就知道为什么使用接口了吧!

使用接口的原因

  1. 能够减少耦合,避免大量的冗余代码,并且能够后期更加灵活地修改,使代码更具有复用性。
  2. 能够上转型为多个基类型,以及带来的灵活性。
  3. 跟抽象类的作用一样,放置程序员创建该类的对象。

什么时候使用抽象类和接口

如果要创建不带任何方法定义和成员变量的基类,应该使用接口。

发布评论

分享到:

IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

Android设置EditText只能输入字母和数字详解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。