在上一篇博客中,我们已经了解继承的基本概念和语法,那么今天我们就来聊一聊有关于继承的其他东西。
对于类的的方法(包括从父类中继承的方法),如果有两个方法的方法名相同,但参数不一致,那么可以说,一个方法是另一个方法的重载方法。
重载方法必须满足以下条件:
其中,参数的类型、个数和顺序被统称为参数签名。来看一下例子:
public class Example{ public void amethod(int i ,String s){} //实例方法 // 加入其它方法 public void amethod(int i,String s){} //不可以,因为这个方法和我们定义的实例方法一模一样,Java虚拟机在执行时不知道该执行哪一个 public void amethod(String s,int i){} //可以,属于重载方法,参数的顺序不一样 public int amethod(int i,String s){return 0;} //不可以,虽然方法的返回类型不相同,但是方法名和参数签名完全一致,所以这不能算是重载方法,不能加到Example中 public private amethod(int i,String mystring){} //不可以,方法名和参数签名相同,所以这也不能算是重载方法 public void Amethod(int i,String s){} //方法名不一样,是一个新的实例方法,所以可以加入到Example类中 abstract void amethod(int i){} //不可以,该方法的参数数目和已有的不一样,所以是一种重载方法。但是Example类不是抽象类,所有不能加入这个抽象方法。倘若将Example类改为抽象类。则可以加入这个方法 }
另外,作为程序入口的main()方法也可以被重载。
如果子类中定义的一个方法,其名称、返回类型及参数签名正好与父类中某个方法的名称、返回类型及参数签名相匹配,那么可以说,子类的方法覆盖了父类的方法。
覆盖方法必须满足多种约束,下面分别介绍:
public class A extends B{ private void method(){} //编译错误,子类方法缩小了父类方法的访问权限 } class B{ public void method(){} }
子类的method()方法是私有的,父类中的method()方法是公有的,子类缩小了父类方法的访问权限,这是无效的方法覆盖,会导致编译错误。
abstract class Base(){ abstract void method1(); abstract void method2(); } public abstract class Sub extends Base(){ public void method1(){...}; //实现method1()方法,并且扩大访问范围 public abstract method2(){}; //重新声明method2()方法,仅仅扩大访问权限,但不实现 }
10.父类的非抽象方法可以被覆盖为抽象方法。
狭义地理解,覆盖仅指子类覆盖父类的具体方法,即非抽象方法,在父类中提供了方法的默认实现方式,而子类采用不同的实现方式。
方法覆盖和方法重载具有以下相同点:
方法覆盖和方法重载具有以下不同点:
原文地址:http://www.cnblogs.com/heshan167/p/7256029.html