使用 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不允许访问祖父母的方法?
它违反了封装。您不应该能够绕过父类的行为。有时能够绕过您自己的类的行为(尤其是在同一方法中)而不是您父母的行为是有意义的。