class Super{
    public int field = 0;
    public int getField(){
        System.out.println("super method");
        return field;
    }
}
class Sub extends Super{
    public int field = 1;
    public int getField(){
        System.out.println("sub method");
        return field;
    }
    public int getSuperField(){
        return super.field;
    }
}
public class FieldAccess {
    public static void main(String[] args){
        Super sup = new Sub();//Upcast
        System.out.println("sup.field = " + sup.field
                + ", sup.getField() = " + sup.getField());
        
        Sub sub = new Sub();
        System.out.println("sub.field = " + sub.field + ", sub.getField() = "
                + sub.getField() + ",sub.getSuperField() = " + sub.getSuperField());
    }
}
getfield()并非构造方法,为什么会这么输出?
sub method
sup.field = 0, sup.getField() = 1
sub method
sub.field = 1, sub.getField() = 1,sub.getSuperField() = 0
最开始并未调用getfield()方法啊?
为什么开始就输出了
sub method

解决方案 »

  1.   

    关于这个差不多的问题在csdn都看了无数遍了。
      

  2.   

    子类覆盖父类的public方法。
    属性自己所有或者被继承
      

  3.   

    为什么sub method 会先于 sup.field = 0, sup.getField() = 1 这两个语句输出
      

  4.   

    print之前需要执行getField()才能知道值吧?
    所以当然sub method 会先于 sup.field = 0, sup.getField() = 1 这两个语句输出
      

  5.   

    因为是先打印,再返回值System.out.println("sub method");
    return field;
      

  6.   

    你说的是执行这个语句
    System.out.println("sup.field = " + sup.field
                    + ", sup.getField() = " + sup.getField());
    会首先捕捉到
    public int getField(){
            System.out.println("super method");
            return field;
        }
    这个方法里边的变量field吗?
      

  7.   

    先执行了sup.getField()然后执行sup.field
      

  8.   

    晕了。
    系统print方法的执行过程是这样的:先把()包围的数据放入系统对象out的输出流中,等所有数据放入后系统print流输出到控制台.
    仔细观察下面这段代码的System.out.println()语句的执行过程,是如下的情况 .
    1.main方法第2行开始,print函数开始执行,开始获取流数据.
    2."sup.field = "字符串首先被放入流中,然后是sup.field.接下来是", sup.getField() = "字符串,此时,重点来了,在取得sup.getField()返回数据放入流之前,main的print线程跳入sup.getField()方法执行方法内代码,这个过程包括sup.getField()方法内的print方法执行,接着返回数据给之前的print流.
    3.现在来看整个过程,显示放入部分可直接获取的数据到print流,然后跳转到sup.getField()方法内执行方法内的print方法输出sub method,最后取得所有数据后main方法的print方法才开始将流输出到控制台.
    这就是为什么先输出sub method的原因了.
      

  9.   

    对啊,输出之前首先要执行完println()里面的表达式求值,取得值之后组成String再输出。
      

  10.   

    http://topic.csdn.net/u/20090903/18/10611820-2751-445b-add3-1f793a920af8.html