使用访问修饰符覆盖方法
先决条件: Java中的方法覆盖和Java中的访问修饰符
方法覆盖
在任何面向对象的编程语言中,覆盖是允许子类或子类提供其超类或父类已经提供的方法的特定实现的功能。当子类中的方法与其超类中的方法具有相同的名称、相同的参数或签名以及相同的返回类型(或子类型)时,则称子类中的方法覆盖了超类中的方法班级。
方法覆盖是Java实现运行时多态的方式之一。执行的方法的版本将由用于调用它的对象确定。如果使用父类的对象调用方法,则执行父类中的版本,如果使用子类的对象调用方法,则执行子类中的版本。换句话说,被引用对象的类型(而不是引用变量的类型)决定了将执行哪个版本的覆盖方法。
访问修饰符
顾名思义, Java中的访问修饰符有助于限制类、构造函数、变量、方法或数据成员的范围。 Java中有四种类型的访问修饰符可用:
- 默认 - 不需要关键字
- 私人的
- 受保护
- 上市
使用访问修饰符覆盖方法
在使用访问修饰符进行方法覆盖时,它们只是一个规则,即
If you are overriding any method, overridden method (i.e. declared in subclass) must not be more restrictive.
按降序排列的访问修饰符限制:
- 私人的
- 默认
- 受保护
- 上市
即私有比默认更受限制,默认比受保护更受限制,依此类推。
示例 1:
class A {
protected void method()
{
System.out.println("Hello");
}
}
public class B extends A {
// Compile Time Error
void method()
{
System.out.println("Hello");
}
public static void main(String args[])
{
B b = new B();
b.method();
}
}
Compile Time Error
注意:在上面的示例超类中,类 A定义了一个访问修饰符为protected的方法。在 SubClass Class B中进行方法覆盖时,我们没有定义任何访问修饰符,因此将使用默认访问修饰符。按照规则,默认值比受保护的更受限制,因此该程序将给出编译时错误。代替默认值,我们可以使用public ,它的限制比protected少。
示例 2:
class A {
protected void method()
{
System.out.println("Hello");
}
}
public class B extends A {
public void method()
{
System.out.println("Hello");
}
public static void main(String args[])
{
B b = new B();
b.method();
}
}
Hello
注意:在上面的示例超类中,类 A定义了一个访问修饰符为protected的方法。在 SubClass Class B中进行方法覆盖时,我们将访问修饰符定义为Public 。因为公共访问修饰符的限制比受保护的少,所以这个程序编译成功。