目录
一、抽象类和接口
1.抽象类
1.1概念
抽象类是抽象出了某一类事物的特性。类中没有包含足够的信息来描绘一个具体的对象,所以抽象类不能实例化,需要被子类继承。子类需要实现的部分是抽象类中的抽象方法。当然,抽象类中除了抽象方法,还可以定义其他的变量,静态代码块,静态方法,普通方法,构造方法。
子类继承抽象方法时,也可能会出现两种情况:
①子类能够将抽象方法全部实现,这个时候子类也就是一个普通的java类。
②子类没办法将抽象方法全部实现,可能只是实现了一部分抽象方法也有可能都没有实现,这个时候子类就是一个抽象类,就需要子类的子类来实现这些没有被实现的抽象方法。
③抽象类中并没有抽象方法,这种情况也是存在的,那么子类继承该抽象类时就只需要实现自己的逻辑就行。(有抽象方法的类一定是抽象类,但是抽象类中不一定有抽象方法)
1.2注意
①抽象类不能实例化,实例化的任务只能交给子类。唯一的办法是:父类引用指向子类对象。
(只有当抽象方法全部被实现之后才能被实例化)
②抽象类和抽象方法都使用关键字abstract来修饰。
③一个类只能继承一个抽象类。
④抽象方法只包含一个方法名,但没有方法体。方法名后面直接跟一个分号
⑤ 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
2.接口
2.1概念
接口就是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。实现接口的类,必须实现接口内所描述的所有方法,或者实现接口的类被定义为抽象类。接口中可以有变量,但必须用public static final来修饰。
2.2注意(JDK1.8之前)
①接口支持多继承,一个类可以实现多个接口。
②接口中的方法会被隐式的指定为 public abstract(只能是 public abstract)。
③接口中的所有方法都是抽象方法,都没有方法体。
3.抽象类和接口的区别
①抽象类中除了抽象方法还有静态代码块、静态方法等,但是接口中只有抽象方法和public static final修饰的变量。
②抽象类中的方法可以有方法体,但是接口中的方法没有方法体。
③一个类只能继承一个抽象类,但是一个类可以实现多个接口(一个接口可以有多个实现类)。
④子类继承抽象类使用extends,实现类实现接口使用implement。
⑤实现类实现接口必须实现全部的抽象方法,除非实现类为抽象类。子类继承抽象类必须实现所有的抽象方法,除非子类为抽象类,交给子类的子类去实现。
⑥抽象类中的权限任意,但是接口中隐式地定义变量必须为public static final ,方法必须为public abstract(不一致会被报错)。
⑦Interface关键字用来声明一个接口。
⑧接口允许多继承。
二、重写和重载
1.重写
1.1概念
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 方法名、返回类型和参数列表都不能改变。即外壳不变,核心重写!
1.2重写规则
①子类重写父类的方法,因此只有继承才能重写。
②重写的方法名称,参数列表和返回值类型原则上必须相同。(返回值类型java7 及更高版本可以不同)
③声明为 final 、static的方法不能被重写。
④构造方法不能被重写。
⑤子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法;子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。
⑥访问权限不能比父类中被重写的方法的访问权限更低。
当需要在子类中调用父类的被重写方法时,要使用 super 关键字。
2.重载
2.1概念
重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。最常用的地方就是构造器的重载。
2.2重载规则
①重载的方法必须改变参数类型或者参数个数、返回值类型可以相同也可以不同,方法名相同、访问限定符也可以改变。
②方法能够在同一个类中或者在一个子类中被重载(重载发生在一个类中)。
3.重写和重载的区别
①重写的参数列表不能改变,重载的参数列表一定要改变(参数类型或者参数个数)。
②重写发生在两个类中(父类和子类),重载发生在一个类中。
③重写的访问限定符不能有更严格的限制,重载的访问限定符很随意。
④重写的返回值类型不能改变,重载的返回值类型可以相同也可以不同。
4.总结
方法的重写和重载是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。
- (1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载。
- (2)方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。
- (3)方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。