📜  覆盖Java中不同包的方法

📅  最后修改于: 2022-05-13 01:55:24.818000             🧑  作者: Mango

覆盖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 中是默认的。因此,这里不会发生覆盖。