- 论坛徽章:
- 0
|
原帖由 hncdyjh 于 2006-8-4 09:47 发表
(没有a.的)还是属于子类对象的吧。
带a.的方法是属于超类对象的。
这种说法是错误的!
举例:
public class A
{
protected int p1;
protected static void p2() {}
protected void p3() { System.println("p3 from super class"); }
protected void p4() { System.println("p4 from super class"); }
private void p5() {}
}
public class B extends A
{
public void p4() { System.println("p4 from sub class"); }
}
public class TestExtends
{
public static void main(String[] args)
{
B classB = new B();
classB.p3(); //输出 p3 from super class
classB.p4(); //输出 p4 from sub class
classB.p5(); //编译错误!由于超类中p5是private的,所以这里编译不能通过。
}
}
分析:
classB.p3();
classB并没有定义p3(); 但是允许你运行classB.p3()是因为p3是从A继承过来的,所以是超类的方法。运行结果可以看出,输出的仍然是超类中定义的内容。
classB.p4();
虽然超类中定义了p4(),但是如果子类也定义相同signature的方法(即方法名相同,参数相同),即自动覆盖超类中的内容。所以只输出子类的内容,属于子类的方法。
所谓的超类的方法是指子类从超类中继承下来的方法,而不是什么 超类.xxx
所谓子类对超类方法和属性的访问指的是在使用子类时,可以调用子类中并未定义,而在超类/祖先类中定义的方法和属性。
这种访问可以多级继承下去,比如
B extends A
C extends B
D extends C
那么如果A里面定义了一个方法a1();属性为public 或者protected
B, C, D 内部或者实例都可以使用这个a1();
例如
D dclass = new D();
dclass.a1();
[ 本帖最后由 perryhg 于 2006-8-5 17:34 编辑 ] |
|