多态
-
前提:两个对象(类)存在继承关系
-
多态的具体体现
一、方法的重载和方法的重写
二、对象的多态(重点,核心,难点)
- 一个对象的编译类型和运行类型可以不一致。
- 编译类型在定义对象时,就确定了,不能改变。
- 运行类型是可以变化的。
- 编译类型看定义时=号的左边,运行类型看=号的右边。
- 属性看编译类型,其他看运行类型
举个栗子
动物类
public class Animal {
public void cry(){
System.out.println("动物叫!!!");
}
}
狗类
public class Dog extends Animal{
@Override
public void cry() {
System.out.println("狗在叫!!!汪汪汪!!!");
}
}
猫类
public class Cat extends Animal{
@Override
public void cry() {
System.out.println("猫在叫!!!喵喵喵!!!");
}
}
主类
public class PolyObject {
public static void main(String[] args) {
//animal的编译类型是Animal, Dog是运行类型。
Animal animal = new Dog();
animal.cry();//当运行到这行时,由于运行类型是Dog,所以输出Dog里的cry方法
//编译类型是Animal(编译类型前面确定了,就不能改变。), Cat是运行类型。
animal = new Cat();
animal.cry();//当运行到这行时,由于运行类型是Cat,所以输出Cat里的cry方法
}
}
三、多态细节(向上转型)
1.本质:父类的引用指向子类的对象
2.语法:父类类型引用名 = new 子类类型();
3.特点:3.1编译看左边,运行看右边。
3.2可以调用父类中的所有成员(需遵守访问权限),但是不能调用子类的特有的成员。
四、多态细节(向下转型)
1.语法:子类类型 引用名 = (子类类型) 父类引用;
2.只能强转父类的引用,不能强转父类的对象
3.要求父类的引用必须指向的是当前目标类型的对象
4.可以调用子类类型中所有的成员
五、多态细节(属性)
属性没有重写的说法;属性的值直接看编译类型。
例:
public class main {
public static void main(String[] args) {
Person person = new Son(); //向上转型
System.out.println("输入结果为:" + son.a); //看编译类型,类型为Person,所以输出 10
System.out.println("======================");
Son son = new Son();
System.out.println("输入结果为:" + person.a); //看编译类型,类型为Son输出 20
}
}
class Person{ //父类
int a = 10; //属性
}
class Son extends Person{ //子类
int a = 20; //属性
}
六、多态细节(instanceOf)
instanceOf比较操作符,用于判断对象的运行类型是否为XX类型或XX类型的子类型