class  Base{
   int x=10;
int method(){
return x;
}
}
class Sub extends Base{
int x=20;
int method(){
return x;
}}pubulic static void main(String args[]){
  Base b=new Sub();
System.out.println(b.x);
System.out.println(b.method());}
 结果为什么是
10,20

解决方案 »

  1.   

    Base b=new Sub(); Base b这个是定义对象是什么类型的
    这里b是父亲的类型。b.x,就是父亲的属性。
    b.method()是父亲的方法,但是你重写了,就是你的了。
      

  2.   

    属性的值取父类还是子类并不取决于我们创建对象的类型,而是取决于我们定义的变量的类型。Base b 是定义对象是Base型的,b=new Sub()是在内存中创建一个Sub型的对象,并把引用赋给b,但b的类型还是Base
      

  3.   

    属性不会覆盖,实际上现在b中有两个x变量。
    但是因为你声明b的类型是Base,所以这个变量是Base的x的值。
    如果你将Sub的method方法做如下修改:
    int method() {
    return super.x;
    }得到的结果是两个10。
    你没有用super.x,则默认取得this.x。取得的自然是20了。
      

  4.   

    package test;import java.lang.reflect.Field;public class Ref{
    public static void main(String[] args)throws Exception{
    //想在第三方类中使用super就不现实了。如下才能访问本身变量值。
    Base b=new Sub();
    //b的归属字节码是SUB,不是Base
    System.out.println(b.getClass().getName());
    //那sub字节码中的变量一定是20了
    Field fieldX = b.getClass().getDeclaredField("x");
    System.out.println(fieldX.get(b));
    //那如下访问就偏偏是10呢,哦!原来变量的访问规则是由声明域决定,如C++,C#等皆是如此
    System.out.println(b.x); 
    Sub c=new Sub();
    System.out.println(c.x);
    //java中的对象声明,换成编译词法应该是 【访问声明域  区域引用=对象地址】,所谓的接口编程更像权限制御。
    }
    }
      

  5.   

    package test; import java.lang.reflect.Field; public class Ref{ 
    public static void main(String[] args)throws Exception{ 
    //想在第三方类中使用super就不现实了。如下才能访问本身变量值。 
    Base b=new Sub(); 
    //b的归属字节码是SUB,不是Base 
    System.out.println(b.getClass().getName()); 
    //那sub字节码中的变量一定是20了 
    Field fieldX = b.getClass().getDeclaredField("x"); 
    System.out.println(fieldX.get(b)); 
    //那如下访问就偏偏是10呢,哦!原来变量的访问规则是由声明域决定,如C++,C#等皆是如此 
    System.out.println(b.x); 
    Sub c=new Sub(); 
    System.out.println(c.x); 
    //java中的对象声明,换成编译词法应该是 【访问声明域  区域引用=对象地址】,所谓的接口编程更像权限制御。 

      

  6.   


    b在编译期为Base,运行期为Sub,成员变量是在编译期绑定的,方法在运行期绑定的(static final private方法除外);这种调用就是多态,向上转型。此外,成员变量是没有重写的,也就是说成员变量没有多态。只有成员方法才可以重写,才有多态。你那两个类都定义了x,虽然名字是一样的,可是没有重写。就相当于你定义了两个不同变量,一个为x1,另一个为x2.