Java方法重写和重载的概念
1、重载(Overloading):在同一个类中,方法名相同,但参数列表不同(包括参数个数、类型或顺序不同)的方法,根据传递的参数个数和类型自动选择合适的方法进行调用,重载的优点是代码简洁,易于维护。
2、重写(Overriding):在子类中,方法名、返回类型和参数列表与父类中的方法相同,但实现方式不同的方法,重写的目的是为了实现多态,让子类能够继承父类的属性和方法,并根据需要对这些属性和方法进行扩展或修改。
Java方法重写和重载的区别
1、目的不同:重载的目的是为了实现代码的复用,提高代码的可读性和可维护性;重写的目的是为了实现多态,让子类能够继承父类的属性和方法,并根据需要对这些属性和方法进行扩展或修改。
2、访问权限要求不同:重载不要求子类方法的访问权限必须大于或等于父类方法的访问权限;而重写要求子类方法的访问权限必须大于或等于父类方法的访问权限。
3、返回值类型不同:重载可以有不同的返回值类型,只要它们在数据范围上是兼容的;而重写只能返回父类方法的返回值类型或者更具体的类型。
4、参数列表不同:重载要求方法名、参数列表完全相同;而重写要求方法名相同,但参数列表不同(包括参数个数、类型或顺序不同)。
5、抛出异常不同:重载可以抛出任何检查异常(checked exception);而重写不能抛出受保护的异常(protected exception),只能抛出已检查异常或运行时异常(RuntimeException or Error)。
举例说明
假设我们有一个父类Animal和一个子类Dog,它们都有一个叫makeSound的方法,我们可以通过重载来实现这个方法的不同功能:
class Animal { void makeSound() { System.out.println("动物发出声音"); } } class Dog extends Animal { @Override void makeSound() { System.out.println("汪汪汪"); } }
同样,我们也可以通过重写来实现这个方法的不同功能:
class Animal { void makeSound() { System.out.println("动物发出声音"); } } class Dog extends Animal { @Override public void makeSound() { // 注意这里使用了public关键字,因为子类覆盖了父类的方法,所以需要将访问权限设置为public或protected。 System.out.println("汪汪汪"); } }
相关问题与解答
1、如何使用super关键字调用父类的方法?
答:super
关键字可以用来调用父类中的构造方法、成员变量和成员方法,如果要在子类中调用父类的方法,可以使用super.methodName()
的形式。
class Parent { void show() { System.out.println("我是父类"); } } class Child extends Parent { @Override void show() { super.show(); // 调用父类的show方法 System.out.println("我是子类"); } }
2、如何处理重载和重写之间的歧义?
答:可以通过添加方法的默认参数值、使用泛型或创建接口等方式来解决重载和重写之间的歧义。
// 不推荐的做法,因为会导致编译错误或者运行时异常,应尽量避免这种做法。 void printInfo(String name, int age) { // 在重载的情况下,age参数没有被使用到,这会导致歧义,应该将其改为int age = defaultAge; 或者使用其他方式解决歧义。 }
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/264039.html