子类为什么这样?

来源:百度知道 编辑:UC知道 时间:2024/06/23 23:04:39
定义了三个类,其中Person类是Student类的父类。
public class Person
{
int age = 5;
public void setAge(int age)
{
this.age = age;
}
public int getAge()
{
return this.age;
}

public int getInfo()
{
return this.age;
}
}

public class Student extends Person
{
int age = 7;
public int getAge()
{
return age;
}
}

public class Test
{
public static void main(String args[])
{
Student s = new Student();
System.out.println(s.age);
System.out.println(s.getAge());
System.out.println(s.getInfo());
}
}

运行Test,为什么结果会是7,7,5,而不是7,7,7?
继承了不就是已经属于子类的方法了吗?既然子类有了这个方法,为什么还是不能独立使用而依赖于父类呢?
不好意思,笨点儿,您再指点指点。

继承不是代码的复制,就是说不是把
public int getInfo()
{
return this.age;
}
}
这块代码复制到Student类里面
所以getInfo()里面的this是指超类而不是子类
我说的能明白 吗?

其实继承了只是它可以以自己的名义来调用超类方法,但是具体实现上是相当于在用super来调用的

比如说超类里面定义了一个getInfo()
子类里面也定义了一个getInfo(),那么你调用超类的方法的时候是用super.getInfo,调用子类自己的方法的时候是this.getInfo,那么如果子类没有定义这个方法,你用this.getInfo系统就只能去调用超类的那个方法了(即super.getInfo)

总之超类的东西永远是超类的,超类的方法里面调用和修改的成员变量也是超类的,只是如果你调用的这个成员子类没有的话,子类就可以以自己的名义(this.的方式)来调用超类的同名方法了

这下懂了吗?

子类继承父类的时候,方法和属性也沿用父类的,除非在子类中重新定义了,就好象Student中的age和getAge(),但是getInfo()并没有被重写,所以会直接调用Person中的getInfo(),方法中的age也是父类中的属性, 你可以在Student的getAge()里加一个
System.out.println(age + " | " + this.age + " | " + super.age); // output 7 | 7 | 5
就能看出来父类中的属性和方法其实还都是保留着的.

这些东西确实一开始会比较混乱, 多接触接触就好了, 谁也不是上来就什么都清楚的哈