1.重写的概念特点
重写发生在子类中,当子类继承自父类时,子类可以提供与父类中签名(signature)相同的方法的实现。这里的签名包括方法名称、参数列表和返回类型。重写的目的是在子类中提供具体化(specialized)的行为,即对父类方法的具体实现。
特点:
1、发生在继承关系中。
2、方法名、参数列表和返回类型必须与父类中的方法完全相同。
3、重写的方法必须在子类中声明为public、protected或默认(没有修饰符)。
4、重写的方法的访问权限不能比父类中的方法更严格。
5、重写的方法的返回类型可以是父类返回类型的子类型。
2.重载的概念特点
重载发生在同一个类中,当一个类中有多个方法的名称相同,但参数列表不同(参数的数量、类型或顺序不同)时,这些方法被认为是重载的。重载的目的是提供相同操作的不同实现,以便于以不同的方式调用同一操作。
特点:
1、发生在同一个类中。
2、方法名相同,但参数列表必须不同。
3、重载的方法可以有不同的访问权限。
4、重载的方法可以有不同的返回类型。
5、重载的方法可以有不同的异常声明。
3.重写与重载的区别
1、关系:重写是继承关系中的概念,而重载是类成员的概念。
2、目的:重写的目的是为了提供子类特定的行为,而重载的目的是为了提供同一操作的不同实现。
3、方法签名:重写要求方法签名完全相同,重载要求方法名相同但参数列表不同。
4、访问权限:重写的方法访问权限不能比父类中的方法更严格,重载的方法可以有不同的访问权限。
5、返回类型:重写的返回类型可以是父类返回类型的子类型,重载的方法可以有不同的返回类型。
总结来说,重写是子类对父类方法的特定化,而重载是同一个类中多个方法名相同但参数不同的情况。
4.重写(Overriding)的应用场景
假设有一个动物基类 Animal,它有一个方法 makeSound(),用于让动物发出声音。现在要创建一个 Dog 子类,它继承自 Animal 类,但希望狗发出特定的汪汪声。
public class Animal {
public void makeSound() {
System.out.println("The animal makes a sound");
}
}
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("汪汪汪~");
}
}
在这个例子中,Dog 类重写了 Animal 类的 makeSound() 方法,以便狗发出特定的叫声。
5.重载(Overloading)的应用场景
假设有一个计算器类 Calculator,它有一个方法 add(),用于加法运算。但由于不同的需求,可能需要添加不同类型的数值,比如整数、浮点数或字符串表示的数值。
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(String a, String b) {
return Integer.parseInt(a) + Integer.parseInt(b);
}
}
在这个例子中,Calculator 类重载了 add() 方法,以支持不同类型的参数。这样,用户可以根据需要选择不同类型的 add() 方法来执行加法运算。
6.同时发生的重写和重载
在下面的例子中,一个类继承自另一个类,并在同一类中重载了方法。
public class Shape {
public void display() {
System.out.println("This is a shape");
}
}
public class Rectangle extends Shape {
@Override
public void display() {
System.out.println("This is a rectangle");
}
public void display(String color) {
System.out.println("This rectangle is " + color);
}
}
在这个例子中,Rectangle 类重写了 Shape 类的 display() 方法,以便矩形显示特定的信息。同时,Rectangle 类还重载了 display() 方法,接受一个 color 参数,以便以不同的颜色显示矩形。
7.小结
总结来说,重写通常用于子类中特定化父类的行为,而重载则用于在同一个类中提供同一操作的不同版本。在实际项目中,这两种方式可以根据需求灵活使用,以实现代码的复用和扩展。