多态性一
多态在java中的两种体现:
1.方法的重载和重写.
重载(本类中的同名方法:体现相同的名称方法实现不同的逻辑)
重写(子类对父类方法的覆盖:子类可以使用和父类相同的方法名,覆盖掉父类的逻辑)
如:子类的方法想修改逻辑但是有其他的子类在使用父类的方法;可以考虑子类继承父类;重写父类方法;
2.对象的多态性–可以直接应用在抽象类和接口上.
java引用变量两个类型:
编译时类型:
由声明该变量时使用的类型决定,
运行时类型
由实际赋给该变量的对象决定;
(对象的多态)若编译时类型和运行时类型不一致就出现多态(polymorphism);
多态性二:
对象的多态
子类的对象可以代替父类的对象使用;
一个变量只能确定一个数据类型
一个引用类型变量可能指向多个不同类型的对象;
子类可以看做是一个特殊的父类;所以父类类型的引用可以指向子类的对象:向上转型;
review b =new review();
test a=new test();
//以上是正常情况
review e=new test();
//父类的引用对象可以指向子类的实例
review a=new review();//这里的引用对象a指向了两个实例对象
a=new test();//且没有报错;这就是对象的多态 一个引用类型变量可能指向多个不同类型的对象;
多态性三:
一个引用类型变量如果生命为父类的类型,但是实际引用的是子类对象,那么该变量就不能再访问子类中添加到的属性和方法
a.show();
test a=new test();
a.banji="1";
review e=new test();
e.banji="1";//编译报错我的review没有班级这个属性
//因为test已经向上转型为test
//属性是在编译的时候确定的
//编译时e为review类型 没有banji的成员变量因而编译错误
虚拟方法调用:
test a=new test();
a.show();//这个是调用子类方法
review b= new review();
b.show();//这是调用父类方法
//这两个都是正常调用
review e= new test();
e.show();
//此时e打印的为子类和之前的 编写属性不一样 编译时e为review类
//而方法是在运行时调用的所以调用的是student类的show方法
//这个叫动态绑定
多态小结
前提:
存在继承或者实现的关系
要有覆盖操作(子类可以重写父类方法)
成员方法:
编译时:要查看引用所属的类中是否有调用方法。
运行时:调用实际对象所属的类中的重写方法。
成员变量:
不具备多态性,只看引用变量所属的类;
instanceof 操作符;
检验 x是否为类a的对象 返回值为Boolean型;
review b =new review();
test a=new test();
//检测a 属不属于 review这个类;返回值为 boolean类型
System.out.println(a instanceof review);
//就是检验某个对象是不是某个类的子类;