抽象类和接口

1.抽象类

抽象类官方说明:

https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.1.1.1

中写到抽象类是包含了抽象方法的类,其实这句话的说法是不准确的,必须如下面这个类

public abstract class ClassName {

    void showWeather(String str) {

        System.out.println("今天天气不错"+str);

    }

    abstract void showName();

}

其中抽象方法showName()可以不要,但是如果抽象类中定义的方法不是抽象方法,则一定要被实现。

但是抽象类和抽象方法必须用abstract修饰

抽象类是将将某几个具有相同属性或方法的普通类进行的抽象,因此抽象类就是为了继承而存在的。如果创建了一个抽象类但是却没有子类去继承它,则这个类就没有存在的意义了。如果一个父类的它的某个方法没有具体的实现,但是必须在子类中进行不同的实现,那么这个就可以吧这个方法抽象出来,抽象出一个抽象类来。

包含抽象方法的类称为抽象类,但是抽象类中不是只有抽象方法,它也可以想普通类一样具有成员变量和普通的成员方法。

抽象类和普通类的区别:

1.抽象方法必须使用public或者protected修饰,缺省的情况下默认是public(如果使用private不能被子类所继承,就没有意义,同时JAVA编译器也编译不过去)

2.抽象类不能被实例化,如果抽象类中有普通方法,创建的是匿名内部类,而不是实例化。

3.如果一个类继承了一个抽象类,则必须实现抽象类的所有抽象方法,否则必须将子类也定义为抽象类。

2.接口

接口英文名是interface,在软件工程中,接口泛指供他人调用的方法或者函数,接口的一般定义形式是:

public interface InterfaceDemo {

  void show();

}

接口可以含有变量和方法,但是接口中的变量和方法会被隐式的指定为public static final变量(只能是public static final,如果使用private会报错),方法会被隐式的指定为public static只能是public abstract修饰(如果使用private,protected,static 等修饰编译会报错),且接口中所有的方法都不能被实现。既接口中的方法必须的抽象方法。因此可以把接口理解成一个极度抽象的抽象类。且一般情况下不会在接口中定义变量

public class InterfaceTest implements InterfaceOne ,InterfcaeTwo,... {

}

一个类可以实现多个接口,但是只能继承一个抽象类或者父类

3.抽象类和接口的比较

参数抽象类接口

默认的方法实现它可以有默认的方法实现接口完全是抽象的。它根本不存在方法的实现

实现子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现

构造器抽象类可以有构造器接口不能有构造器

与正常Java类的区别除了你不能实例化抽象类之外,它和普通Java类没有任何区别接口是完全不同的类型

访问修饰符抽象方法可以有public、protected和default这些修饰符接口方法默认修饰符是public。你不可以使用其它修饰符。

main方法抽象方法可以有main方法并且我们可以运行它接口没有main方法,因此我们不能运行它。

多继承抽象方法可以继承一个类和实现多个接口接口只可以继承一个或多个其它接口

速度它比接口速度要快接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。

添加新方法如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。如果你往接口中添加方法,那么你必须改变实现该接口的类。

4.一个典型的实例

网上流传最广的实例是门和警铃的实例,首先所有的门都具有打开open和关闭close的功能,因此可以分别定义一个抽象类和接口

抽象类

public abstract class ClassDoor {

    public abstract void open();

    public abstract void close();

}

接口

public interface InterfaceDoor {

    void open();

    void close();

}

这时两者没有太大的区别,但是有些特殊的门需要有门禁功能,因此需要将这个功能也要添加到里面去

如果将门禁或者警铃的功能也放在抽象类里面,则只要是几次了这个抽象类的子类都要实现这三个功能,而大多数的门是不需要门禁或警铃的,因此不太合适

但是呢,可以将这个方法放在接口中就可以解决这个功能,只需要重新定义一个接口,在某些需要门禁或者警铃的门中实现这个接口即可,既:

public interface InterfaceDoorAlarm {

    void alarm();

}

如果不需要警铃的门

方法1:

public class CommonDoor implements InterfaceDoor {

    @Override

    public void open() {

}

    @Override

    public void close() {

    }

}

方法2

public class CommonDoor extends ClassDoor{

    @Override

    public void open() {

    }

    @Override

    public void close() {

    }

}

需要警铃的或者门禁的门

public class NeedAlarmDoor implements InterfaceDoor, InterfaceDoorAlarm {

    @Override

    public void open() {

    }

    @Override

    public void close() {

    }

    @Override

    public void alarm() {

    }

}

优点和意义

interface:主要针对于功能、动作。将拥有这些动作的类实现此接口如:鸟、飞机都能fly();

体现了开闭原则:对修改关闭,对扩展开放;

abstract class:将拥有共同属性 特征的类继承此类,父类中添加新方法时子类将全部拥有而不用逐一去新增。

当子类拥有父类中的特性是便可以去extends,体现了代码的复用性。继承——灵活性;实现——严谨性;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容