Java基础-向上转型详解

目的

 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);
    }

}


原理

还没搞清楚

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值