一文道尽普通类、抽象类和接口的关系
java是一门面向对象的编程语言,每一个对象(真实世界中的实体)都是由普通类创建出来的。类是一组具有共同特征的对象的模板。例如每一条柯基犬都是一个实体,就可以做一个柯基犬的类(模板),每当需要一条柯基犬,我就可以通过这个类去new一个对象(使用模板去复刻一条柯基犬)
普通类和抽象类之间有什么关系
从概念上讲:抽象和具体是相对的概念,简单说,“犬”要比“柯基犬”抽象一点,“动物”要比“犬”抽象一点,而“生物”这个词又更抽象。抽象类是将一组具有共同特性的类(模板)的共同特性抽取出来形成的概念上的类。
抽象类和父类(普通类)一样都是使用extends关键字进行继承使用,那么他们之间有什么异同点呢?
共性:1,都可以有自己的成员变量,都可以有自己的成员方法。
2,子类可以选择重写或者不重写成员方法。
区别:1,普通类可以实例化,抽象类不行。因为抽象类只是一种概念上的类而不是具体的类。
2,抽象类中可以有抽象方法,普通类中不能有。子类集成抽象类必须重写其中的抽象方法(子类也是抽象类的情况下除外)。
1 abstract class Dog1 { 2 abstract void eat(); 3 } 4 public class KeJi extends Dog1 { // 继承抽象类 5 @Override 6 void eat() { 7 System.out.println("狗吃肉"); 8 } 9 }
1 class Dog2{ 2 void eat(){} 3 } 4 public class KeJi extends Dog2 { // 继承普通类 5 @Override 6 void eat() { 7 System.out.println("狗吃肉"); 8 } 9 }
看上面一段代码,接下来考虑这样一个问题:我在父类中写一个方法,方法体为空,这样完全可以实现抽象类中抽象方法的效果,而且这样做,我的父类可以创建实例,我的子类可以选择是否重写而不是必须重写,这样做灵活性更高了。这样的话抽象类存在的价值是什么?
答:这就要从抽象类和普通类的区别说起了:1,抽象类不能实例化,使用抽象类的目的之一就是使用它的这个特性来做一个限制实例化。从概念上讲,抽象类只是从一组拥有共同特性的类中抽取出来概念,并不是具体类,所以不能创建对象,使用继承普通类的方式无法实现该效果。2,抽象类中的抽象方法是必须要进行重写的(除非该类也是抽象类)这个特性虽说稍微牺牲了灵活性,但是在复杂的工程中它带来的好处是大大滴,越是复杂的工程好处越是大。使用继承普通类的方式可以不重写方法,编译器也不会报错,但是运行期报错的话,排查的难度会非常的大,为了一丢丢的灵活性得不偿失。
抽象类和接口之间有什么关系
接口是一套行为规范
一个很流行也很恰当的说法:对象和抽象类是is-a的关系,对象和接口是has-a的关系。其实抽象类是对普通类本质的抽象,接口是对普通类方法的抽象(抽象出来之后形成一套规范)。
抽象类和接口之间的异同点
1,两者在概念上是不一样的。
2,抽象类可以有具体的方法和属性, 接口只能有抽象方法和不可变常量(final);
3,抽象类中的属性可以私有、受保护和共有,所有修饰符必须要写。接口中只能是共有的不可变常亮,所以public和final是可以省略的。
抽象类中的方法可以是抽象的也可以是不抽象的,所以修饰符也不能省。接口中只能是共有抽象的,所以public和abstract可以省。
4,抽象类实现接口时,接口的方法在抽象类中可以被实现也可以不被实现,而普通实现接口必须实现所有接口方法。