面向对象的三大特性:封装性、继承性、多态性。
多态性:一个对象拥有多种形态。
一、代码当中体现多态性: 父类引用指向子类对象 父类名称 对象名 = new 子类名称();或者 接口名称 对象名 = new 子类名称();
public class fu {
public void method(){
System.out.println("这是父类");
}
public void methodfu(){
System.out.println("父类特有");
}
}
public class zi extends fu{
@Override
public void method() {
System.out.println("子类方法");
}
}
public class main {
public static void main(String[] args) {
//使用多态的写法
//左侧父类的引用,指向右侧的子类
fu obj = new zi();
obj.method(); //输出子类方法
obj.methodfu(); //也可以调用,左父右子就叫多态。子类被当做父类来使用,输出父类特有
}
}
二、成员变量在多态中的应用: 访问成员变量的两种方法: 1.直接通过对象名称访问成员变量,看等号左边是谁,优先用谁,没有则向上找 2.间接通过成员方法访问成员变量,看该方法属于谁,优先用谁,没有则向上找
三、在多态的代码中,成员方法的访问规则: 看new的是谁,就优先用谁,没有则向上找 口诀:编译看左边,运行看右边。是看obj的左边右边 对比: 成员变量:编译看左边,运行还看左边 成员方法:编译看左边,运行看右边
四、向上转型是安全的,但是也有弊端:对象一旦向上转型为父类,那么久无法调用子类原本特有的方法 解决方案:向下转型,还原 格式:子类 对象名 = (子类) 父类对象名;
五、如何才能知道一个父类引用的对象,本来是什么子类? 格式:对象 instanceof 类型 这将会得到一个布尔值结果,也就是判断前面的对象能不能当中后面类型的实例