一、abstract class和interface
含有abstract修饰符的类即为抽象类,abstract class不能创建实例对象。
含有abstract方法的的类一定为abstract class,abstract class中不一定有abstract方法。
abstract class中定义的abstract方法必须在具体子类中实现,所以不能有抽象构造方法和抽象静态方法(因为构造器和静态方法不能够被重写)。
如果子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。
interface可以说是抽象类的一个特例,interface中的所有方法必须是抽象的。
interface中的方法默认为public abstract类型,接口中的成员变量类型默认为public static final 。
interface更多的是在系统架构设计方面发挥作用,主要用于定义模块之间的通信契约,而抽象类在代码实现方面发挥作用,可以实现代码的重用。abstract和interface的区别:
1、 抽象类可以有构造方法,接口中不能有构造方法;
2、 抽象类可以有普通成员变量,接口中不能有普通成员变量;
3、 抽象类可以包含非抽象的普通方法,接口中的所有方法必须是抽象的;
4、 抽象类中的抽象方法的访问修饰符可以使public、protected(默认类型也可以编译过去),接口中的抽象方法只能是public类型的,并且默认为public abstract类型;
5、 抽象类中可以包含静态方法,接口中不能包含静态方法;
6、 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问修饰符可以任意,接口中定义的静态成员变量只能是public static final类型,并且默认的就是public static final类型;
7、 一个类可以实现多个接口,但是只能继承一个抽象类。(Java语言利用接口机制来实现多继承的大部分功能)
二、Override和Overload
Override是重写的意思,Overload是重载的意思。
Override表示类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例调用这个方法时,将调用子类中定义的方法,这相当于把父类中定义的那个完全相同的方法给重写了,这也是面向对象编程的多态性的一种表现。使用重写应该注意:
1、 重写的方法的签名(方法名和参数列表)必须要和被重写的方法的签名一致,才能达到重写的效果;
2、 重写的方法的返回值必须要和被重写的方法的返回值一致;(因为返回类型不作为重载条件,所以这样将在子类中出现两个完全相同的方法,编译将会出错。)
3、 重写的方法所抛出的异常必须要和被重写的方法的所抛出的异常一致, 或者是其子类;
4、 重写的方法的访问修饰符必须要和被重写的访问修饰符一致或者权限更大;
5、 被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写;
6、 不能重写被修饰符final修饰的方法;
7、 构造器不能被继承,因此不能被重写。
Overload表示同一个类中(由于子类可以看到父类中的非private方法,所以对于子类来说可以重载父类中的方法,反过来则不可以)可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数和参数类型不同),然后在调用时,Java虚拟机就会根据不同的参数样式,来选择合适的方法执行。使用重载需要注意:
1、 在使用重载时只能根据不同的参数样式,例如不同的参数类型,不同的参数个数,不同的参数顺序;
2、 不能通过访问修饰符、返回类型、抛出的异常进行重载;(访问修饰符,抛出的异常很容易理解不能进行重载,至于返回类型我们可以举个例子说明这个问题。因为有时候我们调用一个方法时可以不定义返回结果变量,即不关心其返回结果,例如我们调用map.remove(key)或者map.put(key,value)方法时,虽然有返回值,但是我们通常不会定义接收返回结果的变量,这时候假设该类中有与这些方法参数列表完全相同,只有返回类型不同,Java虚拟机就无法确定编程中到底是想调用哪个方法了,因为他无法通过返回结果类型来判断)
3、 方法的异常类型和数目不会对重载造成影响
4、 对于继承来说,如果某一个方法在父类中的访问修饰符是private,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新的方法,而不会达到重载的效果。