抽象类
像颜色类、动物类这样的类就好比抽象类,没有人可以指定颜色是什么颜色,也没有人指定动物是那种动物。在Java中,使用abstract关键字定义的类称为抽象类,如:public abstract class MyClass{….};而用abstract修饰的方法称为抽象方法,抽象方法没有方法体,这个方法本身没有任何意义,除非被子类重写,抽象方法只能存在于抽象类里面,不可以存在非抽象类里面,而承载这个抽象方法的抽象类必须被继承,实际上抽象类除了被继承外没有任何意义。抽象类可以拥有自己的构造方法,但不能直接通过new进行实例化。但是可以通过子类继承,实例化子类的时候抽象类也会被实例化。




运行结果:
抽象类的注意点(重要):
(1)抽象类不能通过new关键词被直接实例化,但不代表抽象类不能被实例化,并且抽象类是拥有构造方法的,抽象类可以通过父类的引用来指向子类的实例来间接地实现父类的实例化。
(2)抽象类可以包含构造方法、普通方法、静态方法、抽象方法,且抽象方法只能存在于抽象类里面;抽象类也可以包含静态变量(static修饰)和成员变量。
(3)当某个类的父类是抽象类时,如果该类也是抽象类,则不用重写父类的抽象方法和普通方法,直接继承;如果该类时普通类,则需要重写父类的抽象方法,而直接继承父类的普通方法。
(4)final 和 abstract 不能联合使用,因为 final 修饰的类无法被继承,而abstract存在的唯一意义就是被继承,二者矛盾。
接口
接口的目的是指明相关或者不相关类的多个对象的共同行为,接口是抽象类的延伸,可以说接口是更加抽象的抽象类,接口的所有方法都没有方法体。一个类可以连接多个接口,继承接口里的方法,这就解决了Java中不支持继承多个父类的问题。在Java中无论是将一个类向上转型为父类对象,还是向上转型为抽象父类对象,或者向上转型为该类实现接口,这些都是没问题的,但抽象类和接口是不能直接使用new来实例化的。
语法:“class 类名 implements 接口{…}”或者“class 类名 implements 接口1,接口2,… ,接口n{…}”
创建接口不是创建class类了,而是创建Interface了(如图所示)。
实例如下:



运行结果:
下面看一下多重接口的实例(在上述例子上改动的):


运行结果:
接口的注意点(重要):
(1)接口没有构造方法,是不能被直接或间接地实例化的,但支持多态机制,即实现类的实例对象可以向上指向接口。
(2)接口只能包含抽象方法和常量;接口中的方法默认是 public abstract 类型(可省略);接口中的变量默认是 public static final 类型(可省略)。
(3)实现接口的非抽象类必须重写接口的所有方法。
(4)接口支持多继承,一个接口可以继承多个接口,一个类可以同时实现多个接口。
抽象类和接口的区别
抽象类和接口具有一定的相似性:
(1)它们都不能被实例化。
(2)它们都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。
二者的区别(特别注意):
(1)抽象类中有构造方法,接口中无构造方法;抽象类可以被间接实例化,接口不能被实例化。
(2)接口和接口之间支持多继承,类和类之间只能单继承。
(3)一个类可以实现多个接口,但只能继承一个抽象类。
(4)接口与实现它的类之间可以不存在任何层次关系,接口可以实现毫不相关类的相同行为,比抽象类的使用更加方便灵活;接口只关心对象之间的交互的方法,而不关心对象所对应的具体类。接口是程序之间的一个协议,比抽象类的使用更安全、清晰。一般使用接口的情况更多。
