在 Java 中覆盖不同包的方法
原文:https://www . geesforgeks . org/overriding-methods-different-packages-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
解释 打印消息()的可见性在包 a 中是默认的。因此,这里不会发生覆盖。
本文由 Shubham Juneja 供稿。如果你喜欢 GeeksforGeeks 并且愿意投稿,你也可以使用contribute.geeksforgeeks.org写一篇文章或者把你的文章邮寄到 contribute@geeksforgeeks.org。看到你的文章出现在极客博客主页上,帮助其他极客。
如果你发现任何不正确的地方,或者你想分享更多关于上面讨论的话题的信息,请写评论。
版权属于:月萌API www.moonapi.com,转载请注明出处