62,614
社区成员
发帖
与我相关
我的任务
分享
import java.util.*;
public class TestLinkedList
{
public static void main(String[] args)
{
List L = new LinkedList();
for(int i=0; i < 9 ;i++)
L.add("周"+i);
System.out.println(L);
System.out.println(L.getFirst()); //获取list头元素
System.out.println(L.indexOf("周1"));
L.add(7,"周100");
L.removeLast(); //删除最后一个元素
System.out.println(L);
Collections. shuffle(L);
System.out.println(L);
Collections.sort(L);
System.out.println(L);
System.out.println(Collections.binarySearch(L,"周100"));
}
}
public class MyLinkedList extends LinkedList {
public Object removeLast() {
System.out.println("不可以删除最后一个!!!");
return null;
}
}
这个时候,随便你声明具体的类,还是LinkedList
LinkedList list = new MyLinkedList();
list.add("1234");
list.add("5678");
list.removeLast();
编译都能通过,且在运行时,会执行你所谓的“动态绑定”。
再把我的例子复述一遍:
今天(编译期,对应javac命令执行的时间),当我(代码)对你(编译器对应javac命令)说:“明天,有个人(List)要来”,你(编译器)只知道他是个人(List)——插一句,编译器还没智能到能够分析代码,这个即没必要,也不可靠,所以,即使就在等号后面马上出现了真实类型。
如果这个时候(还是编译期),我(代码)对你(编译器)说:“你带这个人(List)去男厕所(执行removeLast方法)”,你(编译器)会傻傻地拒绝(编译错误),说:“我不知道他是不是个男人(LinkedList),不能让这个人(List)去做只有男人(LinkedList)才能做的事情”。
这个时候(编译期),我(代码)只能改口(改掉你错误代码)说:“明天,有个男人(声明类型,也就是等号左边那个类型)要来,你带他去男厕所(执行removeLast)”。这个时候,你(编译器)会很高兴的确认我给你的任务(编译通过)
到了第二天(运行期,对应java命令执行的时间),那个人来了,检查无误,果然是个男人,而且还是个帅哥(男人的子类,好比上面MyLinkedList)。反正不管是帅哥也好,糟老头(其他LinkedList子类)也罢,反正一定是个男人,一定能去男厕所(执行在在LinkedList中定义过的removeLast方法)。