2022-07-25 第六组 李俊琦 面向对象——多态
今日重点
1、多态(动态绑定)
2、对象转型
学习重点
多态存在的三个条件
1、有继承关系 2、子类重写父类方法 3、父类引用指向子类对象
多态的转型
多态的转型分为两种:向上转型和向下转型
向上转型:父类 父类对象 = new 子类();
向下转型:子类 子类对象 = new 父类();
特点
instanceof关键字
注意:
1.先有继承关系,再有instanceof的使用
2.当该测试对象创建时右边的声明类型和左边的类其中的任意一个跟测试类必须得是继承树的同一分支或存在继承关系,否则编译器会报错。
匿名对象
多数用在传参
在创建对象时,只通过new的动作在堆内存开辟空间,却没有把堆内存空间的地址值赋值给栈内存的某个变量用以存储
在内存中的过程 上为匿名对象 下为正常
匿名对象特点:
1.由于我们没有记录堆内存对象的地址值,所以只能用一次,再次使用就找不到了
2.匿名对象的好处就是使用完毕就是垃圾,可以在垃圾回收器空闲时回收,节省内存空间
数组是不是类:是
1.站在JVM解析数组时,会生成一个数组的解析数组
2.站在编译角度,不是类因为没有类名,没有结构
链表:
单项链表:在维护一个节点的自身的值的同时,还要维护它的下一个值的指向
双向链表:在维护一个节点的自身的值的同时,还要维护它的上一个和下一个值的指向
//把数据添加到尾部
public boolean add(Integer data){
Node node=new Node(data,null);
//如果现在链表是空的,那我就是第一个结点
if (first==null){
first =node;
}else {
//如果链表不是空,那我就是最后一个结点
//我是原来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);
node.setNext(newNode);
}else{
//如果要插入的位置是null,只有一种情况,就是整个链表都是空
first =newNode;
last =newNode;
}
size++;
return true;
}
//默认删除头部的数据
public boolean remove1(){
if (size<0){
return false;
}
if (first !=null){
first =first.getNext();
size--;
}
return true;
}
//删除指定位置
public boolean remove(int index){
if (size<0){
return false;
}
if (size==1){
first =null;
last =null;
size--;
return true;
}else {
Node node=getNode(index-1);
node.setNext(node.getNext().getNext());
}
size--;
return true;
}
//根据下标获取指定的结点
public Node getNode(int index){
if (index<0){
index=0;
}
if (index>=size-1){
index=size-1;
}
// 根据下标获取指定的数据
public Integer get(int index) {
return getNode(index).getData();
}