Java抽象类、接口用法总结

Java的接口和抽象类都可以定义不提供具体实现的方法,功能上很相似,对多态都提供了很好的支持。下面我们就来好好认识认识这两个知识点。

ps:因为都是一些基本概念性的东西,所以我就不写代码举例了。

抽象类(Abstract Class)

1. 什么是抽象类,它的作用是什么呢?

先说下抽象类长啥样,Java里面定义抽象类很简单,用abstract修饰的类就是抽象类。抽象类是实现多态的一种机制。

抽象类是不能实例化的,抽象类代表那一类的事物,不能实例化为具体的对象。很多人都会问为什么不能实例化?因为语法上就是这么规定的,你new一个就会报错。所以,抽象类主要是起到规范的作用,它只是声明了成员变量和方法,是要子类去实现他的所有的抽象方法的。

2. 使用抽象类,需要注意什么?
① 抽象类是不能实例化的(上面已经讲过)。
② 要求非抽象子类必须实现基类中的抽象方法。
③ 只要类中存在抽象方法,要求该类必须是抽象类。
④ 抽象类内可以全都是抽象方法,也可以没有抽象方法。
⑤ 基类内不能写静态的抽象方法,因为不能被重写。

3. 一个小例子

举个常用的抽象类“人”,两个子类“男人”、“女人”。“人”有个可继承普通方法【走路】,有个抽象方法【撒尿】。“男人”和“女人”【撒尿】方式是不一样的,声明为抽象方法最好。而【走路】都是一样的,可以在父类实现好,子类继承就可以了。

这就是抽象类的好处,把子类的共性逻辑上提抽象出来,共有的可以继承,有区别的在子类中自己去实现。这就提高了程序的扩展、移植、复用。

接口(Interface)

1. 什么是接口,有什么用呢?

接口是抽像类的变体。定义一个接口使用interface关键字,实现一个接口使用implements关键字,接口它起到规范的作用,降低了各模块的耦合性,提高了扩展性。

2. 使用接口,需要注意些什么,它有什么特点?

① 在接口中,所有方法都是抽象的(跟抽象类不同),没有方法体。
② 接口只可以定义static final成员变量(跟抽象类不同)。
③ 接口可以继承接口,切可以多继承,可用逗号隔开。
④ 接口里的常量public static final 都可以不写,方法中的public abstract 也可以不写,编译器默认会帮我们添加。但是推荐写上,写上增加代码的可读性。
⑤ 假如两个接口中有一样的抽象方法,但是它没有实现部分,所以也就没有菱形缺陷,相当于对多继承的优化方案。
⑥ 抽象类实现某个接口,可以不实现所有接口的方法,可以由它的子类实现。而普通类即非抽象类则必须实现接口里的全部方法。

关于第五点,感觉还是写下例子比较好。

public interface InterfaceA {

    public static final double PI = 3.14;

    public abstract void foo();
    public abstract void foo1();
    public abstract void foo2();

    public abstract void fooA();// A里面有B的抽象方法

}

public interface InterfaceB {

    public abstract void fooA();
    public abstract void fooB();
    public abstract void fooC();
}

//接口多继承
public interface InterfaceC extends InterfaceA, InterfaceB{

    public abstract void foo3();
}

public class Demo implements InterfaceA, InterfaceB{
// 可以看到虽然两个接口都有public abstract void fooA()这个方法,但是在实现里,只重写一次。
    @Override
    public void foo() {
        System.out.println(InterfaceA.PI);
    }
    @Override
    public void foo1() {
    }
    @Override
    public void foo2() {
    }

    @Override
    public void fooA() {

    }

    @Override
    public void fooB() {

    }

    @Override
    public void fooC() {

    }
}

public class Demo1 implements InterfaceA, InterfaceC{

// 这个也是同理。
    @Override
    public void foo3() {

    }

    @Override
    public void foo() {

    }

    @Override
    public void foo1() {

    }

    @Override
    public void foo2() {

    }

    @Override
    public void fooA() {

    }

    @Override
    public void fooB() {

    }

    @Override
    public void fooC() {

    }
}

Java 8 新特性:接口默认方法

接口的一个缺陷就是,当我们修改接口的时候,需要修改全部实现该接口的实现类。对于已发布的版本,是没法在给接口添加新的方法的同时不影响已有的实现。所以在Java 8引进了默认的方法,就解决了接口的修改与已有的实现不兼容的问题。

默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法,前面需要加default 关键词来修饰。还可以有静态方法,示例如下。

    public interface InterFaceD {
        default void foo(){
            System.out.println("默认方法可以有多个。");
        }
        // 静态方法
       static void fooA(){
            System.out.println("这是接口里面的一个静态方法");
        }
    }

抽象类与接口的区别

  1. 语法用法上的区别。
    在抽象类中,抽象类可以拥有更丰富类型成员变量,同时也可以拥有自己的非抽象方法。但是在接口中,它仅能够有静态、不能修改的成员数据(即final static,但是我们一般是不会在接口中使用成员数据),同时它所有的方法都必须是抽象的。在某种程度上来说,接口是抽象类的特殊化。

  2. 抽象层次上的区别。
    抽象类是内容,是对一种事物的抽象,是整体上的抽象。比如,老师是所有教师的抽象,老师的工作是教育学生。
    接口是特征,是对一种行为的抽象,是局部抽象,比如,上课、批改作业、家访。

  3. 抽象概念上的区别。
    抽象类所体现的是一种合理的继承关系,即父类和子类在概念本质上应该是相同的。对于接口则不然,并不要求接口的实现者和接口定义在概念本质上是一致的, 仅仅是实现了接口定义的契约而已。

抽象类和接口是java语言中两种不同的抽象概念,他们的存在对多态提供了非常好的支持,虽然他们之间存在很大的相似性。但是对于他们的选择往往反应了我们对问题的理解程度。

Java8关于接口的另一个新特性就是函数式接口,后面会结合Lambda表达式,作进一步的介绍。

写完喽!ㄟ(▔,▔)ㄏㄟ(▔,▔)ㄏㄟ(▔,▔)ㄏ


知识重在总结和梳理,只有不断地去学习并运用,才能化为自己的东西。当你能为别人讲明白的时候,说明自己已经掌握了。

欢迎转载,转载请注明出处!

如果有错误的地方,或者有您的见解,还请不啬赐教!

喜欢的话,麻烦点个赞!

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

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,558评论 18 399
  • 一、抽象类 1、抽象类含义的概括: 当多个类出现相同功能时,但功能主体不同,这样可以向上抽取,抽取时只抽取功能定义...
    玉圣阅读 823评论 0 6
  • - "张医生,这个给你!" 张继科蹙眉,一袋包装精美的吐司面包就被红着脸的小护士塞进怀里。 "不用了。" 他客气的...
    天气即天意阅读 2,418评论 0 13
  • 儿童诗二首 整整一个夏天,小狗使劲的吐舌头降温,却还是那么热。(四年级 林倩如) 整整一个世界,人类使劲发现,发明...
    Fenny_官阅读 237评论 0 0
  • 推理小说,一开始就是一个大谜题,除了谜题,所有条件都有待发现,是个从未知到已知的过程。在已知达到一定程度的时候,谜...
    渭城朝雨阅读 157评论 0 1