标签:相同 抽象方法 details final 设计思想 stat csdn public oracl
顾名思义抽象类就是被抽象关键字(abstract)修饰的类,要理解抽象类,可以先从思想层面切入。
从开始学习java开始就常常见到一句话,万物皆对象。然而某些对象之间必然会有共同点,如一些特征或者一些行为。如果在每一个类中都重复的定义着相同的点,那还怎么做称霸整个地球的人类呢?人类当然是能偷懒则偷懒了。
所以说:将不同类的相同点抽象出来成为一个类,这就是抽象类。
那么接下来就来描述一下,抽象类究竟是什么。
抽象类是用abstract修饰的类,抽象类中可以包含抽象方法(用abstract修饰的方法)。抽象方法只需要定义方法的签名(方法名、返回值、方法参数)而不需要提供方法体。既然抽象方法没有方法体,那你就应该想到了,一个没有方法体的方法存在的意义只可能是交给子类来继承了。所以可以说抽象类就算为继承而存在的,写了个抽象类,又不去继承他,那就是个傻子。
抽象类中不仅可以有抽象方法,还可以有成员方法,这和后面要说的接口是不同的。抽象类中也可以有成员变量、常量、静态常量,一句话总结起来就是,抽象类中啥都可以有。记住这一点的话要找抽象类和接口的区别就清晰多了。
继承抽象类的子类必须实现抽象类中的抽象方法,否则子类也必须为抽象类。
还有个关键点就是抽象类可以有构造方法,不能实例化对象。
许多资料上把接口描述成一种规范,虽然光秃秃这一句话看起来不好理解,但是确实就是如此。结合一个生活中的例子就很好理解接口的概念了,平时电脑手机上的USB接口可以和Java中的接口类比起来,USB接口提供了一种规范,电子设备厂商就负责按照这个规范生产设备,至于USB连接的究竟是什么设备实现什么功能,这就不是设计USB规范的人所考虑的了。
回到Java中,接口中提供的各种方法就是规范,而实现这个规范的人具体是要怎么做、做什么,都不是接口关心的,接口就只是一种规范(当然java8中加入了default方法后,接口的神通就要更广大一些了)。
接口中所有方法均默认隐式的被修饰为 public static abstract的,所有成员变量被默认隐式修饰为public static final的。
接口并不是一种特殊的抽象类,接口就是接口。
oracle出版的The Java Language Specification(java编程规范)中关于接口的部分有这么一段: (如果一个接口没有直接的超接口,那么接口会隐式地声明一个具有签名s,返回类型r和throws子句t的公共抽象成员方法m。它对应于Object中声明的具有签名s,返回类型r和throws子句t 的每个公共实例方法m,除非该接口显示的声明具有相同签名,相同返回类型和兼容throws子句的方法。
如果接口在对象中声明为final的情况下显式声明了这样的方法m,那么这是一个编译时错误。) 这解释了为什么实现接口的方法在调用接口中并不存在的object方法时不会因通不过编译时多态而报错:接口中已经隐式的声明了object的所有方法,如果接口中显式的声明了object的最终方法的话,就会报错。
在以前的学习中,一直都是只能在编程语法层面上马马虎虎的理解抽象类和接口的区别,而在设计思想层面上的有一个问题是我一直都没有解决的。今天看了很多的相关博客,看到其中一篇时https://blog.csdn.net/shuiqukeyou12/article/details/52902517,真正的感受到了醍醐灌顶的感觉。如果以后想不起来就多看几遍这篇博文就好了
标签:相同 抽象方法 details final 设计思想 stat csdn public oracl
原文地址:https://www.cnblogs.com/dc5e/p/11122844.html