MST

星途 面试题库

面试题:Java多态中方法重写的规则及多态实现的必要条件

在Java多态的实现机制里,阐述方法重写需要遵循哪些规则?同时说明Java实现多态有哪几个必要条件。
49.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

方法重写需要遵循的规则

  1. 方法签名必须相同
    • 方法名、参数列表(参数的类型、顺序和数量)必须与父类中被重写的方法完全一致。例如:
    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方法方法名和参数列表都相同。
  2. 返回类型
    • 重写方法的返回类型必须与被重写方法的返回类型相同,或者是被重写方法返回类型的子类(协变返回类型)。例如:
    class Shape {
        public Shape getShape() {
            return this;
        }
    }
    class Circle extends Shape {
        @Override
        public Circle getShape() {
            return this;
        }
    }
    
    Circle类中getShape方法返回类型CircleShape类中getShape方法返回类型Shape的子类。
  3. 访问修饰符
    • 重写方法的访问修饰符不能比被重写方法的访问修饰符更严格。例如,如果父类方法是protected,子类重写方法可以是protectedpublic,但不能是private。如:
    class Parent {
        protected void printInfo() {
            System.out.println("Parent info");
        }
    }
    class Child extends Parent {
        @Override
        public void printInfo() {
            System.out.println("Child info");
        }
    }
    
  4. 不能重写被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");
        // }
    }
    
  5. 不能重写被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)");
        }
    }
    
  6. 抛出异常
    • 重写方法不能抛出比被重写方法更多的异常,或者不能抛出比被重写方法更宽泛的异常类型。例如,如果父类方法抛出IOException,子类重写方法可以抛出IOException或其子类异常,如FileNotFoundException,但不能抛出SQLException

Java实现多态的必要条件

  1. 继承
    • 多态基于继承关系,子类继承父类,从而获得父类的属性和方法。通过继承,子类可以重写父类的方法来实现不同的行为。例如上述Dog类继承Animal类,Dog类可以重写Animal类的makeSound方法来表现出不同的叫声。
  2. 重写
    • 子类对父类的方法进行重写,以提供与父类不同的行为实现。如Dog类重写Animal类的makeSound方法,使得Dog类对象在调用makeSound方法时有自己特定的行为。
  3. 向上转型
    • 用父类类型的变量引用子类对象,即向上转型。例如:
    Animal animal = new Dog();
    animal.makeSound();// 调用的是Dog类重写后的makeSound方法
    
    这里将Dog类对象赋值给Animal类变量animal,这就是向上转型。在运行时,实际调用的是子类重写后的方法,从而实现多态。