如果超类和子类具有包含参数的同名方法。JVM根据用于调用方法的对象来调用相应的方法。即,如果用于调用该方法的对象是超类类型,则将执行超类的方法。
或者,如果对象属于子类类型,则执行超类的方法。
class Super{ public void sample(){ System.out.println("Method of the Super class"); } } public class MethodOverriding extends Super { public void sample(){ System.out.println("Method of the Sub class"); } public static void main(String args[]){ MethodOverriding obj = new MethodOverriding(); obj.sample(); } }
输出结果
Method of the Sub class
覆盖时,您需要牢记以下几点-
这两个方法必须具有相同的名称,相同的参数和相同的返回类型,否则它们将被视为不同的方法。
子类中的方法不得具有比超类中的方法更高的访问限制。如果您尝试这样做,则会引发编译时异常。
class Super{ void sample(){ System.out.println("Method of the Super class"); } } public class MethodOverriding extends Super { private void sample(){ System.out.println("Method of the Sub class"); } public static void main(String args[]){ MethodOverriding obj = new MethodOverriding(); obj.sample(); } }
MethodOverriding.java:7: error: sample() in MethodOverriding cannot override sample() in Super private void sample(){ ^ attempting to assign weaker access privileges; was package 1 error
如果超类方法引发某些异常,则子类中的方法应引发相同的异常或其子类型(可以离开而不会引发任何异常)。它不应引发更广泛的例外。如果这样做,则会生成编译时错误。
import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Scanner; abstract class Super{ public String readFile(String path)throws FileNotFoundException{ throw new FileNotFoundException(); } } public class ExceptionsExample extends Super{ @Override public String readFile(String path)throws IOException { //方法主体......- } }
在编译时,上述程序为您提供以下输出-
ExceptionsExample.java:13: error: readFile(String) in ExceptionsExample cannot override readFile(String) in Sup public String readFile(String path)throws IOException { ^ overridden method does not throw IOException