面向对象特征之三:多态
前提:必须有继承关系(直接继承、间接继承)
多态形成的三个条件:
1.有继承
2.有重写
3.有父类对象指向子类引用
instanceof关键字:
判断某一个对象是否是某一个类的实例
instanceof后写的是类名。
返回值是boolean类型
第一种多态形式:(向上转型)
向上转型可以自动转(子类转父类自动转)
语法:
父类 父类对象 = new 子类();
Animal a = new Cat();
父类对象指向子类引用
第二种多态形式:(向下转型)
发生向下转型的前提,要先发生向上转型,才能通过强转再转成子类类型
子类 子类对象 = new 父类();
dog = (Dog) animal1;
匿名对象:
多数用在传参
匿名对象配构造器使用
语法:
new 类名();
new Dog().setName("黑黑");
功能:和正常的有名字的对象的功能是相同的。依然具备了调用属性,方法的功能。
使用场景:多数使用在传参,实参,多数情况下配合构造器使用
好处:节约资源
Arrays类,数组的工具类
数组是不是类?
- 站在JVM的角度看,是类,在JVM解析数组时,会生成一个数组的解析数组
- 站在编译角度,不是类,因为没有类名,没有结构。
链表
是一个数据结构
在链表中没有下标
在内存中,数组和链表都是最基本的数据结构,表,或者线性表。
线性表,线性的结构,
它是一个含有n>=0个结点的有限序列,有且只有一个上一个结点,有且还有一个下一个结点。有头有尾的一条线
单向链表:在维护一个结点的自身的值的同时,还要维护它的下一个值的指向
双向链表:在维护一个结点的自身的值的同时,还要维护它的上一个和下一个值的指向
链表的长度
private int size;
链表的第一个结点
private Node first;
链表的最后一个结点
private Node last;
把数组添加到链表的尾部
public boolean add(Integer data){
// 把传入的数据构建成一个结点
Node node = new Node(data,null);
// 如果现在链表是空的,那我就是第一个结点
if(first == null) {
first = node;
}else {
// 如果链表不是空,那我就是最后一个结点
// 我应该是在原来的last结点后面
// 我是原来last结点的下一个结点
last.setNext(node);
}
last = node;
size++;
return true;
}
在指定位置添加元素
public boolean add(int index,Integer data) {
Node node = getNode(index);
Node newNode = new Node(data,null);
if(node != null){
// Node next = node.getNext();
// newNode.setNext(next);
newNode.setNext(node.getNext());
node.setNext(newNode);
} else {
// 如果要插入的位置是null,只有一种情况,就是整个链表都是空
first = newNode;
last = newNode;
}
size++;
return true;
}
默认删除头部的数据
public boolean removeFirst() {
if(size < 0){
return false;
}
if(first != null){
first = first.getNext();
size--;
}
return true;
}
删除尾部的数据
public boolean removeLast(){
if(size <= 0){
return false;
}
if(size == 1){
first = null;
last = null;
size--;
return true;
}
if(last != null){
last = getNode(size - 2);
last.setNext(null);
size --;
}
return true;
}
修改指定下标位置的元素
public boolean set(int index,Integer data){
Node node = getNode(index);
node.setData(data);
return true;
}
根据下标获取指定的数据
public Integer get(int index) {
return getNode(index).getData();
}
获取链表的长度
public int size() {
return size;
}
根据下表获取指定的结点
private Node getNode(int index){
if(index < 0){
index = 0;
}
if(index >= size - 1){
index = size - 1;
}
找到第index个
Node cursor = first;
for (int i = 0; i < index; i++) {
cursor = cursor.getNext();
}
return cursor;