2014-02-12 53 views
0

请解释一下为什么当我编译这段代码的结果是0?怎么会这样 ?方法继承

class Parentt { 
     int x = 0; 
     public void printX() { 
      System.out.println(x); 
    } 
    } 
    class Child1 extends Parentt { 
     int x = -1; 
    } 

    public class Foo { 
     public static void main(String[] args) { 
      new Child1().printX(); 
     } 
    } 
+1

因为你在阴影'Parentt' –

+1

击败我的变量。通常编译不会返回一个数字。但是如果你执行它,你将会从Parentt打印x的值,因为Child1有它自己的副本(因为你再次声明它),这是从Parentt不可见的。 –

回答

10

你不能覆盖字段,你只能hide他们。

您的Child1.x字段隐藏了Parent.x字段。

字段基于对他们进行访问的引用声明的类型解决,所以

public void printX() { 
    System.out.println(x); 
    // equivalent to System.out.println(this.x); where this's declared type is Parent 
} 

指的是Parent的领域。

0

简短回答:因为您的子类中的变量x没有(也不能)覆盖Parentt中的变量x。方法可以被覆盖,变量不能,它们只能被隐藏(这通常是不好的做法)。

1

Sotirios Delimanolis基本上已经说了所有需要的东西。

但是,如果您要在子类上定义printX方法(或者至少覆盖它),您将得到-1。

class Parentt { 
     int x = 0; 
     public void printX() { 
      System.out.println(x); 
     } 
    } 
    class Child1 extends Parentt { 
     int x = -1; 

     @Override 
     public void printX() { 
      System.out.println(x); 
     } 
    } 

有了这个例子中的代码

Child1 c = new Child1(); 
c.printX(); 

将返回-1