Java问题~~~~

来源:百度知道 编辑:UC知道 时间:2024/05/09 15:51:41
代码如下:

class Super{
public int fi=0;
public int getField(){return fi;}
}

class Sub extends Super{
public int fi=1;
public int getField(){return fi;}
public int getSuperField(){return super.fi;}
}

public class FieldAccess{
public static void main(String[] argv){
Super sup=new Sub();
System.out.println("sup.fi= " + sup.fi + ",sup.getField()= " + sup.getField());
Sub sub=new Sub();
System.out.println("sub.fi= " + sub.fi + ",sub.getField()= " + sub.getField() + ",sub.getSuperField()= " + sub.getSuperField());
}
}

运行结果:sup.fi=0,sup.getField()=1
sub.fi=1,sub.getField()=1,sub.getSuperField()=0

为什么运行结果sup.fi=0,而不是sup.fi=1?
同时为什么sup.getField()返回的结果是1,返回的哪个变量的值?
谢谢高手指点~~

sup 是 super的一个引用,但实际new出来的却是sub()对象;
这种情况下,sup默认访问的是super中的属性,而访问的方法却是sub()中被重写了的方法或者是sub中特有的方法!

如果想访问super()中被sub()重写的方法只能用super.方法名();

你第一次new出来的是一个sub类,但是你用Supper类来接收这个实例,所以它的fi是父类的fi。
第二次new出来的就是一个sub类,所以是正常打印出来的内容。

讲的通俗点就是,方法可以被覆盖,属性不能被覆盖,