本篇文章主要总结抽象类和接口的语法以及注意事项。
抽象类:
在学完普通的类和对象、实例内部类和静态内部类后,了解到还有一个类叫抽象类。
抽象类的定义格式:在class前添加abstract(中文意思:抽象的)关键字,就定义了一个抽象类。
抽象类需要注意:
1:抽象类主要用于被继承,被继承后子类里面需要重写父类(抽象类)里面的所有抽象方法。
2:抽象类里面的方法可以有抽象方法和普通成员方法。换句话说也就是有抽象类不一定有抽象方法,但是有抽象方法一定要有抽象类。
3:抽象类不能实例化对象。
4:抽象类里面可以有普通成员变量和普通成员方法。
5:抽象类可以有构造方法,创立子类对象时候,由子类构造方法初始化父类成员变量。
6:抽象类里面的抽象方法没有具体实现,就等于只是放了个名字在抽象类里面,该抽象方法用于被子类重写后通过抽象类这个父类调用子类重写后的方法。
所以当子类继承父类时候,需要重写父类中的抽象方法,否则会报错。除非子类也是抽象类,继承的父类也是抽象类的时候不用重写父类的抽象方法
此时重写父类抽象方法不报错:
此时子类是抽象类继承父类也是抽象类的时候,不重写父类的抽象方法不报错:
那么抽象类的具体作用是什么呢?
便于检查是否错误调用父类方法。因为在写代码的时候,如果用了继承,然后父类是普通类,子类重写了父类方法,然后实例化对象的时候调用的是父类的方法而不是子类重写的方法,此时执行父类的方法得到并不是我们想要的功能。但是如果父类是抽象类,我们在父类中的抽象类可以不用写内容,这样在执行的时候我们可以发现我们调用的方法并没有效果,此时可以发现是错误地使用了父类的方法。
其实抽象类在我看来可以说是便于我们检查我们写代码的时候的错误。
接口:
接口定义格式为 interface+名字
1: 接口里面的普通方法统一为抽象方法,既然是抽象方法,那么就具有抽象方法的特性,即里面不能写内容,用于被重写。
2:接口里面的普通成员变量统一被编译器规定为public static finla类型,即为常量,在定义时候必须给一个值。
3:接口里面可以有静态成员方法,但是必须有内容。
4:类继承类用extends,类继承接口用implement,接口与接口的继承用extends。
5: 在普通的类继承抽象类的时候,普通类必须重写抽象类中所有抽象方法,在接口中,继承接口也必须重写接口所有的抽象方法,除非子类是抽象类。
6:类继承只能继承一个类,但是类可以继承多个接口(即实现了多继承),但是必须重写继承的所有接口的抽象方法,除非子类是抽象类。
7:接口不能被实例化对象。
8:如果接口继承了接口后又被一个类继承,那么这个子类上面有一个父类接口1和接口的父类接口2,那么这个子类必须重写以上所有接口的抽象方法,即重写接口1和接口2的抽象方法。
这是普通方法的定义:没有内容,被用于继承,且默认为抽象类:
这是静态成员方法:里面必须有内容
总结:
在我看来,接口和抽象类很像,在某些情况下可以互换,但是也有些许区别,区别主要在于:1:抽象类还是类,因此可以有普通成员变量和方法,只是多了一个抽象方法;而接口里面没有普通成员和方法,只有抽象方法和常量值和静态方法。2:抽象类还是类,只能实现单继承,即抽象类作为子类的时候也只能继承一个父类;而接口可以继承多个接口,实现多继承。