java中的继承行为

时间:2015-08-03 06:32:57

标签: java oop inheritance

任何人都可以解释一下,为什么这会在eclipse中显示错误,但运行成功没有任何错误。我已粘贴下面的代码。

家长班:

public class Parent {
    /*Parent class method*/
    public void show() { 
        System.out.println("Parent class show called");
    }
}

儿童班:

public class Child extends Parent {
    /* Child class overridden method*/  
    private void show() { 
        // this line show error in eclipse
        System.out.println("Child class show called ");
    }

    public static void main(String[] args) {
        Parent p = new Child();
        p.show();
    }
}

OutPut是:名为

的父类节目

3 个答案:

答案 0 :(得分:5)

您不能通过继承来降低方法的可见性。

因此,您的子课程的展示率必须为public而不是private

public class Child extends Parent{
/* Child class overridden method*/  
 public void show(){ // this line show error in eclipse
     System.out.println("Child class show called ");

 }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Parent p = new Child();
        p.show();

    }

}

答案 1 :(得分:2)

这种情况正在发生,因为即使存在编译错误,eclipse编译器也可以创建类文件。请点击以下链接。

http://help.eclipse.org/mars/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Fconcepts%2Fconcept-java-builder.htm

但是如果你在java反编译器中打开由此创建的子类,那么你将看到下面的代码。

    public class Child extends Parent
    {
          private void show()
          {
              throw new Error("Unresolved compilation problem: Cannot reduce the visibility of the inherited method from Parent");
          }

          public static void main(String[] args)
          {
                Parent p = new Child();
                p.show();
          }
    }

所以基本上是eclipse正在做的事情是它忽略了这个错误并创建了一个带有该错误的类文件,当存在类文件时,你可以运行你的代码,因为在编译时它能够找出父有方法显示它正在调用该方法。 但是如果你将引用从Parent更改为Child类,那么它将在运行时给你异常。

线程“main”中的异常java.lang.Error:未解决的编译问题:     无法从Parent减少继承方法的可见性     在com.nucleus.finnone.tbs.Child.show(Child.java:5)     在com.nucleus.finnone.tbs.Child.main(Child.java:12)

答案 2 :(得分:1)

您无法降低java中方法的可见性。 Child类中的show()方法必须为public。 那么错误就会消失,你应该输出Child class show called