重写 重载 多态


override :方法签名(函数名 + 参数列表)一样,返回值可协变;            

public class OverridTest {
	public static String s = "strings";
	/*
	 * 可以通过多态(重写)的特性,放入不同的子类对象,执行子类对应的功能,这就是策略模式
	 */
	public static void process(Processor p, Object s){
		System.out.println(p.name());
		System.out.println(p.process(s));
	}
 
	public static void main(String[] args){
		process(new Upercase(), s);
		process(new Lowercase(), s);
	}

}

class Processor{
	  public String name(){
		   return getClass().getSimpleName();
	   }
	   
	  
	  /*
	   * 要重写的process方法,基类process方法输入类型Object,输出类型Obect
	   */
	   Object process(Object input){	
		   return input;
	   }
	
}

class Lowercase extends Processor{
	  /*
	   * 重写后的process方法,返回Object的协变类型String(Object的子类型)
	   * 注意重写的方法输入类型不变,如果输入变化了就是一个新的方法(重载)了.
	   */
	   String process(Object input){
		   return ((String)input).toLowerCase();
	   }
}

class Upercase extends Processor{
	  /*
	   * 重写后的process方法,返回Object的协变类型String(Object的子类型)
	   * 注意重写的方法输入类型不变,如果输入变化了就是一个新的方法(重载)了.
	   */
	   String process(Object input){
		   return ((String)input).toUpperCase();
	   }
}

输出: Upercase  STRINGS  Lowercase strings

 



Overload : 相同的函数名和返回值,不同的参数(也可以仅是参数顺序不同,不推荐)

public class OverloadTest {
	
	void f(){
		
	}
	
	int f(int a,int b){
		return 0;
	}
	
	void f(int a,int b){
		
	}
}
 这段程序在编译器会报错,当函数f()重载为返回值为int的有参函数f(int a, int b)后,在重载为返回值为空的函数f(int a, int b)时,在编译器看来,这是两个同样的函数的重复定义,编译器区分函数的依据时函数签名(而非返回值),这是因为有时我们用函数的原因是因为函数的副作用而不使用它的返回值。 例如a++。我们用没有赋值给其他变量,而是只是调用函数来改变a的值。


总结:     

多态(动态绑定): 由重写(父类与子类之间)和重载(同一类之间)表现

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值