- 修饰符对继承和多态的影响
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");
}
}
- 总结
- 在子类重写父类方法时,重写方法的访问权限不能低于父类方法的访问权限,这样才能保证继承和多态特性的正常实现。
private
成员不参与继承和多态,public
、protected
和default
(包访问权限)成员在继承和重写时有各自的访问权限规则,遵循这些规则能确保代码在多态场景下的正确性和可维护性。