方法覆写和方法重载定义与区别 (面试题)

xiaoxiao2022-07-06  40

覆写和重载

方法的覆盖(Overriding)和重载(Overloading)是Java多态性的不同表现。覆盖(也可以叫重写,覆写)是父类与子类之间多态性的一种表现,而重载是一个类中多态性的一种表现。

(一)覆写:

1.方法的覆写(****重点,Java核心)

定义:子类定义了与父类方法名称,参数列表,返回值完全相同的方法。被覆写的方法不能拥有比父类更为严格的访问控制权限。

//Override.java class A{ public int getVal(){ return 5; } } class B extends A{ public int getVal(){ return 10; } } public class Override{ public static void main(String[] main){ B b = new B(); System.out.println(b.getVal()); } } 程序运行结果:10

对于B类的对象b,其getVal方法已经对A类的getVal方法进行了覆盖,所以当B调用getVal方法时,程序执行其子类方法体内中的内容,返回结果为10.

class A{ //包访问权限 public void fun(){ System.out.println("我是爸爸"); } } class B extends A{ public void fun(){ System.out.println("我是儿子"); } } public class Override{ public static void main(String[] args){ B b = new B(); A a = (A)b; //把b强转成A的类型:上面两句等价于A a = new B(); per.fun(); } } 程序运行结果:我是儿子

上例中对象a时B类创建的一个对象,虽然被强制转换成A类,但其仍然时B类的实例对象,B类重写了A类的getVal的实例方法,因此b调用了其自身的方法。这种操作也叫做向上转型。

注意:

1.判断调用的到底是父类方法还是子类方法

a.看new在哪(当前使用的对象是通过那个类new的) b.调用的方法有没有被子类覆写,如果被覆写,调用的一定是被覆写后的方法。

2.访问控制权限:

private < default(啥也不写)—包访问权限(在同一个源文件中的访问权限)< public

方法覆写不能出现private关键字

3.覆盖方法的调用原则:

父类日被覆盖的方法的声明必须要和子类的同名方法的声明完全匹配,才能达到覆盖的效果。覆盖方法的返回值必须和被覆盖方法的返回值一致。被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖,因为修饰符为private的方法,子类不能从父类继承,所以就不存在覆盖。在Java程序运行时,系统根据调用该方法中的对象,来决定实际调用的是子类的方法还是父类的方法,对于一个子类的对象,如果该子类覆盖了父类方法,则运行时系统调用的时子类的方法,否则调用的是父类的方法。覆盖后的方法不能比被覆盖的方法有更加严格的访问权限(可以相同)。覆盖后的方法不能比覆盖前的方法产生更多的例外,即抛出更多异常。

下段代码体现了以上5,6两点:

class{ void f() throws IOException{ //f()为default类型,抛出Exception。 //方法体 } } class B extends A{ private void f() throws Exception{ //错误1:private权限小于default //错误2:Exception异常比IOException异常范围大,因为Exception包含IOException. } }

2.属性的覆写(了解)

属性的覆写:子类和父类定义了属性名称完全一样的属性的时候,叫做属性覆写。

(二)重载

如果在一个类中定义了多个同名的方法,它们有不同的参数个数,不同的参数类型或不同的参数次序,则成为方法的重载。类的同一种功能有多种实现方式,具体采用哪种,取决于调用者给定的参数。例如杂技师训练动物,对于不同的动物有不同的训练方式。

public void train(Dog dog){ //训练小狗站立,排队... } public void train(Monkey monkey){ //训练小猴敬礼,翻跟斗... }

当该类的对象调用train方法时,如果方法参数时Dog就会调用训练小狗的相关操作,如果方法参数时Monkey对象,就会调用训练小猴的相关操作。 对于类的方法(包括从父类继承的方法)。如果有两个方法的方法名相同,但参数不一样,这时候可以说一个方法是另一个方法的重载方法。 方法重载是指多个方法享有相同的名字,但是这些方法的参数必须不同,或者是参数个数或者参数类型不同。返回类型不能用来区分重载的方法。

方法重载规则:

Java方法重载要求同名的方法必须有不同的参数表,仅有返回类型不同是不足以区分两个重载方法的。参数类型的区分度一定要足够,即参数类型,个数,顺序至少有一项不同。方法的修饰符可以不同。一个类的多个构造方法之间还可以互相调用,这个要通过关键字this来实现。

面试题:解释方法重载与方法重写的区别

a.概念上: 重载:方法名称相同,参数列表不同,与返回值无关。 重写:方法名称,返回值,参数列表完全一样,只是权限不一样,子类不能拥有比父类更为严格的权限。 b.范围: 重载发生在同一个类中,是内部多个方法之间的关系。重写:子类与父类之间,才有方法覆写。 c.权限要求: 重载没有权限要求。覆写:在有继承关系的类之中,被覆写的方法不能拥有比父类更严格的访问控制权限 (用final修饰的方法是不能被子类覆盖的,只能被重载)。
转载请注明原文地址: https://www.6miu.com/read-4968540.html

最新回复(0)