多态存在的三个条件
1、有继承关系 2、子类重写父类方法 3、父类引用指向子类对象
多态的转型分为两种:向上转型和向下转型
向上转型:父类 父类对象 = new 子类();
向下转型:子类 子类对象 = new 父类();
注意:
1.先有继承关系,再有instanceof的使用
2.当该测试对象创建时右边的声明类型和左边的类其中的任意一个跟测试类必须得是继承树的同一分支或存在继承关系,否则编译器会报错。
需要用到对象的强制类型转换时,需要使用instanceof进行判断。
多数用在传参
在创建对象时,只通过new的动作在堆内存开辟空间,却没有把堆内存空间的地址值赋值给栈内存的某个变量用以存储
在内存中的过程 上为匿名对象 下为正常
1.由于我们没有记录堆内存对象的地址值,所以只能用一次,再次使用就找不到了
2.匿名对象的好处就是使用完毕就是垃圾,可以在垃圾回收器空闲时回收,节省内存空间
ArrayList和LinkedList的区别
1.ArrayList使用动态数组存储数据,linkedlist使用双向列表存储数据。
2.ArrayList可以通过地址进行随机访问,linkedlist只能移动指针进行访问
3.ArrayList是有长度限制的,默认长度是10,当超过长度限制就需要进行扩容
链表是一种物理存储单元上非连续、非顺序的存储结构。数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
线性表的顺序存储结构缺点是每一次插入和删除元素,大量元素的移动会导致时间效率低下。为了改进顺序存储结构的缺点,引入链式存储结构,即为链表。
链式存储结构的特点是用一组任意的存储单元来存储线性表中的数据元素。这样在插入和删除元素时,可以通过直接修改指针完成操作,时间效率大大提高。但因为链式存储结构的存储单元不连续,所以需要通过指针来访问它的后续元素。
在进行链表的结点删除时候,要分情况讨论:
当要删除的结点位于头结点的时候: 如下图要删除的元素1的结点位于头结点,先进行while判断头结点是否为null且判断该结点的元素是否为要删除的元素,如果是把head指向head.next即可,直接跳过头结点,直到头结点不是要删除的元素就结束循环。
[要删除的元素1位于头结点]
当要删除的结点不在头结点的时候:如下图删除元素为3的结点,由于上面已经判断了头结点不是要删除的元素,所以我们从头结点的下一个结点开始循环,即cur.next,当cur.next是要被删除的元素时,直接cur.next = curr.next.next就能直接跳过cur.next,断开。
[要删除结点的元素为3的结点]
删除链表的头结点的元素和删除链表的尾结点的元素