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
属性自己所有或者被继承
所以当然sub method 会先于 sup.field = 0, sup.getField() = 1 这两个语句输出
return field;
System.out.println("sup.field = " + sup.field
+ ", sup.getField() = " + sup.getField());
会首先捕捉到
public int getField(){
System.out.println("super method");
return field;
}
这个方法里边的变量field吗?
系统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的原因了.