多态定义
代码当中体现多态性:父类引用指向子类对象。
格式:
- 父类名 对象名 = new 子类名();
- 或者:
- 接口名 对象名 = new 实现类名();
多态中访问成员变量的两种方式:
- 1.直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找。
- 2.间接通过成员方法访问成员变量:看这方法属于谁,优先用谁,没有则向上找。
多态中成员方法的访问规则是:
看new的是谁,就优先用谁,没有就向上找
- 成员变量口诀:编译看左,运行看左。
- 成员方法口诀:编译看左,运行看右。
public class Demo01Multi {
public static void main(String[] args) {
//左侧是父类引用,指向右侧子类对象
Fu demo = new Zi();
demo.method();//new谁,就是先调用谁的方法,如果没有再找父类
System.out.println(demo.num);//直接访问成员变量,等号左边是父类
demo.show();//如果子类将方法重写了,就是子类的方法。
demo.methodFu();//子类没有,父类有,向上找父类
demo.method();//父子都有优先用zi,因为new的是子。
}
}
package demo01;
public class Fu {
int num = 10;
public void method(){
System.out.println("父类方法执行");
}
public void methodFu(){
System.out.println("父类特有方法执行");
}
public void show(){
System.out.println(num);
}
}
package demo01;
public class Zi extends Fu{
int num = 20;
@Override
public void method(){
System.out.println("子类方法执行");
}
public void methodZi(){
System.out.println("子类特有方法执行");
}
@Override
public void show(){
System.out.println(num);
}
}
为什么使用多态
如图,当我们使用共有的一个父类时,如果正常子类继承,就需要写两遍子类的对象定义,如果使用多态,父类在左边就可以优化代码。。。
对象的向上转型
对象的向上转型,其实就是多态写法:
格式:
父类名称 对象名 = new 子类名称();
含义:
右侧创建一个子类对象,把他当作父类看待。
注意事项:向上转型一定是安全的。他就好比从小范围跳到大范围。int类型——>lang类型。自动类型转换。
对于这种向上转型有一个弊端:
它创建后的对象,不能调用原来子类中特有的方法。
对象的向下转型
对象的向下转型就是用来解决这个弊端的,它就是一个还原的过程。
格式:
子类名称 对象名 = (子类名称) 父类对象;
含义:
将父类对象,还原成本来子类对象。
注意事项:
1.必须保证对象本来创建的时候,就是依据该子类创建的,才能向下转型成该子类对象。
2.如果对象创建的时候就不是依据A类创建的,非要向下转型成A类的对象,就会报错。
instanceof判断
那么在向下转型时因为原来子类很重要,所以我们怎么才能知道一个父类引用的对象本来是什么子类尼?
instanceof判断
格式:
对象 instanceof 想判断的类名称
这个语句会得到一个boolean结果,也就是判断前面的对象能不能当后面类型的实例。
它会放在if语句中下接向下转型。
如:if(animal instanceof Cat){
Cat cat = (Cat) animal;
cat.它的特殊方法();
}