zoukankan      html  css  js  c++  java
  • Java_多态

    定义:

    所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在程序运行期间才能确定。因为在程序运行时才确定具体的类。

    这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。


    多态存在的三个必要条件:

    1)要有继承;

    2)要有重写;

    3)父类引用指向子类对象(向上转型);

    对于java而言,多态的实现机制遵循一个原则:当超类对象引用变量 引用 子类对象时,被引用对象的类型 决定了调用谁的成员方法,但这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。

    实现形式:

    1)继承;

    2)接口;

    基于继承实现的多态:

    基于继承的实现机制主要表现在父类和继承该父类的子类对某些方法的重写,多个子类对同一方法的重写可以表现出不同的行为。

    一个栗子:

    public class Wine {
    	private String name;
    	
    	public String getName(){
    		return name;
    	}
    	
    	public void setName(String name){
    		this.name = name;
    	}
    	
    	public Wine(){}
    	
    	public String drink(){
    		return "喝的是 "+getName();
    	}
    	
    	public String toString(){
    		return null;
    	}
    }
    
    public class JNC extends Wine{
    	public JNC(){
    		setName("JNC");
    	}
    	
    	//重写父类方法,实现多态
    	public String drink(){
    		return "喝的是 "+getName();
    	}
    	
    	public String toString(){
    		return "Wine :"+getName();
    	}
    }
    
    public class WLY extends Wine{
    	public WLY(){
    		setName("WLY");
    	}
    	
            
    	public String drink(){
    		return "喝的是 "+getName();
    	}
    	
    	public String toString(){
    		return "Wine :"+getName();
    	}
    }
    
    public class TestWine {
    	public static void main(String[] args) {
    		Wine[] wines = new Wine[2];
    		JNC jnc = new JNC();
    		WLY wly = new WLY();
    		
    		//父类引用子类的对象
    		wines[0] = jnc;
    		wines[1] = wly;
    		
    		for(int i=0;i<2;i++){
    			System.out.println(wines[i].toString()+"==="+wines[i].drink());
    		}
    	}
    }
    

     

    控制台输出:

    Wine :JNC===喝的是 JNC
    Wine :WLY===喝的是 WLY
    

    程序运行结果是调用子类中的方法,这就是多态的表现。不同的对象可以执行相同的行为,但是它们都需要通过自己的实现方式来执行,这就得益于向上转型了。

    如果父类是抽象类,那么子类必须要实现父类中所有的抽象方法,这样该父类所有的子类一定存在统一的对外接口,但其内部的具体实现可以各异。这样我们就可以使用顶层类提供的统一接口来处理该层次的方法。

    基于接口实现的多态:

    继承都是单继承,只能为一组相关的类提供一致的服务接口。但是接口可以是多继承多实现,它能够利用一组相关或者不相关的接口进行组合与扩充,能够对外提供一致的服务接口。所以它相对于继承来说有更好的灵活性。

    一个栗子:(https://blog.csdn.net/thinkGhoster/article/details/2307001

    public class A {
    	public String show(D obj){
    		return ("A and D");
    	}
    	
    	public String show(A obj){
    		return ("A and A");
    	}
    }
    
    public class B extends A{
    	public String show(B obj){
    		return ("B and B");
    	}
    	
    	public String show(A obj){
    		return ("B and A");
    	}
    }
    
    public class C extends B{
    
    }
    
    public class D extends B{
    
    }
    

     控制台输出:

    1==A and A
    2==A and A
    3==A and D
    4==B and A
    5==B and A
    6==A and D
    7==B and B
    8==B and B
    9==A and D
    

     

    具体理解可参考:https://www.cnblogs.com/chenssy/p/3372798.html
    本文参考:https://www.cnblogs.com/chenssy/p/3372798.html

     

     

     

     

  • 相关阅读:
    PHP生成xml 无法识别或是无法读取或是浏览器不识别等问题
    关于PHP 采集类
    Centos7 下安装Docke
    Git使用之设置SSH Key
    yii2.0中Rbac 怎么添加超加管理员
    Undefined index: HTTP_RAW_POST_DATA的解决办法
    window下phpstudy的nginx配置虚拟主机
    yii2.0中添加二维数组,多条数据。
    预防onion比特币勒索病毒,如何快速关闭135,137,138,139,445端口
    github与git之间怎么建立连接
  • 原文地址:https://www.cnblogs.com/Rain1203/p/10737793.html
Copyright © 2011-2022 走看看