多态性严格来讲有两种描述形式:
方法的多态性:
1.方法的重载:同一个方法名称会根据传入参数的类型及个数不同会执行不同的方法体
2.方法的覆盖(重写):同一个方法会根据子类的不同,实现不同的功能
对象的多态性:指的是发生在继承关系类之中,子类和父类之间的转换问题
1.向上转型(自动完成):父类 父类对象 = 子类实例;
2.向下转型(强制转换):子类 子类对象 =(子类) 父类实例; eg:long型数据与int型数据的相互转换
范例:向上转型
class A{
public void print() {
System.out.println("A.public static void main()");
}
}
class B extends A{
public void print() {
System.out.println("B.public static void main()");
}
}
public class TestDemo {
public static void main(String[] args) {
A a=new B(); //向上转型
a.print();
}
}
范例:向下转型
class A{
public void print() {
System.out.println("A.public static void main()");
}
}
class B extends A{
public void print() {
System.out.println("B.public static void main()");
}
}
public class TestDemo {
public static void main(String[] args) {
A a=new B();
B b=(B) a; //向下转型
b.print();
}
}
向上转型:由于所有的子类对象实例都可以自动的向上转型,所以在于参数的统一上。参数统一之后,还可以调用子类覆盖后的方法体,即:同一个方法针对于不同的子类可以有不同的实现。
向下转型:指的是父类要调用子类自己特殊的方法。所有的父类发生了向上转型后只能看见父类自己定义的全部方法信息,但看不见子类特殊的方法,于是此时就要使用向下转型了。将父类对象转换为子类对象。这样就可以使用子类的特殊功能了。
对于对象的转型,给出以下的总结:
1. 80%的情况下都只会使用向上转型,因为可以得到参数类型的统一,方便于我们的程序设计;
子类定义的方法大部分情况下请以父类的方法名称为标准进行复写。不要过多的扩充方法。
2. 5%的情况下,会使用向下转型,目的是调用子类的特殊方法;
3. 15%的情况下是不转型的,例如:String.
个性化的操作在一个标准的开发之中应该尽量少出现,因为对象的转型操作里面毕竟有强制转换的问题,容易带来安全隐患。
向下转型建立在向上转型的基础上!