从方法重载和重写来理解多态

19年1.19
内容主要:从方法重写和重载浅浅的理解下java多态机制
方法重写与重载的区别等等,已经有前人铺好了路,走就好了.这里只是分享下个人浅显的见解.欢迎指正

多态的机制:
本质上多态分为两种:
1.编译时多态(又称静态多态)
2.运行时多态(又称动态多态)

1.编译时多态
重载(Overloading)就是编译时多态的一个例子,编译时多态在编译时就已经确定,运行时运行的时候调用的是确定的方法。

2.运行时多态
重写(Overriding)
运行时多态分为两种:
1.子类继承父类(extends)
2.类实现接口(implement)

无论是哪种方法,其核心之处就在于对父类方法的改写或对接口方法的实现,以取得在运行时不同的执行效果。

要使用多态,在声明对象时就应该遵循一条法则:声明的总是父类类型或接口类型,创建的是实际类型。举例来说,假设我们要创建一个ArrayList对象,声明就应该采用这样的语句:
List list =newArrayList();
而不是
ArrayList list =newArrayList();
在定义方法参数时也通常总是应该优先使用父类类型或接口类型,例如某方法应该写成:
publicvoid doSomething(List list);
而不是
publicvoid doSomething(ArrayList list);
这样声明最大的好处在于结构的灵活性:假如某一天我认为ArrayList的特性无法满足我的要求,我希望能够用LinkedList来代替它,那么只需要在对象创建的地方把new ArrayList()改为new LinkedList即可,其它代码一概不用改动。

多态的用途:

在于对设计和架构的复用.更进一步来说,面向接口编程,而不是面向实现编程

多了解一些:
动态绑定具体的调用过程为:

1.首先会找到被调用方法所属类的全限定名

2.在此类的方法表中寻找被调用方法,如果找到,会将方法表中此方法的索引项记录到常量池中(这个过程叫常量池解析),如果没有,编译失败。

3.根据具体实例化的对象找到方法区中此对象的方法表,再找到方法表中的被调用方法,最后通过直接地址找到字节码所在的内存空间。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章