㈠在java中经常见到多态,比如:
①List bookList=new ArrayList();
②bookList.add(1,"guohao");
③bookList.add(1,"hanshang");
那么我们说①可以灵活的换成List bookList=new LinkedList();而②③都不用改变
原因有以下几点:
⑴bookList这个对象中的方法全是List中的方法,而List中的方法子类ArrayList和LinkedList中都继承过来了,所以LinkedList中也有add这个方法,只是底层的实现方式不同,多态的核心思想就是:一个父类的方法,不同的子类有不同的实现方式,在这里具体的表现为:既可以使用数组的ArrayList实现,也可以随时换成链表的LinkedList实现。
(注:bookList这个对象是访问不到ArrayList中独有的方法的,因为父类没有权限访问子类中的方法,比如removeRange(int fromIndex, int toIndex) 这个方法是ArrayList独有的,List接口中没有这个方法,bookList就不能调用这个方法)。
⑵那么 bookList是怎么知道要去调用ArrayList的add方法而不是去调用LinkedList的add方法呢?因为
bookList=new ArrayList();执行到这句话的时候bookList中会存储一个具体的add方法的绝对地址,这个地址就是ArrayList中add方法的地址,所以在执行bookList.add(1,"guohao");这句话时,他才会非常聪明的知道具体的去调用哪个add方法。注:要点就是:对象中隐式的存储着方法的地址,所以对象知道自己要调用哪个方法,这也就是俗称的动态绑定,所谓动态绑定,就是把方法的地址存储到对象里面了。
㈡
①List bookList1=new ArrayList();
②List bookList2=new ArrayList();
③bookList1.add(1,"guohao");
④bookList2.add(1,"hanshang");
add方法怎么判别到底是bookList1还是bookList2调用的它自己呢?
因为:add方法其实多接受了一个参数,底层是这样的:
③bookList1.add(bookList1,1,"guohao");
④bookList2.add(bookList2,1,"hanshang");
对象把自己当做第一个参数传给了方法,所以方法才知道到底是谁调用的自己
这也是为什么this关键字只能在方法内部使用,因为add方法里面有个隐式参数bookList1(bookList1就可以用this代替)
所以static方法内不能使用this关键字:原因很明显,static方法没有隐式的参数,因为static方法不用对象调用,用类名直接调用的,也就不需要往静态方法中传递隐式的对象参数了。也就不能使用this了,因为没有隐式的参数供this代替。