Java中的重写与重载

Java中的 重写与重载

重载:
在java中,同一个类中两个或者两个以上的方法可以共享一个名称,只要它们的参数声明不同即可,这种情况称为方法的重载。
方法的重载分为 构造方法和普通方法的重载,方法的重载是java多态性的体现之一。
例如,在JDK的java.io.PrintStream中定义了十多个同名的pringln()方法。

   public void println(int i){  …..}
   public void println(double i){  …..}
   public void println(String  i){  …..}

这些方法完成的功能类似,都是格式化的输出,根据参数的不同来区分他们,以进行不同的格式化处理和输出,它们之间就构成了方法的重载,实际调用时,根据实参的类型来决定调用哪个方法。
例如:
System.out.println(102); //调用方法 public void println(int i)
System.out.println(102.25); //调用方法 public void println(double i)
System.out.println(“102.25”); //调用方法 public void println(String i)
方法重载时,必须注意一下几点:

  • 在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数类型可以是不同的参数类型,不同的参数个数,不同的参数顺序(参数类型必须不一样);

  • 各个重载方法的参数列表必须不同

  • 各个重载方法的返回值类型可以相同也可以不同,但是仅仅返回值类型不同的不是重载 例如:

    public void change(int i){} 与 public int change(int i){} 不能成为方法的重载

  • 不能通过仅仅通过访问权限、返回类型、抛出的异常的不同而进行进行重载


重写:
当一个类继承另一个类时,则可以拥有父类的成员方法和成员变量,在子类中,可以创建独有的成员,如果创建了一个与父类中相同名称,相同返回类型、相同参数列表的方法,只是方法体中的实现方法不同,以实现不同于父类的功能,这种方式就称为方法的重写,又称为方法的覆盖。
在重写方法时候,应该遵循以下规则:

  • 参数列表必须完全和被重写方法的参数列表一致

  • 返回类型必须完全和被重写方法的返回类型一致

  • 访问修饰符的限制一定要大于被重写方法的访问修饰符

     (public>protected>default>private)
    
  • 重写的方法一定不能抛出新的检查异常或者比被重写方法声明更加宽泛的检查型异常。
    例如:父类的方法中声明了一个检查异常 IOException,在重写这个方法时候,就不能抛出Exception,只能抛出IOException的字类异常,可以抛出非检查类的异常。

Java重写重载都是实现多态的方式,但二者存在明显区别。重写发生在子类父类之间,是对父类方法的重新定义;重载则发生在一个类中,是同名方法因参数列表不同而形成的不同实现。 重写是在继承关系下,父类的方法功能可能不足,子类需要对其进行扩展或修改。父类和子类的方法方法名、参数和返回类型相同,只是具体实现内容不同。同时,子类重写方法权限必须大于等于父类权限,不能比父类被重写方法声明更多的异常(里氏代换原则)。例如,在父类`Father`中有`walk`方法,子类`Son`继承`Father`类并重写了`walk`方法,通过`@Override`注解表明这是一个重写方法,当调用`Son`对象的`walk`方法时,会执行子类重写后的逻辑 [^1][^2][^4]。 ```java public class Father { public void walk(){ System.out.println("我是父亲"); } } public class Son extends Father { @Override public void walk() { System.out.println("我是儿子"); } } ``` 重载是在同一个类中定义同名方法,这些方法的参数列表不同(参数类型不同、参数个数不同或者二者都不同),对返回类型没有特殊要求,不能仅根据返回类型区分方法。例如,在`Calculator`类中定义了多个`add`方法,它们的参数类型或个数不同,调用时会根据传入的参数来决定执行哪个方法 [^2][^3]。 ```java public class Calculator { public int add(int a, int b) { return a + b; } public double add(double a, double b) { return a + b; } public int add(int a, int b, int c) { return a + b + c; } } ``` 从多态性角度来看,重载实现的是编译时的多态性,在编译阶段就可以根据参数类型和个数确定调用哪个方法重写实现的是运行时的多态性,在运行时根据对象的实际类型来决定调用哪个类的重写方法 [^2]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值