目的:使用同一个方法名,通过传入不同的参数可以实现不同却相似的功能,方便调用者使用。
条件:在同一个类中,方法名相同、参数列表不同(参数类型(类型、顺序)、数量的不同),与访问修饰符、返回值类型无关。
例子:print()、构造方法。
引申的问题:抽象类与接口有无构造方法?
答:抽象类有构造方法,接口没有构造方法。
构造方法的作用:实例化对象的过程中,给该对象的实例属性进行初始化。
原因如下:
首先要明白为什么会有抽象类、接口的存在,存在的意义是什么?
抽象类是为了实现程序的多态性(继承extends),所以此时作为抽象类必须将子类的所有共性抽象出来,is-a关系(里氏替换原则),但如果此时有一些新增的类,那么这个抽象类就要考虑对功能扩展的问题,由此可见写一个抽象类的功能虽然广泛,但是代价大。
那么接口就有了意义,在保留多态的同时,提高了程序的可扩展性(实现implements)。当实现类需要扩展功能时(某种动作、某组动作),只需要通过实现某个接口,被jvm强制去实现接口中的方法就可以了。此时也体现了开闭原则。
so,宏观来讲:接口:动作,抽象类:对实体类的进一步抽象。动作需要初始化干嘛呢?而且从语法层面,编译器会报错:Interfaces cannot have constructors。而且当子类去创建实例时,会初始化父类,不管父类是不是抽象类,都会调用父类的构造方法。所以此处也解释了抽象类为什么要有构造方法。
那么此处又可以再引申一个问题:接口(interface)的基类是不是Object?
答:不是,接口只是隐式调用了Object中所有的公有方法。
接上一个问题中解释了接口为什么没有构造方法,然后Object类是有构造方法的,所以如果说接口的基类是Object,那么岂不是矛盾了!
我们再学习静态常量池时,class_info会有一个直接父类的信息,比如接口A
class_info里存放了:A、Object
但是当接口B去extends(组合)A时,B的class_info信息如下:
按道理B的class_info里应该只存放了 接口A和接口B,因为存放的时直接父类,但却还有Object类,这就说明了Object不是接口的父类,只是接口隐式调用了Object类中所有的公有方法。