Java中祖父母的访问方法

问题描述

我正在使用Java处理实践问题,简单的OOP概念 这个问题给出了一个uml图并要求实现。 我遇到了一个问题,要求我从子类访问祖父母类中的方法。

请参见插图:

    
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() { 
        super.super.Print(); // Trying to access Grandparent's Print() 
        System.out.println("Child's Print()"); 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
        Child c = new Child(); 
        c.Print(); 
    } 
} 
 

我到处都进行了研究,我发现Java由于应用了Encpculation而不允许这样做,但是C ++允许这样做,我的问题是我可以做些什么来从祖父母类中获取不允许的方法(超级方法)。 Java中的super.method())语句。

我的意思是我可以保持继承的方式改变结构,并且可以在缺少UML的情况下访问该方法。

解决方法

  1. 无法在Java中调用super.super.foo()。

  2. 您可以通过以下方式隐式执行此操作:

    public class Grandparent {
        public void Print() { 
            System.out.println("Grandparent's Print()"); 
        } 
    }
    class Parent extends Grandparent { 
        public void Print() { 
            super.Print(); // Here we can add a call to Print() from Grandparent.
            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(); 
        } 
    } 
    
  • 注意:尝试对方法使用命名约定。使用lowerCamelCase进行Print()-> print()
,

您可以创建GrandParent类的引用变量和Child类的对象。所以代码变成这样:

    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() { 
        //super.super.Print(); // Trying to access Grandparent's Print() 
        System.out.println("Child's Print()"); 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
        GrandParent p = new Child(); 
        p.Print(); 
    } 
}

在这里发生的是,使用的引用变量是父类之一,因此即使为子类创建了对象,引用变量也只知道类“ GrandParent”中存在的方法,并且相同方法的输出将显示在屏幕中。

这对于所有父类都是允许的,也就是说,所有父类引用变量都可以使用子类的对象进行引用,但反之亦然。

,

我认为您应该这样编写Parent的print()方法:

public void Print() {   
  super.print()
    System.out.println("Parent's Print()"); 
}

,还有孩子的print()方法。
通过这样做将起作用。

,

您可以使用反射来获得预期的结果,但是为此,您需要确切地知道超类的级别是多少。

Child c = new Child();
Constructor<?> constructor = c.getClass().getSuperclass()
               .getSuperclass().getDeclaredConstructor();
constructor.setAccessible(true);
((Grandparent)constructor.newInstance()).Print();

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...