MST

星途 面试题库

面试题:Java修饰符对继承与多态的影响

在Java中,不同的修饰符(如public、private、protected、default)如何影响类的继承和多态特性?请结合具体代码示例说明,尤其是当子类重写父类方法时,修饰符的限制与要求。
43.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 修饰符对继承和多态的影响
    • public
      • public修饰的成员(方法或字段)可以被任何类访问,包括子类。在继承和多态中,子类重写public方法时,重写的方法必须也是public。这是因为重写方法不能降低访问权限,否则会破坏多态性,使得通过父类引用调用子类重写方法时,由于访问权限不够而无法调用。
      • 示例代码
class Parent {
    public void publicMethod() {
        System.out.println("Parent's public method");
    }
}

class Child extends Parent {
    @Override
    public void publicMethod() {
        System.out.println("Child's public method");
    }
}
  • private
    • private修饰的成员只能在本类中访问,子类无法继承private成员。所以private成员不会参与到继承和多态中。子类不能重写private方法,因为它根本看不到这些方法。
    • 示例代码
class Parent {
    private void privateMethod() {
        System.out.println("Parent's private method");
    }
}

class Child extends Parent {
    // 这里不能重写privateMethod,因为无法访问
}
  • protected
    • protected修饰的成员可以被同一包内的类以及不同包内的子类访问。在子类重写protected方法时,访问权限可以是protected或者public,同样不能降低访问权限。
    • 示例代码
package com.example;

class Parent {
    protected void protectedMethod() {
        System.out.println("Parent's protected method");
    }
}

package com.example.other;

import com.example.Parent;

class Child extends Parent {
    @Override
    protected void protectedMethod() {
        System.out.println("Child's protected method");
    }
}
  • default(包访问权限,无关键字)
    • 具有包访问权限的成员可以被同一包内的类访问。当子类与父类在同一包内时,子类可以继承和重写具有包访问权限的方法,重写方法的访问权限可以是default或者public。如果子类与父类不在同一包内,子类无法访问父类的default方法,也就无法重写。
    • 示例代码
package com.example;

class Parent {
    void defaultMethod() {
        System.out.println("Parent's default method");
    }
}

class Child extends Parent {
    @Override
    void defaultMethod() {
        System.out.println("Child's default method");
    }
}
  1. 总结
    • 在子类重写父类方法时,重写方法的访问权限不能低于父类方法的访问权限,这样才能保证继承和多态特性的正常实现。private成员不参与继承和多态,publicprotecteddefault(包访问权限)成员在继承和重写时有各自的访问权限规则,遵循这些规则能确保代码在多态场景下的正确性和可维护性。