Java是一门面向对象的语言,所以Java里面的众多语法与规定都可以通过理解对象的方式来进行理解。下面便来了解下abstract抽象类与interface接口。

一、对于abstract与interface的理解

首先,让我们来看一个例子:

手机是一个大类,智能手机与非智能手机为手机类的子类。打电话与发短信(手机类的成员方法)是手机的通用功能,而玩游戏则是智能手机所独有的功能(智能手机类的成员方法)。此时,我们便可将手机这个类定义为抽象类(abstract),打电话与发短信为其方法。换句话说我们是把所有手机都具有的功能——打电话与发短信集合在一起,构成了一个新的类——手机,这个过程便是一个抽象的过程,其结果便是新建立了一个抽象类——手机类。

PSP机也可以玩游戏,这是它与只能手机共有的功能(成员方法),将这个功能进行抽象,便可以组成一个接口(interface),可以玩游戏便是这个接口内部定义的方法。

说到这,有必要澄清一下抽象类与接口之间的区别。两者的作用好像都是将两个类的相同功能给提取出来然后组成一个新的类或者接口,这没什么区别吗?下面我们便来看一下,为表示其循序性并增加理解,以序号表示:

1、一个类只能拥有一个父类,也就是说只能继承一个父类,但却能连接多个接口。

2、父类与接口的使用是为了厘清类与类之间的关系,增加程序可读性。

3、我们假设现在存在三个类,分别为类A,类B,类C,并假定我们现在需令类A继承自一个抽象类、连接一个接口,那么我们该如何做?是抽象出类A与类B共同具有的方法与属性来成立一个抽象类,还是类A与类C抽象出一个抽象类。我想,我们的评判标准应该是看类A与类B拥有的共同的属性与方法多还是类A与类C拥有的共同的属性与方法多。相似性更高的两个,我们将其共有的属性与方法抽象出来建立一个抽象类,相似性的一个我们抽象出来建立一个接口。多余三个类的情况可以依此进行推广。

4、举个例子,我们仅考虑拥有方法的情况:存在三个类,分别为类1、类2、类3,其中类1拥有方法A1、A2、A3、B1、B2,类2拥有方法A1、A2、A3、C1、C2,类3拥有属性D1、D2、D3、B1、B2。显然,我们应该将类1与类2抽象出A1、A2、A3方法,建立一个抽象类,而类1与类3抽象出B1、B2建立一个接口。

5、我们可以将类与接口的概念运用到生物学的分类中,这样会加深理解。

二、abstract与interface的语法区别

我们还是以上面手机为例:

1、Telphone类(抽象类)

public abstract class Telphone {
    //抽象类中的属性,可以赋值,也也可以不赋值
    public  String phone="hi";
    //抽象类中的方法,仅仅是一个方法,不允许有任何内容
    public abstract void phone();
    public static void main(String[] args) {
        // TODO 自动生成的方法存根

    }

}

2、IPlayGame接口

//接口,默认存在关键字abstract
public abstract interface IPlayGame {
    String game="找你妹";
    //接口中的方法,默认存在关键字abstract
    public abstr);ne);
        System.out.println(IPlayGame.game)

3、SmartPhone类

public class SmartPhone extends Telphone implements IPlayGame {
    @Override
    public void Game() {
        // TODO 自动生成的方法存根
        System.out.println("我是SmartPhone,我可以玩游戏");
    }

    @Override
    public void phone() {
        // TODO 自动生成的方法存根
        System.out.println("我可以打电话哦");
    }

    public static void main(String[] args) {
        // TODO 自动生成的方法存根

        IPlayGame ip1=new SmartPhone();
        IPlayGame ip2=new PSP();
        IPlayGame ip3=new IPlayGame() {

            @Override
            public void Game() {
                // TODO 自动生成的方法存根
                System.out.println("使用匿名内部类的方式实现接口");
            }
        };
        ip1.Game();
        ip2.Game();
        ip3.Game();
        SmartPhone ip4=new SmartPhone();
        ip4.phone="hehe";
        //ip4.game="不找你妹"; 提示不能对终态字段进行赋值
        System.out.println(ip4.phone);
        System.out.println(IPlayGame.game);
    }

}

4、PSP类

public class PSP implements IPlayGame {

    @Override
    public void Game() {
        // TODO 自动生成的方法存根
        System.out.println("我是PSP,我可以玩游戏");
    }

    public static void main(String[] args) {
        // TODO 自动生成的方法存根

    }

}

5、输出结果

我是SmartPhone,我可以玩游戏
我是PSP,我可以玩游戏
使用匿名内部类的方式实现接口
hehe
找你妹

从代码中我们可以总结出以下几点:

1、抽象类中的属性可有可无,其值可有可无,其修饰符并无任何要求。接口中的属性可有可无,其修饰符必须为public static final,必须进行初始化,一定为常量。

2、抽象类中方法可有可无,只可定义方法,不可写方法内容,修饰符必须有abstract关键字,public与protected均可。接口中的方法可有可无,只可定义方法,不可写方法内容,其修饰符必须为public abstract。

3、继承使用关键字extends,姐开口使用关键字interface

4、继承了抽象类的类会自动加载抽象类的方法,也可以直接使用抽象类中的属性。接口同理。

5、接口的引用有如下几种实现形式:第一,实现了接口的对象,如ip1与ip2;第二,接口本身,如ip3;第三,使用匿名内部类实现接口,如ip4。

总结:不要仅仅从字面意义上理解以上几点,一定要从面向对象上理解,这就同学物理一样,你只记住公式没用,要理解公式背后所代表的物理规律。