目的
1.向上转型是为了Java的多态特性服务的。
2.可以提高代码的重用性。
多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。(引用自https://www.cnblogs.com/chenssy/p/3372798.html)
方式
代码实例:
package com.pcl.demo;
import java.util.*;
public class Demo1 {
public static void function1(List list){
//遍历List
Iterator iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
public static void function2(ArrayList arrayList){
Iterator iterator = arrayList.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
public static void main(String[] args){
List list = new ArrayList();//向上转型
List list2 = new LinkedList();//向上转型
function1(list);
function1(list2);
ArrayList arrayList = new ArrayList();
function2(arrayList);
}
}
如果有一个需求要遍历输出集合,刚开始系统中只有ArrayLsit类型,那么可以写成function1的形式,如果后来要对LinkedList类型的集合进行遍历,就需要在写一个function(LinkedList linkedLsit) 以处理LinkedList类型的集合,如果一开始设计成function1的形式,则只需将不同的List子类向上转型成父类List即可,无须重写方法。
特点
Father father = new Son();
1.向上转型后father只能访问父类的非私有属性,无法访问子类的属性。
2.father可以访问父类的方法,如果子类重写了父类的方法,则执行的是子类的方法。
3.father无法访问子类特有的方法。
代码实例:
package com.pcl.demo;
class AA {
private int a = 0;
public int a1 = 1;
public void fA(){
System.out.println("AA's fA");
}
public void fAA(){
System.out.println("AA's fAA");
}
}
class BB extends AA{
private int a = 01;
public int a1 =22;
public void fA(){
System.out.println("BB's fA");
}
public void fB(){
}
}
public class Demo {
public static void main(String[] args){
AA aa = new BB();
aa.fAA();
aa.fA();
//aa.a;//无法访问私有成员变量
//aa.fB();//无法访问子类BB的特有方法
String name = aa.getClass().getSimpleName();
System.out.println(aa.a1);//只能访问父类的非私有成员变量
System.out.println(name);
}
}
原理
还没搞清楚