• java中的上转型解释(多态的另一种)


    我们先来看个例子:

    public class Polymorphism  extends BaseClass{
    
    	    public String book="轻量级j2ee教程";
    	    
    	    public void sub()
    	    {
    	    	System.out.println("子类的普通方法");
    	    }
    	    public void  test()
    	    {
    	    	System.out.println("子类覆盖父类的方法!");
    	    }
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		BaseClass base=new  BaseClass();
    		System.out.println(base.book);
    		base.test();
    		base.base();
    		
    		Polymorphism subclass=new Polymorphism();
    		System.out.println(subclass.book);
    		subclass.test();
    		subclass.sub();
    		
    		//test是上转型对象
    		BaseClass test=new Polymorphism();
    
    		//通过引用类型访问变量,只会访问到编译时类型定义的变量,而不会访问执行时定义的变量
    		System.out.println(test.book);
    		
    		/**
    		 * test对象的引用类型是BaseClass 但是执行类型是Polymorphism
    		 * 编译阶段只能调用其编译类型所具备的方法,但是运行时则执行它运行时类型所具有的方法
    		 */
    		
    		test.base();   //子类没有对应的方法(实际上子类已经继承了父类的base方法),直接调用父类的base方法
    		test.test();   //子类有覆盖父类的test方法,执行时,直接调用子类的test方法
    	}
    }
    class BaseClass
    {
        public int book=6;
        public void base()
        {
        	System.out.println("父类的普通方法");
        }
        public void  test()
        {
        	System.out.println("父类被覆盖的方法!");
        }
    }
    
    执行结果:
    6
    父类被覆盖的方法!
    父类的普通方法
    轻量级j2ee教程
    子类覆盖父类的方法!
    子类的普通方法
    6
    父类的普通方法
    子类覆盖父类的方法!

     从上面的例子可以看出:

    对于上转型对象test这个引用类型而言:存在两种类型情况(1,编译时类型   2,运行时类型)

    诚然:在编译时,test是BaseClass类型,但是在运行时test是Polymorphism 类型。

    对于这种上转型变量而言:在编译的过程中,他只会调用BaseClass中的方法,但是运行时,他会调用Polymorphism 中的方法(包括从父类继承的方法)!

    这种上转型,也是多态中的一种!

    啥叫多态??

    相同类型的变量,调用同意方法时呈现出不同的行为特征,这就会多态(最经常接触的就是:统一方法名,对应不同的参数个数或者参数类型)

  • 相关阅读:
    (总结)CentOS Linux搭建SVN Server配置详解
    面试感悟----一名3年工作经验的程序员应该具备的技能
    SQL server 2008数据库的备份与还原(转)
    MyEclipse XX安装jad反编译插件
    c语言实现对传统单链表的创建、添加 遍历 删除 反转元素操作
    转>>Java工程师成神之路
    Programming reference for JavaScript
    elastic-job 的简单使用
    JAVA使用Ldap操作AD域
    nginx之location(root/alias)
  • 原文地址:https://www.cnblogs.com/fjsnail/p/3472122.html
Copyright © 2020-2023  润新知