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的值。
总结:
多态(动态绑定): 由重写(父类与子类之间)和重载(同一类之间)表现