一.方法覆盖
① 方法覆盖发生在具有继承关系的父子类之间,这是首要条件;
② 覆盖之后的方法与原方法具有相同的返回值类型、相同的方法名、相同的形式参数列表
③覆盖之后的方法不能比原方法拥有更低的访问权限,可以更高(学习了访问控制权限修饰符之后你就明白了);
④ 覆盖之后的方法不能比原方法抛出更多的异常,可以相同或更少(学习了异常之后就明白了);
⑤与了多态机制之后相同的返回值类型"可以修改一下吗?
对于返回值类型是基本数据类型来说,必须一致
对于返回值类型是引用数据类型来说,重写之后返回值类型可以变的更小但不能变大(但意义不大,开发无意义)
publicclassOverrideTest01{ publicstaticvoidmain(String[] args){ Bird2 b=new Bird2(); b.move2(); Cat2 c=new Cat2(); c.move2(); c.move2(1);//构成方法重载 } } classAnimal2{ publicvoidmove2(){ System.out.println("fly"); } } classBird2extendsAnimal2{ publicvoidmove2(){ System.out.println("I want fly"); } } /* private void move2(){ System.out.println("I want fly"); } }*/classCat2extendsAnimal2{ publicvoidmove2(int i){ System.out.println("I want talk"); } }I want fly
I want talk
私有方法不可覆盖,静态方法覆盖没什么意义
publicclassOverrideTest06{ privatevoiddosome(){ System.out.println("private dosome method dosome execute"); } publicstaticvoidmain(String[] args){ OverrideTest06 at=new T(); at.dosome(); } } classmytest{ publicstaticvoidmain(String[] args){ OverrideTest06 ot = new T(); ot.dosome(); } } classTextendsOverrideTest06{ publicvoiddosome(){ System.out.println("T 's public dosome method execute"); } }//经过测试,私有方法不可覆盖
注意事项
注意1:方法覆盖只是针对于方法,和属性无关。
注意2:私有方法无法爱盖
注意3:构造方法不能被继承,所以构造方法也不能被爱盖
注意4:方法覆盖只是针对于实例方法",静态方法覆盖”没有意义。
二.方法重载
方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。调用重载方法时,Java编译器能通过检查调用的方法的参数类型和个数选择一个恰当的方法。(百度百科)
简单来说可以根据不同的需求使用不同的参数创建对象!
方法重载(overload)是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。
publicclassOverloadTest01 { publicstaticvoidmain(String[] args) { System.out.println(sum(10,20)); System.out.println(sum(20.0,30.0)); System.out.println(sum(20L,50L)); } publicstaticintsum(int a,int b) { return a+b; } publicstaticdoublesum(double a,double b){ return a+b; } publicstaticlongsum(Long a,Long b){ return a+b; } }代码满足以下三个条件的时候构成方法重载
① 在同一个类当中。
② 方法名相同。
③ 参数列表不同:个数不同算不同,顺序不同算不同,类型不同也算不同。
publicclassOverloadTest02 { publicstaticvoidmain(String[] args) { m1(); m1(10,20.0); m2(20.0,10); //m5();//m6(); } publicstaticvoidm1(){ } publicstaticvoidm1(int a,double b){ System.out.println("int a,double b"); } publicstaticvoidm2(double a,int b){ System.out.println("double a,int b"); } /* public static int m5(){ return 1; } public static double m5(){ return 1.0; } public static void m6(){ } static void m6(){ }*/ }int a,double b
double a,int b
从m5,m6可知方法重载与返回值类型,修饰符列表无关
引申:我们从System.out.println()中可以体会到println其实也是一种方法重载
三.方法重载和方法覆盖有什么区别?
方法重载发生在同一个类当中
方法覆盖是发生在具有继承关系的父子类之间。
方法重载是一个类中,方法名相同,参数列表不同
方法覆盖是具有继承关系的父子类,并且重写之后的方法必须和之前的方法一致:方法名一致、参数列表一致、返回值类型一致
以上就是动力节点小编介绍的"大家想要了解的-方法的覆盖和重载",希望对大家有帮助,如有疑问,请在线咨询,有专业老师随时为您务。