zoukankan      html  css  js  c++  java
  • JAVA_SE基础——49.多态的应用

    因为多态对以后开发的重要性,因此我在这里专门开个多态的应用来加深讲解,希望想弄懂多态的同学能耐心看完。

    了解了对象多态性后,那么这多态到底有哪些用处了? 下面要求设计一个方法,要求此方法可以接受A类的任意子类对象,并调用方法,此时,如果不使用对象多态性,那代码肯定会类似code1。


    code1(不使用对象多态性实现功能)

    class A{					// 定义类A
    	public void Run1(){		// 定义Run1()方法
    		System.out.println("A类----Run1方法") ;
    	}
    	public void Run2(){
    		Run1() ;		// 调用父类的Run1()方法
    	}
    }
    class B extends A{
    	public void Run1(){		// 覆写父类中的Run1方法
    		System.out.println("B类----Run1方法") ;
    	}
    	public void Run3(){		// B类特有的方法
    		System.out.println("B类----Run3方法") ;
    	}
    }
    class C extends A{
    	public void Run1(){		// 覆写父类中的Run1方法
    		System.out.println("C类----Run1方法") ;
    	}
    	public void Run5(){		// C类特有的方法
    		System.out.println("C类----Run5方法") ;
    	}
    }
    public class Demo6{
    	public static void main(String asrgs[]){
    		Run(new B()) ;	// 传递B类的实例    B b = new B();  
    		Run(new C()) ;	// 传递C类的实例	  C c = new C();
    	}
    	public static void Run(B b){
    		b.Run1() ;		// 调用覆写父类中的Run1()方法
    	}
    	public static void Run(C c){
    		c.Run1() ;		// 调用覆写父类中的Run1()方法
    	}
    }
    运行结果:




    以上code1代码虽然实现了基本的要求,但是你们应该可以发现:如果按照code1的方式完成程序,这就相当于产生了一个A类的子类时,Run()方法就要重载一次,则每一次扩充子类都要修改类本身,这样肯定不太好,那么如果使用对象多态性完成呢?具体代码如code2。


    code2(使用对象多态性实现功能

    class A{					// 定义类A
    	public void Run1(){		// 定义Run1()方法
    		System.out.println("A类----Run1方法") ;
    	}
    	public void Run2(){
    		Run1() ;		// 调用父类的Run1()方法
    	}
    }
    class B extends A{
    	public void Run1(){		// 覆写父类中的Run1方法
    		System.out.println("B类----Run1方法") ;
    	}
    	public void Run3(){		// B类特有的方法
    		System.out.println("B类----Run3方法") ;
    	}
    }
    class C extends A{
    	public void Run1(){		// 覆写父类中的Run1方法
    		System.out.println("C类----Run1方法") ;
    	}
    	public void Run5(){		// C类特有的方法
    		System.out.println("C类----Run5方法") ;
    	}
    }
    public class Demo6{
    	public static void main(String asrgs[]){
    		Run(new B()) ;	// 传递B类的实例,产生向上转移
    		Run(new C()) ;	// 传递C类的实例,产生向上转移	 
    	}
    	//接收父类对象
    	public static void Run(A a){//相当于 A a = new B() & A a = new C()
    		a.Run1() ;		// 调用覆写父类中的Run1()方法
    	}
    	
    }
    运行结果:



    上面code2代码中在Run()方法中使用了对象的多态性,所以可以接收任何子类的对象,这样无论子类如何增加,Run()方法都不用做任何的改变,因为发生了对象的向上转型关系后,调用的方法一定是被子类覆写过的方法。



  • 相关阅读:
    内置系统账户:Local system/Network service/Local Service 区别
    python-基于文件导入的特性的单例模式
    php原因 nginx报错[error] 10773#0: *272212065 recv() failed (104: Connection reset by peer) while reading response header from upstream
    实用Django ORM实用操作方法
    session是什么和cookie的区别?
    Python可迭代对象,迭代器,生成器
    浅析python中的GIL锁和协程
    git 常用
    testlink安装
    redmine搭建
  • 原文地址:https://www.cnblogs.com/Jhaiha0/p/8465293.html
Copyright © 2011-2022 走看看