public class ExtendTest {
public static void main(String[] args){
SubClass subClass=new SubClass();
System.out.println(subClass.getValue());
}
}class BaseClass{
int j=2;
public int getValue(){
return j;
}

}
class SubClass extends BaseClass{
int j=3;
}
上述代码,为什么输出是2,而不是3?

解决方案 »

  1.   

    可以这么理解,实际上是class BaseClass{
    int j=2;
    public int getValue(){
    return this.j;
    }java没有对变量的overriding,只会出现在方法中假如如下所写就是你想象的那种情况public class ExtendTest {
    public static void main(String[] args){
    SubClass subClass=new SubClass();
    System.out.println(subClass.getValue());
    }
    }class BaseClass{
    protected int j=2;
    public int getValue(){
    return j;
    }class SubClass extends BaseClass{
    public int getValue(){
    j = 3;
    return j;
    }

    }
      

  2.   

    子类调用父类的方法 在 SubClass  复写 getValue(){} 则输出 3
      

  3.   

    package property;public class test {
    public static void main(String[] args) {
    SubClass subClass = new SubClass();
    System.out.println(subClass.getValue());
    }
    }class BaseClass {
    int j = 2; public int getValue() {
    return j;
    }}class SubClass extends BaseClass {
    int j = 3;
    public int getValue(){
    return j;
    }}
      

  4.   

    子类继承父类,那子类应该也有一个getValue方法。
    子类有j这个变量,为什么返回的是父类的j变量,不是子类本身的j变量?
      

  5.   

    int J 虽然是同一个变量名,但是作用或不同,所以为2
      

  6.   

    子类没有重写父类的getValue方法,但应该有继承过来的方法。你指作用域是什么作用域?
      

  7.   

    subClass.getValue()该代码执行时,调用的,是父类中的方法,很显然,父类方法是无法访问子类的变量的,所以,该方法的返回值,是父类中变量j的值。
    初始化子类时,会先执行父类的构造函数。我们也可以由此理解下,子类“继承”得来的东西,与子类自己定义的东西,是不一样的。否则,也就不会有“覆盖”这么一说了。
    自己的东西,自己初始化就好了。而父类那边的东西,还是要父类自己去初始化的,子类有受限制的使用权。额,说的不够专业,勉强各位看看
      

  8.   

    上面都说的很详细了 
    楼主想要输出3 在subClass里面再写一遍getValue方法就可以了
      

  9.   

    jdk 帮助  里面有例子  讲的很详细 可以找出来看下
      

  10.   

    因为是继承关系,子类没有重写父类的那个getValue方法,所以当调用的时候调的是父类的那个方法,所以就返回了父类的成员变量