标题: 这段代码的流程谁给祥细说下 [打印本页] 作者: 何伟 时间: 2012-12-25 18:59 标题: 这段代码的流程谁给祥细说下 class A {
void fun1() {
System.out.println(fun2());
}
int fun2() {
return 123;
}
}
class B extends A {
int fun2() {
return 456;
}
public static void main(String[] args) {
A a;
B b = new B();
b.fun1();
a = b;
a.fun1();
}
}
为什么打印的结果是两个456呢?作者: 高境 时间: 2012-12-25 19:15
首先,b.fun1();调用的是子类B里面的fun1(),这个fun1是继承自父类A类,
然后,a=b;相当于A a = new B();这里用到了多态,父类引用指向子类对象,所以,当调用a.fun1();调用的是子类对象里面的fun1()。作者: 李敬卫 时间: 2012-12-25 19:21
子类复写父类的fun2(),之后子类的对象b调用fun1()方法输出复写后的方法,结果返回456,然后对象b赋值给父类的对象a,所以现在可以把a看作是b,当然也就返回456作者: 一帆风顺 时间: 2012-12-25 19:29
已经明确标注了 作者: Rancho_Gump 时间: 2012-12-25 19:41
这里有个重点就是:B的fun2()方法复写了A的fun2()方法
当B继承A时相当于B有了A的两个方法,但B对fun2()进行了复写,在用B的对象调用fun2()时,执行复写后的方法,即B的方法。若用A的对象调用则执行A的方法。
public static void main(String[] args) {
A a;
B b = new B();
b.fun1();
a = b;//此处是多态,相当于A a = new B(); 调用时执行B的fun2()方法
a.fun1();
a = new A();
a.fun1();//此处打印结果是:123
public static void main(String[] args) {
A a;
B b = new B();
b.fun1();//打印456
a = b;//相当于A a = new B();运行时看子类,编译时看父类
a.fun1();//456,在fun1中调用了fun2,父类中的fun2被子类重写了 }
} 作者: 黑马-邢广耀 时间: 2012-12-26 09:42
class A {
void fun1() {
System.out.println(fun2());
}
int fun2() {
return 123;
}
}
class B extends A
{
int fun2()
{
return 456;
}
public static void main(String[] args)
{
A a;
B b = new B();
b.fun1();//B是A的子类,调用fun1()方法,方法中涉及到fun2(),子类覆写父类,所以答案是456
a = b;//涉及到多态 A a=new B();父类的引用指向子类对象,运行时看右边,编译时看左边
a.fun1();
}
}