概念
父类引用指向子类对象,从而产生多种形态。
Animal animal=new Dog();
父类引用-------------子类对象
当两者存在直接或者间接的继承关系时,就形成了多态。父类引用能访问父类所声明的属性和方法,不能访问子类独有的属性和方法。
package Polymorphism;
public class Animal {
public String name;
}
class Dog extends Animal{
public String furColor;
};
class HaShiQi extends Dog{
public int age;
};
package Polymorphism;
/**
*
* @author lingking
* 父类的引用指向子类的对象
*
* 向上转型:
* 1 由子类类型转型为父类类型
* 2 肯定会成功,是一个隐式转换
* 3 向上转型的对象将只能访问父类中共有的成员,不能访问子类中独有的成员
* 向下转型:
* 1 由父类类型转型为子类类型
* 2 向下转型,存在失败的可能性,需要进行强制类型转换,是一个显式转换
* 3 如果失败了,会出现ClassCastException 异常
* 4 向下转型后的对象,将可以访问子类中的独有成员
*/
public class Program {
public static void main(String[] args) {
Dog dog=new Dog();
dog.name=" ";
dog.furColor=" ";
//向上转型
Animal animal=dog;
animal.name=" ";
//向下转型
HaShiQi haHhiqi=(HaShiQi)dog;//强制类型转换
}
}
下面接入一个实例
package Polymorphism;
public class program1 {
//需求:
//某动物园刚刚开业,需要录入动物信息
//录入的信息,包含动物的名字,年龄;如果是老虎,还需要额外的录入老虎的性别
//所谓的“录入系统”操作,简化为控制台输出
public static void main(String[] args) {
//向上转型,输出每一个动物的姓名和年龄
load(new Dog());
load(new Monkey());
load(new Elephent());
load(new Tiger());
}
//子类的共有属性为name与age
//load方法输出对象属性
public static void load(Animal animal) {
System.out.println(animal.name+animal.age);
//针对老虎做特殊处理
// instance of 关键字,因为在向下转型的过程中,,如果引用实际指向的对象,不是要转型的类型,此时强制转换,会出现ClassCastException异常。
// 所以,在向下转型之前,最好使用instance of关键字进行类型检查
if(animal instanceof Tiger) {
//向下转型
Tiger tiger=(Tiger)animal;
//输出老虎的性别
System.out.println("老虎的性别"+tiger.gender);
}
}
}
class Animal{
String name;
int age;
}
class Monkey extends Animal{}
class Dog extends Animal{}
class Elephent extends Animal{}
class Tiger extends Animal{
String gender;
}
需要对多个对象进行同样的处理,把这几个对象当作父类类型进行集中的处理,采用向上或者向下转型。
多态中的方法重写:当向上转型后的对象,调用父类中的方法。如果这个方法已经被子类重写了,此时调用的就是子类的重写实现。