面试题答案
一键面试方法重写需要遵循的规则
- 方法签名必须相同:
- 方法名、参数列表(参数的类型、顺序和数量)必须与父类中被重写的方法完全一致。例如:
这里class Animal { public void makeSound() { System.out.println("Animal makes a sound"); } } class Dog extends Animal { @Override public void makeSound() { System.out.println("Dog barks"); } }
Dog
类中的makeSound
方法与Animal
类中的makeSound
方法方法名和参数列表都相同。 - 返回类型:
- 重写方法的返回类型必须与被重写方法的返回类型相同,或者是被重写方法返回类型的子类(协变返回类型)。例如:
class Shape { public Shape getShape() { return this; } } class Circle extends Shape { @Override public Circle getShape() { return this; } }
Circle
类中getShape
方法返回类型Circle
是Shape
类中getShape
方法返回类型Shape
的子类。 - 访问修饰符:
- 重写方法的访问修饰符不能比被重写方法的访问修饰符更严格。例如,如果父类方法是
protected
,子类重写方法可以是protected
或public
,但不能是private
。如:
class Parent { protected void printInfo() { System.out.println("Parent info"); } } class Child extends Parent { @Override public void printInfo() { System.out.println("Child info"); } }
- 重写方法的访问修饰符不能比被重写方法的访问修饰符更严格。例如,如果父类方法是
- 不能重写被
final
修饰的方法:- 若父类中的方法被
final
修饰,子类不能对其进行重写。例如:
class FinalMethodClass { public final void finalMethod() { System.out.println("This is a final method"); } } class SubClass extends FinalMethodClass { // 下面这行会报错,不能重写final方法 // @Override // public void finalMethod() { // System.out.println("Trying to override final method"); // } }
- 若父类中的方法被
- 不能重写被
static
修饰的方法:- 静态方法属于类,不属于对象,不存在多态性。如果子类定义了与父类静态方法相同签名的静态方法,这不是重写,而是方法隐藏。例如:
class StaticClass { public static void staticMethod() { System.out.println("Static method in parent"); } } class SubStaticClass extends StaticClass { public static void staticMethod() { System.out.println("Static method in child (method hiding)"); } }
- 抛出异常:
- 重写方法不能抛出比被重写方法更多的异常,或者不能抛出比被重写方法更宽泛的异常类型。例如,如果父类方法抛出
IOException
,子类重写方法可以抛出IOException
或其子类异常,如FileNotFoundException
,但不能抛出SQLException
。
- 重写方法不能抛出比被重写方法更多的异常,或者不能抛出比被重写方法更宽泛的异常类型。例如,如果父类方法抛出
Java实现多态的必要条件
- 继承:
- 多态基于继承关系,子类继承父类,从而获得父类的属性和方法。通过继承,子类可以重写父类的方法来实现不同的行为。例如上述
Dog
类继承Animal
类,Dog
类可以重写Animal
类的makeSound
方法来表现出不同的叫声。
- 多态基于继承关系,子类继承父类,从而获得父类的属性和方法。通过继承,子类可以重写父类的方法来实现不同的行为。例如上述
- 重写:
- 子类对父类的方法进行重写,以提供与父类不同的行为实现。如
Dog
类重写Animal
类的makeSound
方法,使得Dog
类对象在调用makeSound
方法时有自己特定的行为。
- 子类对父类的方法进行重写,以提供与父类不同的行为实现。如
- 向上转型:
- 用父类类型的变量引用子类对象,即向上转型。例如:
这里将Animal animal = new Dog(); animal.makeSound();// 调用的是Dog类重写后的makeSound方法
Dog
类对象赋值给Animal
类变量animal
,这就是向上转型。在运行时,实际调用的是子类重写后的方法,从而实现多态。