日期:2014-05-18  浏览次数:21172 次

关于子类继承父类的get方法
class Fu {
 int i=2;
public int getI(){
return i;
}
}
class Zi extends Fu{
int i=4;

}
public class Jicheng {

public static void main(String[] args) {
System.out.println(new Zi().getI());
}

}

这个输出结果怎么会是2呢,子类不是应该 也继承了父类的getI()方法么,怎么get到的是父类的值
------解决方案--------------------
引用:
 谁能从java内存分配来指点下呢

这是我自己的理解
------解决方案--------------------
Quote: 引用:

1,子类继承父类,会继承父类的所有属性(properties)和方法(methods),包括private修饰的属性和方法,但是子类只能访问和使用非private的,所以可以这么理解: 子类对象的内部 包涵了一个完整父类对象;

2.  new Zi()就是创建一个子类对象,而子类对象内部包涵了父类对象,所以又要先new Fu(), 也就是说
 创建子类对象 = 创建父类对象 + 其他 
//	Zi() {
// super(); 这是JVM默认加上去的
// }


3.子类对象没有重写(Overriding)父类的方法,那么这个方法就还"包涵"在父类对象里,,子类对象用getI()方法,其实质调用的是 子类对象"肚子里的"那个父类对象的方法.

4 return i; JAVA规定,变量前面没有特别说明是谁的变量,那么就适用"就近原则",显然父类对象的属性int i是最近的,下面这个例子可以更好的理解就近原则;
public class Test {
static int age = 1;
public static void main(String[] args) {

System.out.println(age);//输出1     此处没有指明这个age是谁的,适用就近原则,JVM认为age是成员变量static int age;

int age = 2;
System.out.println(age);//输出2 此处没有指明这个age是谁的,适用就近原则,JVM认为age是  局部变量int age;

System.out.println(Test.age);//输出1 此处指明了是类Test的age,JVM就不能再用就近原则了.
}
}


------解决方案--------------------
引用:
Quote: 引用:

嗯,楼上的解释的都很到位啊。主要是一个子类重写父类的问题。子类重写了父类,就算你用Fu f = new Zi();  f.getI(); 得到的也是子类的属性值。

既然子类继承了父类,那么子类里面不是应该也有个getId的方法只是没有显示出来么?
class Zi extends Fu{
    int i=4;
     public int getI()
    {
        return i;
    }
}

虽然子类继承了父类的,如果没有重写,严格意义上来说, 只能说子类能直接访问这个属性或者是方法,但是这个方法还是在父类的里面。子类相当于将整个父类放在了自己的里面。所以在没有重写的情况,由于这个方法还是在父类中间的方法,所以返回的还是父类的属性。