覆盖Java中不同包的方法
先决条件: Java中的覆盖, Java中的包
包为类提供了更多的封装层。因此,不同包中的方法的可见性与同一包中的可见性不同。
JVM如何找到调用哪个方法?
当我们运行一个Java程序时,
- JVM 检查对象的运行时类。
- JVM 检查对象的运行时类是否覆盖了声明类的方法。
- 如果是这样,那就是调用的方法。否则,调用声明的类的方法。
因此,关键点是可见性检查不同包中方法的可见性。
以下是我们将在不同包中看到方法覆盖的情况
1.私有方法覆盖:在此,我们要覆盖的方法的访问修饰符是私有的。
// Filename: Hello.java
package a;
public class Hello {
private void printMessage()
{
System.out.println("Hello");
}
public void fun()
{
printMessage();
}
}
// Filename: World.java
package b;
import a.Hello;
public class World extends Hello {
private void printMessage()
{
System.out.println("World");
}
public static void main(String[] args)
{
Hello gfg = new World();
gfg.fun();
}
}
输出:
Hello
由于父类的私有方法在子类中不可见。因此这里不会发生覆盖。
如果您不知道如何从终端运行此程序,请创建 Hello。 Java文件和 World.上面指定的Java文件并运行这些命令。
2.公共方法覆盖:在此,我们要覆盖的方法的访问修饰符是公共的。
// Hello.java
package a;
public class Hello {
public void printMessage()
{
System.out.println("Hello");
}
}
// World.java
package b;
import a.Hello;
public class World extends Hello {
public void printMessage()
{
System.out.println("World");
}
public static void main(String[] args)
{
Hello gfg = new World();
gfg.printMessage();
}
}
输出:
World
公共方法在任何地方都可以访问,因此当调用 printMessage() 时,jvm 可以找到被覆盖的方法并调用它。
因此覆盖发生在这里。
3.默认方法覆盖
// Hello.java
package a;
public class Hello {
void printMessage()
{
System.out.println("Hello");
}
}
// World.java
package b;
import a.Hello;
public class World extends Hello {
void printMessage()
{
System.out.println("World");
}
public static void main(String[] args)
{
Hello gfg = new World();
gfg.printMessage();
}
}
error: printMessage() is not public in Hello; cannot be accessed from outside package
默认方法的可见性仅在其包中。因此它不能在包外访问。
因此,在这种情况下没有覆盖。
预测以下程序的输出
/* Hello.java */
package a;
public class Hello {
public void doIt()
{
printMessage();
}
void printMessage()
{
System.out.println("Hello");
}
}
/* World.java */
package b;
import a.Hello;
public class World {
private static class GFG extends Hello {
void printMessage()
{
System.out.println("World");
}
}
public static void main(String[] args)
{
GFG gfg = new GFG();
gfg.doIt();
}
}
输出:
Hello
解释
printMessage() 的可见性在包 a 中是默认的。因此,这里不会发生覆盖。