以下两个程序有什么区别?

时间:2011-02-28 10:23:49

标签: java

代码:1

class Ajay {
    private void display() {
        System.out.println("Ajay");
    }
    public static void main(String ...strings ){
        Ajay r=new Ravi();
        r.display();
    }
}

class Ravi extends Ajay{
    public void display() {
        System.out.println("ravi");
    }
}

CODE:2

class Ravi {
    private void display() {
        System.out.println("ravi");
        }
    }

public class Ajay extends Ravi{
    public void display() {
        System.out.println("ajay");
    }
    public static void main(String ...strings ){
    Ravi r=new Ajay();
        r.display();
    }
}

我对上述两个代码有疑问。 CODE 1执行没有任何错误,而CODE 2抛出错误,如方法不可见。 这个错误的原因是什么?

4 个答案:

答案 0 :(得分:4)

在第二个示例中,您尝试在display()类型的变量上调用方法RaviRavi没有可从此位置访问的方法display()(即Ajay内)。

在第一个示例中,您可以在 display()内的中调用Ajay的私有Ajay方法。请注意,调用private方法使用运行时多态性!要调用的确切代码是在编译时决定的!

答案 1 :(得分:1)

在代码2中,您在类Ravi中的显示方法是私有的。

现在你使用Ravi的引用“r”来调用display,但方法display()在类Ravi之外是不可见的。

即使你在Ajay类中使用与public相同的方法display(),但它没有覆盖超类,因为你无法降低可见性。

答案 2 :(得分:0)

错误消息与CODE2示例中的display方法为private的事实相关联,因此您无法调用它。

答案 3 :(得分:0)

为第二个代码提供解决方案选项:

如果要显示“ravi”,则可以将显示方法声明为:

class Ravi {
    protected void display() {
        System.out.println("ravi");
        }
    }
}

或者喜欢:

class Ravi {
    public void display() {
        System.out.println("ravi");
        }
    }
}

如果要显示“ajay”,请更改调用:

Ravi r=new Ajay();
    if(r instanceof Ajay)
        ((Ajay) r).display();
}