📜  使用 super 在Java中访问祖父母的成员

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

使用 super 在Java中访问祖父母的成员

在Java中直接访问祖父母的成员:

预测以下Java程序的输出。

Java
// filename Main.java
class Grandparent {
    public void Print()
    {
        System.out.println("Grandparent's Print()");
    }
}
 
class Parent extends Grandparent {
    public void Print()
    {
        System.out.println("Parent's Print()");
    }
}
 
class Child extends Parent {
    public void Print()
    {
        // Trying to access Grandparent's Print()
        super.super.Print();
        System.out.println("Child's Print()");
    }
}
 
public class Main {
    public static void main(String[] args)
    {
        Child c = new Child();
        c.Print();
    }
}


Java
// filename Main.java
class Grandparent {
    public void Print()
    {
        System.out.println("Grandparent's Print()");
    }
}
 
class Parent extends Grandparent {
    public void Print()
    {
        super.Print();
        System.out.println("Parent's Print()");
    }
}
 
class Child extends Parent {
    public void Print()
    {
        super.Print();
        System.out.println("Child's Print()");
    }
}
 
public class Main {
    public static void main(String[] args)
    {
        Child c = new Child();
        c.Print();
    }
}


输出:

prog.java:20: error:  expected
        super.super.Print();
              ^
prog.java:20: error: not a statement
        super.super.Print(); 

“super.super.print();”行有错误。在Java中,一个类不能直接访问祖父母的成员。虽然它在 C++ 中是允许的。在 C++ 中,我们可以使用范围解析运算符(::) 来访问继承层次结构中任何祖先的成员。在Java中,我们只能通过父类访问祖父母的成员。  

例如,以下程序编译并运行良好。

Java

// filename Main.java
class Grandparent {
    public void Print()
    {
        System.out.println("Grandparent's Print()");
    }
}
 
class Parent extends Grandparent {
    public void Print()
    {
        super.Print();
        System.out.println("Parent's Print()");
    }
}
 
class Child extends Parent {
    public void Print()
    {
        super.Print();
        System.out.println("Child's Print()");
    }
}
 
public class Main {
    public static void main(String[] args)
    {
        Child c = new Child();
        c.Print();
    }
}
输出
Grandparent's Print()
Parent's Print()
Child's Print()

为什么Java不允许访问祖父母的方法?

它违反了封装。您不应该能够绕过父类的行为。有时能够绕过您自己的类的行为(尤其是在同一方法中)而不是您父母的行为是有意义的。