class Super {
int nonStat = 2;
int nonStatMethod() {
return 4;
}
}public class Sub extends Super {
int nonStat = 20; public static void main(String[] args) {
Super s = new Sub();
System.out.println("Non-Static is " + s.nonStat); }
}为什么输出的是2而不是20

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【dreamhunter_lan】截止到2008-07-23 16:36:11的历史汇总数据(不包括此帖):
    发帖的总数量:0                        发帖的总分数:0                        每贴平均分数:0                        
    回帖的总数量:8                        得分贴总数量:1                        回帖的得分率:12%                      
    结贴的总数量:0                        结贴的总分数:0                        
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:---------------------结分的百分比:---------------------
    无满意结贴率:---------------------无满意结分率:---------------------
    如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html
      

  2.   

    http://blog.csdn.net/lovingprince/archive/2008/07/11/2639866.aspx属性 不能在子类重定义 ,只有方法才可以重定义,属性只能继承。就是这个原因,所以即使你子类写了一个完全相同的属性,如果你调用子类的属性,取得的仍然是父类的值。
      

  3.   

    输出的是2.  如果把Super s=new Sub()改成Sub s=new Sub();输出的是20.
    属性的值取父类还是子类并不取决于我们创建对象的类型,而是取决于我们定义的变量的类型。
      

  4.   

    内存中,子对象会包含父类的一切数据,然后有自己的数据.所以关键是你符合访问,比如你用super可以直接访问父类中定义的数据.直接用变量名称访问的话,子类中定义了就访问子类的,没定义就访问父类的,private的不能访问.
      

  5.   

    Super s = new Sub(); 
    楼主请看清上面这段代码,虽然对象s是以Sub类来创建的,但它还是属于Super类的实例,所以它拥有的属性和方法都是Super类的,而不是Sub类的,这样,输出结果当然是2了。用书上的话来说,这就是上转型对象。
    就比如说,老虎是哺乳类动物。Super相当于哺乳类,Sub相当于老虎
    而s只是属于哺乳类,并不是老虎,所以s只是拥有哺乳类的行为,而没有老虎的行为
    understand?
      

  6.   

    class Super { 
    int nonStat = 2; 
    int nonStatMethod() { 
    return 4; 

    } public class Sub extends Super { 
    int nonStat = 20; public static void main(String[] args) { 
    Super s = new Sub(); 
    System.out.println("Non-Static is " + s.nonStat); } 
    } 为什么输出的是2而不是20答:什么是多态。属性(变量)是没有多态的。方法的覆盖构成多态。
    这里要清楚动态绑定和静态绑定,属性(变量)是根据的对象的类型进行静态绑定的,s的对象类型是Super.Super.nonStat自然是2了,
    要想让他输入20,那么就要通过强制类型转换((Sub)s).nonStat的值就会输出成20了。
    简单是说就是属性是静态绑定,方法是动态绑定。方法才有多态
      

  7.   

    *********************************** = sub
    *         nonStat = 2             *
    *      *****************          *
    *      * nonStat = 2   * = super  *
    *      *               *          *
    *      *               *          *
    *      *****************          *
    *                                 *
    *                                 *
    *                                 *
    ***********************************
    内存
      

  8.   

    晕,怎么变成这样了,睡告诉我图怎么弄上去
    package test;class Super {
    int nonStat = 2; int nonStatMethod() {
    return 4;
    }
    }public class Sub extends Super {
    int nonStat = 20;

    //新增一个成员变量
    int test = 100; public static void main(String[] args) {
    Super s = new Sub();
    System.out.println("Non-Static is " + s.nonStat);

    //有问题!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    System.out.println(s.test);
    }
    }
    编译是无法通过的,对于s而言,test是不可见的,nonStat同理
      

  9.   

    静态绑定成员变量
    在处理Java类中的成员变量时,并不是采用运行时绑定,而是一般意义上的静态绑定。所以在向上转型的情况下,对象的方法可以“找到”子类,而对象的属性还是父类的属性。
    现在再进一步变化,在父类和子类中同时定义和赋值同名的成员变量name,并试图输出该变量的值。
        public class Father { protected String name="父亲属性"; public void method() { System.out.println("父类方法,对象类型:" + this.getClass()); } }
        public class Son extends Father { protected String name="儿子属性"; public void method() { System.out.println("子类方法,对象类型:" + this.getClass()); } public static void main(String[] args) { Father sample = new Son();//向上转型 System.out.println("调用的成员:"+sample.name); } }
    结果3:
    调用的成员:父亲属性这个结果表明,子类的对象(由父类的引用handle)调用到的是父类的成员变量。所以必须明确,运行时(动态)绑定针对的范畴只是对象的方法。
    现在试图调用子类的成员变量name,该怎么做?最简单的办法是将该成员变量封装成方法getter形式。    public class Father { protected String name = "父亲属性"; public String getName() { return name; } public void method() { System.out.println("父类方法,对象类型:" + this.getClass()); } }    public class Son extends Father { protected String name="儿子属性"; public String getName() { return name; } public void method() { System.out.println("子类方法,对象类型:" + this.getClass()); } public static void main(String[] args) { Father sample = new Son();//向上转型 System.out.println("调用的成员:"+sample.getName()); } }
    结果4:
    调用的成员:儿子属性
      

  10.   


    将Super里的变量定义成private的还可以访问到么?~·