Javase学习06-通过实例体会多态
数组和链表都能实现增删查改,数组更便于查询,链表更便于增删。我们有时要对数据进行不同的操作,要频繁切换处理数据的方式,这时就可以用多态来实现。
1. 首先定义一个接口
package polymorphic; /** * @author: TSCCG * @date: 2021/5/18 */ public interface Super { /** * 1.定义添加数据功能 * @param data */ void add(Integer data); /** * 2.定义删除数据功能 * @param index */ void delete(int index); /** * 3.定义查询数据功能 * @param index * @return */ Integer get(int index); /** * 4.定义修改数据功能 * @param index * @param newValue */ void update(int index,Integer newValue); /** * 5.定义打印数据功能 */ void print(); }
package polymorphic; /** * @author: TSCCG * @date: 2021/5/18 */ public class SuperArray implements Super{ private int[] arr; private int currentIndex = -1; public SuperArray(int size) { arr = new int[size]; } /** * 定义数组默认长度为10 */ public SuperArray() { this(10); } /** * 1.增加数据 */ @Override public void add(Integer data) { currentIndex++; if (currentIndex >= arr.length) { int[] newArr = new int[currentIndex * 2]; for (int j = 0; j < arr.length; j++) { newArr[j] = arr[j]; } arr = newArr; } arr[currentIndex] = data; } /** * 2.删除某个数据 */ @Override public void delete(int index) { if (index < 0 || index > currentIndex) { System.out.println("数组中没有这个数!"); } else { for (int i = index; i < currentIndex; i++) { arr[i] = arr[i + 1]; } currentIndex--; } } /** * 3.通过下标查询某个数据 * @return */ @Override public Integer get(int index) { return arr[index]; } /** * 4.修改数据 */ @Override public void update(int index, Integer newValue) { arr[index] = newValue; } /** * 5.输出数据 */ @Override public void print() { for (int i = 0; i <= currentIndex; i++) { if (i == currentIndex) { System.out.println(arr[i]); } else { System.out.print(arr[i] + ","); } } } }
3.链表类实现接口
package polymorphic; /** * @author: TSCCG * @date: 2021/5/18 */ public class Node { private Integer data; private Node next; public Node(Integer data) { this.data = data; } public Integer getData() { return data; } public void setData(Integer data) { this.data = data; } public Node getNext() { return next; } public void setNext(Node next) { this.next = next; } }
package polymorphic; /** * @author: TSCCG * @date: 2021/5/16 */ public class SuperLink implements Super{ private Node head; private int size; /** * 1.从链表尾部添加节点 */ @Override public void add(Integer data) { //创建新节点 Node newNode = new Node(data); if (size == 0) { //当链表为空时,使新节点成为头节点 head = newNode; } else { //当链表不为空时,找到当前链表的末节点,使其指向新节点,新节点成为新的末节点 findEnd(head).setNext(newNode); } //链表长度加1 size++; } /** * 2.通过下标删除节点 */ @Override public void delete(int index) { Node node = getNode(index); //如果删除的节点是第一个节点,直接使head的后一位节点成为新的头节点即可 if (node.equals(head)) { head = node.getNext(); } else { getNode(index - 1).setNext(node.getNext()); } size--; } /** * 3.通过下标找到目标节点 * @return */ public Node getNode(int index) { Node tempNode = head; for (int i = 0; i < index; i++) { tempNode = tempNode.getNext(); } return tempNode; } /** * 3.1通过下标返回该节点的值 * @param index * @return */ @Override public Integer get(int index) { Node tempNode = head; for (int i = 0; i < index; i++) { tempNode = tempNode.getNext(); } return tempNode.getData(); } /** * 3.2找到尾节点 */ public Node findEnd(Node node) { if (node.getNext() == null) { return node; } //使用递归 return findEnd(node.getNext()); } /** * 4.更改目标节点的值 */ @Override public void update(int index, Integer newValue) { //首先根据下标找到目标节点,然后将新的值赋给它 getNode(index).setData(newValue); } /** * 5.显示所有节点信息 */ @Override public void print() { //因为不能随意改变head的位置,故定义一个临时节点代替head Node tempNode = head; //当临时节点不为空时,说明仍在链表内 while (tempNode != null) { if (tempNode.getNext() == null) { System.out.println(tempNode.getData()); } else { System.out.print(tempNode.getData() + ","); } tempNode = tempNode.getNext(); } } }
4. 测试类
package polymorphic; /** * @author: TSCCG * @date: 2021/5/18 */ public class Test { public static void main(String[] args) { //当需要更换为数组时,仅需将SuperLink改为SuperArray即可对以下所有语句进行修改 Super su = new SuperLink(); // Super su = new SuperArray(); su.add(4); su.add(1); su.add(3); su.add(2); su.print(); su.delete(2); su.print(); System.out.println(su.get(1)); su.update(0,5); su.print(); } }
结果:
4,1,3,2 4,1,2 1 5,1,2