多态(is关系)
第一种多态形式:
向上转型;猫是动物,自动转型(小转大)
父类 父类对象=new 子类();
第二种多态形式:
向下转型;强转;
先让狼披上羊皮,再通过强转调用,羊的技能,
且要看传进来的类型(关键字:instanceof),返回值布尔,如果传进来的是猫,
对象名 instanceof 数据类型 判断某一个对象是不是这个类的实例
2 如果对象属于该类型,就返回true
3 如果对象不属于该类型,就返回false
前提:先发生向上转型,才能通过强转才能转成子类类型
子类 子类对象=(子类)new 父类();不报错,但是无法运行
java.lang.ClassCast类转换错误
Dog dog=new dog();
Cat cat=new Cat();
Animal animal1=dog;
Animal animal2=cat;
dog=(Dog) animal1;
dog.方法
注:(1)子类调父类天经地义
-
(2)编译看左边,运行看右边:编译的时候,会把animal看作cat,但是它在运行的时候实际还是animal,所以调用不了cat的方法.
Animal是cat的父类的情况下
Animal animal=new Cat();
-
不是当前类的对象,但可以调用当前类的方法
解释:因为在animal里赋的是cat,实际上是cat,所有其实可以看作是cat这个对象在行动
Person
person.feed(animal)
多态的形成条件
有继承;有重写;有父类对象指向子类引用
Public object show(object...obj){
}
public static void main(){
object obj=new Person();
obj=new ch02;
cho2.show(a,'a',1.5);//传啥都行
}
当看到参数为object类型的,代表传啥都行,但是同时对象多了,就得进行管理
Public boolean equals(object obj){
if(obj instanceof Person){
Person person = (Person) obj;}
}
instanceof关键字:
继承关系中判断某一个对象是否是某一个类的实例,返回值是boolean类型
它的具体作用是测试左边的对象是否是右边类或者该类的子类创建的实例对象
if(electronicProduct instanceof UDisk) { //判断U盘是否是接口的实例
UDisk uDisk = (UDisk) electronicProduct;
uDisk.importData();
uDisk.exportData();
匿名对象 new 类名():
(1)多数是用在传参,实参,通常情况配合构造器,传完了就被销毁,因为没存
因为匿名对象每次都新创一个空间,没有对象无法赋值
(2)优点:节约资源
和正常的有名字的对象的功能是相同的,依然具备了调用属性,方法的功能
public void show(){}
Ch03 ch03=new Ch03();有名对象ch03
//声明了一个变量来接值,把new ch03值暂时存起来放到ch03对象里
Ch03 ch03=new Ch03(); ->ch03.show();
new ch03(); ->new ch03.show();
//只传个参,在堆里面搞定,不用在栈里内存空间
officeBuilding officeBuilding=new officeBuilding();
sout.teacher.go(officeBuilding);
sout.teacher.go(new officeBuilding());
数组是不是类?
1.站在JVM的角度看,能调Object的方法,是类
2.站在编译角度看,不是类
类要有类的结构,要有类的类名
类的结构:arr.length
总结:数组是特殊的引用数据类型
引用数据类型:String,数组,接口
数组优势:
有下标,连续的内存空间,方便查询
劣势:
要扩容,增加的时候需要遍历,时间复杂度大,占内存
链表:与数组优劣互补
单项链表:两个参数,第一个放值,第二个放下一个指向的位置
双向链表:三个参数,第一个放上一个指向的链表位置,中间放值,下一个放下一个指向的位置
浙公网安备 33010602011771号