一、概念
1.1 说说你对Java多态怎么理解
多态是指允许不同类的对象对同一消息作出响应。即同一个接口,使用不同的实例而执行不同操作。多态性可以分为编译时多态(重载)和运行时多态(重写)。它使得程序具有良好的灵活性和扩展性。
1.3 重载和重写
- **重载(Overload)**:在同一个类中,定义相同的方法名,但参数不同(参数类型、个数、顺序可以不同)。重载是编译时的多态性,对返回类型没有要求。
方法重载是指在同一个类中可以定义多个方法,它们的名称相同但参数列表不同(包括参数个数、类型或顺序)。在编译时,Java编译器会根据传入的参数类型或数量来决定调用哪个方法
java
class MathUtils {
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;
}
}
- **重写(Override)**:子类重写父类的方法,方法名和参数列表必须相同,返回类型可以兼容。重写是运行时的多态性,访问修饰符的限制要大于被重写方法的修饰符。
方法重写是指子类可以重写父类的方法,实现不同的行为。当我们通过父类的引用来调用被重写的方法时,实际执行的是子类中的方法。这种特性是"运行时多态"的实现,Java通过动态绑定来实现这一点。
java
class Animal {
void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
void sound() {
System.out.println("Dog barks");
}
}
class Cat extends Animal {
void sound() {
System.out.println("Cat meows");
}
}
// 使用
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.sound(); // 输出: Dog barks
myCat.sound(); // 输出: Cat meows
1.3 重载和重写的范围
- 重载:发生在同一个类中,对方法的参数进行区分。
- 重写:发生在子类与父类之间,子类重写父类的方法。
1.4 重载和重写的多态性
- 重载:是编译时的多态性,根据传入参数的不同调用相应的方法。
- 重写:是运行时的多态性,通过继承机制,子类可以提供父类方法的特定实现。
1.5 重载和重写的参数要求
- 重载:参数的个数、类型、顺序可以不同。
- 重写:参数必须完全相同。
1.6 重载和重写的访问修饰符要求
- 重载:对访问修饰符没有特殊要求。
- 重写:访问修饰符的限制要大于被重写方法的修饰符(public > protected > default > private)。
1.7 重载和重写的异常处理要求
- 重载:可以抛出不同的异常。
- 重写:不能抛出新的检查异常或者比被重写方法声明更加宽泛的检查型异常。