详解:Java 的重写方法与示例,用 22 天总结了一份完美的 SQL 学习笔记
}
}
输出:
disp() method of parent class
disp() method of Child class
在上面的示例中,使用第二个对象(obj2)调用 disp()方法是运行时多态性(或动态方法分派)。
注意:在动态方法分派中,对象可以调用子类的重写方法和基类的所有非重写方法,但不能调用在子类中新声明的方法。在上述示例中,对象obj2
正在调用disp()
。但是,如果尝试newMethod()
使用 obj2?调用该方法(已在 Demo 类中新声明),则会出现编译错误并显示以下消息:
Exception in thread "main" java.lang.Error: Unresolved compilation
problem: The method xyz() is undefined for the type ABC
Java 中的方法重写规则
参数列表:覆盖方法(子类的方法)的参数列表必须与 Overridden 方法(父类的方法)匹配。参数的数据类型及其顺序应完全匹配。
覆盖方法(子类的方法)的[访问修饰符](
)不能比父类的覆盖方法的限制更多。例如,如果父类方法的访问修饰符是公共的,则覆盖方法(子类方法)不能具有私有,受保护的默认访问修饰符,因为这三个访问修饰符都比公共更严格。
例如,这是**不允许的,**因为子类 disp 方法比基类(公共)更具限制性(受保护)
class MyBaseClass{
public void disp()
{
System.out.println("Parent c
lass method");
}
}
class MyChildClass extends MyBaseClass{
protected void disp(){
System.out.println("Child class method");
}
public static void main( String args[]) {
MyChildClass obj = new MyChildClass();
obj.disp();
}
}
输出:
Exception in thread "main" java.lang.Error: Unresolved compilation
problem: Cannot reduce the visibility of the inherited method from MyBaseClass
但是,这是完全有效的方案,因为公众的限制比受保护的限制要少。相同的访问修饰符也是有效的。
class MyBaseClass{
protected void disp()
{
System.out.println("Parent class method");
}
}
class MyChildClass extends MyBaseClass{
public void disp(){
System.out.println("Child class method");
}
public static void main( String args[]) {
MyChildClass obj = new MyChildClass();
obj.disp();
}
}
输出:
Child class method
私有,静态和最终方法不能被覆盖,因为它们在类中是本地的。但是可以在子类中重新声明静态方法,在这种情况下,子类方法的行为会有所不同,并且与父类的相同静态方法无关。
重写方法(子类的方法)可以引发[未经检查的异常](
),而不管被重写的方法(父类的方法)是否引发任何异常。但是,重载方法不应抛出比被重载方法声明的[异常](
)新的或更广泛的[检查异常](
)。我们将在即将到来的教程中通过示例详细讨论这一点。
覆盖的方法的绑定在运行时发生,这称为[动态绑定](
)。
如果一个类正在扩展一个[抽象类](
)或实现一个[接口,](
)则它必须重写所有抽象方法,除非该类本身是一个抽象类。
方法覆盖中的超级关键字
该[super 关键字](
)用于调用父类的方法/构造函数。super.myMethod()
调用基类的 myMethod()方法,同时super()
调用基类的[构造函数](
)。让我们看看在方法重写中使用 super 的方法。
众所周知,我们在子类中重写了一个方法,然后使用子类对象调用该方法将调用重写的方法。通过使用 super,我们可以调用重写的方法,如下例所示:
class ABC{
public void myMethod()
{
System.out.println("Overridden method");
}
}
class Demo extends ABC{
public void myMethod(){
//This will call the myMethod() of parent class
super.myMethod();
System.out.println("Overriding method");
}
public static void main( String args[]) {
Demo obj = new Demo();
obj.myMethod();
}
}
输出:
Class ABC: mymethod()Class Test: mymethod()如你所见,使用超级关键字,我们可以访问重写方法。
评论