public class Test extends Parent{
int a = 20;

public static void main(String[] args) {
Test test = new Test();
test.run();
}
}class Parent {
int a = 10;
public void run() {
System.out.println(a);
}
}
为什么会输入10?

解决方案 »

  1.   

    你访问的a,还是父类的那个
    虽然,你在子类中也定义了一个,但是那个并不能覆盖父类的
    等于说父类有一个a,子类自己也还有一个a注意,继承的时候变量不可以重写,只有方法才可以下面这样写,你可以返回子类的apublic class Test extends Parent{  int a = 20; public static void main(String[] args) { 
    Test test = new Test();
    test.run(); 


    public void run(){
    System.out.println(this.a);//返回子类的a,即20
    }
    } class Parent { 
    int a = 10; 
    public void run() { 
    System.out.println(a); 

    }
      

  2.   

    下面这样写,可以把父类的a给覆盖public class Test extends Parent{  

    Test(){  
    a=100;
     } public static void main(String[] args) { 
    Test test = new Test();
    test.run(); 

    } class Parent { 
    int a = 10; 
    public void run() { 
    System.out.println(a); 


      

  3.   

    如果在真实程序中这样写,确实就是一个很糟糕的设计。此a非彼a,属性不能像方法一样重写。这地方两个a实际上是两个不同的a,只是名字正好相同而已,作用域是不同的。
      

  4.   

    方法才有RTTI的概念,field不会动态确定的,不会有override