Java复习之抽象类和接口


  • Java复习之抽象类和接口

    • 什么是抽象类和接口
    • 抽象类与接口的区别
    • 什么情况下使用抽象类或接口
    • 一个demo引起来的对于java方法区堆栈的研究

首先我们需要明白抽象类与接口是java语言中对抽象概念进行定义的两种机
制,正是由于他们的存在才赋予java强大的面向对象的能力。他们两者之间
对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别。

所以,我们要明确以下四个问题:
1.什么是抽象类和接口?
2.抽象类与接口的区别?
3.什么情况下使用抽象类或接口?
4.一个demo引起来的对于java方法区、堆栈的研究?


1.什么是抽象类和接口?

抽象类:是用来捕捉子类通用特性的,是对子类共有的属性和行为的一种抽象。说白了就是当多个子类中出现相同功能,可以进行向上抽取功能定义,而不抽功能主体。说白了抽象类比一般类只是多了个抽象函数(共性行为),其他的该怎么描述还怎么描述。`

例:
比如new Animal(),我们都知道这个是产生一个动物Animal对象,但是这个Animal的嘴鼻子啥样是不知道,它没有一个具体动物的概念,所以他就是一个抽象类,需要一个具体的动物,如狗、猫来对嘴鼻子等进行特定的描述,我们才知道它长成啥样。

接口:初期理解,可以认为是一个特殊的抽象类,说白了就是一个特殊的类,只不过这个类是对行为的一种抽象,所以接口中的方法都是抽象的,接口是抽象方法的集合,接口只是一种形式,接口自身不能做任何事情,就是为别人使用某种功能而建立的

接口定义时的格式特点注意一下:
1.接口常见定义:常量,抽象方法;
2.接口中的成员都有固定修饰符:
常量:public static final
方法:public abstract
注:一般不在接口中定义属性!


2.抽象类与接口的区别?

参数 抽象类 接口
默认的方法实现 既可以有普通方法并实现,也可以有抽象方法 全部是抽象方法,不存在任何普通方法的实现
子类的实现 抽象类本身不可以用new创建对象,既本身不能实例化。抽象类中的方法要被使用,必须由子类必须复写(实现)所有的抽象方法后,建立子类对象调用;如果子类只是覆盖了部分抽象方法,那么该子类也是一个抽象类。 接口不可以创建对象,因为有抽象方法,所以子类要实例化,必须把接口的抽象方法全部覆盖(实现),否则该子类是一个抽象类
构造器 抽象类可以有构造器 接口不能有构造器
静态代码块以及静态方法 因为抽象类和普通类区别主要就是抽象类不能够实例化,所以可以有静态成员 接口的成员方法必须是public static,但是属性为public static final,所以接口有静态属性变量
与正常Java类的区别 除了抽象类不能实例化,其他一样 完全是两种类型
添加新方法 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变继承抽象类的类的代码。 如果你往接口中添加方法,那么你必须改变实现该接口的类。
类中是否能有私有变量 抽象类是可以有私有方法或私有变量的,因为它可以将子类的共有属性进行向上抽取概括 接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的
修饰符 抽象方法必须用abstract关键字进行修饰,而且抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法) 接口中的变量会被隐式地指定为public static final变量,而方法会被隐式地指定为public abstract方法且只能是public abstract方法
继承或者实现关系 单继承:一个类只能继承一个抽象类 多实现:一个类却可以实现多个接口,要注意的是接口之间是多继承,即:接口1 extends 接口2

所以,我们可以看出来接口和抽象类更加直白的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。

为什么上面那句话这么说呢?我自己认为还需要阐述两点来明确接口和抽象类本质上的区别,即不能仅仅从语法层次和编程角度来区别,还要从更高的层次进行本质区别。

1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象,它比抽象类更加“抽象”,并且一般情况下不在接口中定义属性。【例】:

interface Fly{ fly();
}
Airplane{   //一个飞机类并包含一个飞的行为fly(){}
}
Bird{   //一个鸟类也包含一个飞的行为fly(){}
}
/**显然将飞行的行为设计成一个类是不合适的,因为飞行并不是对一类事物的抽象描述,这只是对一个行为功能的描述,所以设计成接口而不设计成类是最合适的。然后不同的飞机不同的鸟在继承Airplane和Bird类即可。当然,要是更加严谨的话,将飞机和鸟设计成抽象类更好,因为这是对一类事物进行的描述,而且是包含了各种飞机,不同鸟的诸多相同属性或者行为,具体的实现(即比如战斗机怎么飞)靠子类来丰富就行了。*/

2)抽象类和接口所反映的设计理念是不同的,抽象类所代表的是“is-a”的关系,而接口所代表的是“like-a”的关系。也就是说继承是一个”是不是”的关系,而接口实现则是”有没有”的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,抽象类是从子类中发现公共部分,然后泛化成抽象类,子类继承该父类即可。而接口实现则是有没有、具备不具备的关系,比如鸟是否能飞(或者是否具备飞行这个特点),能飞行则可以实现这个接口,不能飞行就不实现这个接口。

3)抽象类是自底向上抽象而来的,接口是自顶向下设计出来的。对于抽象类而言,它是自下而上来设计的,我们要先知道子类才能抽象出父类,而接口则不同,它根本就不需要知道子类的存在,只需要定义一个规则即可.所以说抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。所谓模板式设计就想PPT中用模板A设计了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A了,如果它们的公共部分需要改动,则只需要改动模板A就可以了,不需要重新对ppt B和ppt C进行改动。而辐射式设计,比如某个电梯都装了某种报警器,一旦要更新报警器,就必须全部更新。也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。


通过一个Demo来理解,例子如下:

//需求:门和警报的例子:门都有open()和close()两个动作,我们如何通过抽象类和接口来定义这个抽象概念呢?
abstract class Door {public abstract void open();public abstract void close();
}或者:
interface Door {public abstract void open();public abstract void close();
}
//对于上面的功能需求,其他的具体类只使用open和close行为的话,通过extends使用抽象类方式定义Door或者Implements使用接口两者并没有太大差异。但是现在如果我们需要门具有报警alarm( )的功能,那么该如何实现?下面提供两种思路://第一种就是三个功能都放在抽象类里面,缺点:有的门并不一定具备报警功能,所以所有的子类继承这个Door都不那么合适了。
abstract class Door{abstract void open();abstract void close();abstract void alarm();
}
//第二种将这三个功能都放在接口里面,需要用到报警功能的类就需要实现这个接口中的open()和close(),也许这个类根本就不具备open()和close()这两个功能,比如火灾报警器,所以用接口实现三个功能缺点也很明显。
interface Door{void open();void close();void alarm();
}从这里可以看出, Door的open()、close()和alarm()根本就属于两个不同范畴内的行为,open()和close()属于门本身固有的行为特性,而alarm()属于延伸的附加行为。因此最好的解决办法是单独将报警设计为一个接口,包含alarm()行为,Door设计为单独的一个抽象类,包含open和close两种行为。再设计一个报警门继承Door类和实现Alarm接口。那么对于这个需求,下面的实现方式是可以满足该功能需求的,而且也进一步体现了抽象类表示的是"is-a"关系,接口表示的是"like-a"关系。即一个是继承关系,表示是不是父子类;一个是组合关系,表示一个子类具不具备该功能行为,说白了一个完整的子类需要几个接口的功能组合起来。interface Alram {void alarm();
}
abstract class Door {void open();void close();
}
class AlarmDoor extends Door implements Alarm {void oepn() {}void close() {}void alarm() {}
}

3.什么情况下使用抽象类或接口?

  • 如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。
  • 如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
  • 如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。
  • 需要实现特定的多项功能,而这些功能之间可能完全没有任何联系,就可以使用接口
  • 以上都是他人博客中的理解,我觉得使用接口和抽象类最主要的还是根
    据功能需求来,就跟上面门具有开和关的共性行为可以抽象为一个抽象类,
    并且配上一些共有属性;而这种特定的功能像报警器,就可以通过接口来实现了。

4.一个demo引起来的对于java方法区、堆栈的研究?

1)发现:只要是静态成员(当然,接口中的静态成员只能是public static final修饰的属性)不管是正常的类,还是抽象类或者是接口,都可以直接通过类名去访问!!!所以我们可以考虑到,静态成员到底是存放在内存的哪里,才让这本应该在堆内存的三个类(我自己的认为接口就是一个非常特殊的类)直接访问到静态成员。


2)原因:静态方法(包括各种方法)和静态变量都在方法区,简单说就是共享区域里,所以静态static修饰的成员可以直接被类访问,当然所说的这个类也包括抽象类和接口。


3)JAVA方法区是在堆里面吗?

三种情况:
①java7之前,方法区位于永久代(PermGen),永久代和堆相互隔离,永久代的大小在启动JVM时可以设置一个固定值,不可变;
②java7中,static变量从永久代移到堆中
③java8中,取消永久代,方法存放于元空间(Metaspace),元空间仍然与堆不相连,但与堆共享物理内存,逻辑上可认为在堆中。

大概举个例子就基本上明白了!

static int i = 1; //the value 1 is stored in the permgen section(永久代,说白了就是方法区里)
static Object o = new SomeObject();//该对象的引用在方法区中,而实际的对象在依旧堆里

本文章是基于若干博客内容和自己的总结创作而成,为了感谢他们并且分享给更多的人看,我将其他人博客链接贴在下面:
1.java中抽象类和接口的区别
2.Java抽象类与接口的区别
3.java提高篇(四)—–抽象类与接口

Java复习之抽象类和接口相关推荐

  1. java笔记之抽象类和接口

    前言 java笔记之抽象类和接口是开发人员的设计工具 正文 1.抽象类 客观存在的一类事物,当这类事物都是抽象的,无法具体的描述. 1)语法: 修饰符 abstract class 类名{ } 2)特 ...

  2. Java提高篇 —— 抽象类与接口

    一.前言 接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法. 抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间 ...

  3. Java 中的抽象类和接口

    Java 中的抽象类和接口 1.参考资料 深入理解Java的接口和抽象类 Java抽象类与接口的区别 2.前言 有一次旁听面试的时候,听到面试官问了一句:既然 JDK8 中接口有了默认方法实现,那接口 ...

  4. Java中类、抽象类、接口之间的区别和联系。

    Java中类.抽象类.接口之间的区别和联系. 程序设计所面对的问题域--客观世界,是由许多事物构成的,这些事物既可以是有形的(比如一辆汽车),也可以是无形的(比如一次会议).把客观世界中的事物映射到面 ...

  5. Java自学笔记——Java面向对象——04.抽象类、接口、内部类

    Java 面向对象各节 Java自学笔记--Java面向对象--01.回顾方法 Java自学笔记--Java面向对象--02.构造器.类和对象 Java自学笔记--Java面向对象--03.封装.继承 ...

  6. JAVA中的抽象类与接口

    JAVA中的抽象类与接口 接口和抽象类的区别: 接口和抽象类是支持抽象类定义的两种机制. 接口是公开的,不能有私有的方法或变量,接口中的所有方法都没有方法体,通过关键字interface实现. 抽象类 ...

  7. Java面向对象编程——抽象类和接口

    Java面向对象编程--抽象类和接口 定义类的过程就是抽象和封装的过程,而抽象类与接口则是对实体类进行更高层次的抽象,进定义公共行为和特征. 抽象类: 如果一个类没有足够的信息去描述一个具体的对象,那 ...

  8. Java笔记:抽象类和接口

    Java笔记:抽象类和接口 抽象类 接口 接口多重实现 接口继承接口 嵌套接口 工厂模式 抽象类 在普通类中,一个类必须实现自身写的所有方法,每个方法必须含有自己的方法体.即便先创建一个父类,再由后续 ...

  9. 初学Java基础学习——抽象类和接口的区别

    初学Java基础学习--抽象类和接口的区别 一.关键字 1)抽象类的关键字 abstract class A{//定义一个抽象类: } class Test extends A{//子类使用exten ...

最新文章

  1. java 中的单元测试_浅谈Java 中的单元测试
  2. 独家 | 使用机器学习预测房价(附链接)
  3. 一些蛮好的题目,学习
  4. Cocoapods警告 - CocoaPods没有设置项目的基本配置,因为您的项目已经有自定义配置集
  5. 为什么对象字面量没有名字?
  6. 温习php一(apache和php的配置)
  7. P1809 过河问题_NOI导刊2011提高(01)
  8. cad计算机功能键,【答疑】Auto CAD2014计算器快捷键是什么呢?? - 视频教程线上学...
  9. mmo服务器 性能测试,【Zinx应用-MMO游戏案例-(5)构建项目及用户上线】Golang轻量级并发服务器框架...
  10. SpringBoot性能优化方案
  11. electron与jquery起冲突,使用jquery报错解决方法
  12. 在网页上播放本地视频
  13. poj 1383 Labyrinth 树的直径
  14. 信号完整性(SI)电源完整性(PI)学习笔记(三十四)100条估计信号完整性效应的经验法则
  15. 一个Callable接口能有多少知识点?在裁员的大背景下,我仍然吊打了大厂面试官
  16. HTML5七夕情人节表白网页_生日快乐粒子烟花(自定义文字)_ HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 抖音3D旋转相册 js烟花代码
  17. Vue中的过滤器(filter)
  18. Hadoop中关于datenode无法启动的解决办法
  19. js数据结构- 双向链表
  20. 《C陷阱与缺陷》读后感

热门文章

  1. java protected_java语言中protected是什么意思
  2. Luogu P5069 [Ynoi2015] 纵使日薄西山
  3. Java中访问修饰符public、private、protect、default访问范围
  4. python画一颗小心心
  5. c语言函数遇到return就结束,关于c语言中return的用法介绍
  6. 从差等生到研究员:一位农村孩子的奋斗独白 | 治学大家谈
  7. 微信小程序获取网络状态
  8. 井字棋java代码_JAVA 井字棋
  9. 3、计算圆形面积(蓝桥杯入门题)
  10. 那些容易被忽视但又非常重要的安全知识