class A {
void fun1() {
System.out.println(fun2());
}
int fun2() {
return 123;
}
}
public class B extends A {
int fun2() {
return 456;
}
public static void main(String args[]) {
B b = new B();
b.fun1();
A a = b;
a.fun1();
}
} 作者: 棉/mg花/x糖 时间: 2013-5-25 22:09 本帖最后由 棉/mg花/x糖 于 2013-5-25 22:14 编辑
public class A
{
void fun1() //3,fun1方法返回的是一个空参数,只输出fun2方法的值,此时已被B类fun2方法覆盖,所以A类中的fun2方法没有执行。
{
System.out.println(fun2());
}
int fun2()
{
return 123;
}
}
public class B extends A { //1,B类继承A类并覆盖A类。
int fun2() //2,此时B类的 fun2方法覆盖了A类的fun2方法,fun2方法的返回值是456。
{
return 456;
}
public static void main(String args[]) {
B b = new B(); //在B类中自定义一个对象。
b.fun1(); //调用覆盖后的fun1方法。
A a = b; //将b类对象的值赋值给A类对象 。
a.fun1(); //a也是调用覆盖后的fun1方法
}
}
建议楼主还是多写写注释。我也是写完了就懂了。菜鸟云青年。作者: 王靖远 时间: 2013-5-25 23:55
public class B extends A { 你这里不能用public 除非你给父类也加上public
b.fun1();很好理解。 a.fun1()就是多态的父类引用指向子类对象。作者: 萧萧北 时间: 2013-5-28 17:18
楼上说的对啊,就是 对象时引用类型,new 一个新对象则在堆内存分配一个内存空间,你的代码中:
public static void main(String args[]) {
B b = new B();
b.fun1();
A a = b;
a.fun1();
}
复制代码
只有 B b = new B(); 则在内存中分配了一个内存空间,b对象是指向 new B() 的内存地址
而 A a = b; 此处把b对象指向的内存地址分配给了a,所以a对象是指向的也是 new B() 的内存地址,
所以最后两个输出结果就是一样的了