A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨锦 中级黑马   /  2012-8-6 18:51  /  1746 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨锦 于 2012-8-6 19:58 编辑

public class Test {
public static void main(String[] args) {
A a = new B();      //调A的还是调C的??
a.fun1();
B b = new C();
b.fun1();
a = new C();
a.fun1();
}
}
class A {
void fun1() {
fun2();
}
void fun2() {
System.out.println("A");
}
}
class B extends A {
void fun2() {
System.out.println("B");
}
}
class C extends B {
void fun1() {
super.fun1();
}
void fun2() {
System.out.println("C");
}
}

程序是怎么运行的??

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

4 个回复

倒序浏览
一句话这样子的问题就可以搞定:编译看左边,左边类型的类找不到调用的方法就报编译错误,运行看右边,执行的方法就是右边类型的方法,没有找到就去父类找。
创建哪个对象就执行哪个类的方法
回复 使用道具 举报
new 出来的是什么就是用的哪个对象的方法,A a = new B();      其实对象是B,因为声明的是A,所以只能使用A里面定义的方法,但是方法体还是用的B里的,你可以用a.getClass();方法做试验,打印出来的是B.class,
B继承自A,所以调用a.fun1();时,fun1()使用的是继承自A的方法体,
void fun1() {
fun2();
}
fun1调用fun2();,这时使用的是B里面重写的方法fun2,所以打印出“B”
同理后面打印的是"C","C"

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

回复 使用道具 举报

public class Test {
public static void main(String[] args) {
A a = new B();      //这里是子类当父类用 先运行子类的方法 子类没有在运行父类的方法
a.fun1();                        //调用fun1()方法 B类中没有调用父类的 fun1()方法  fun1()方法调用fun2()方法 子类中用fun2用子类的
                                        //打印B
B b = new C();                // 下面的原理和上面是一样的  所以打印结果为 BCC
b.fun1();
a = new C();
a.fun1();
}
}
class A {
void fun1() {
fun2();
}
void fun2() {
System.out.println("A");
}
}
class B extends A {
void fun2() {
System.out.println("B");
}
}
class C extends B {
void fun1() {
super.fun1();
}
void fun2() {
System.out.println("C");
}
}
希望对你有帮助

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 杨文宇 于 2012-8-6 19:37 编辑

1:当父类和子类具有相同的非静态成员变量,那么在多态下访问的是父类的成员变量
2:当父类和子类具有相同的静态成员变量,那么在多态下访问的是父类的静态成员变量
所以:父类和子类有相同的成员变量,多态下访问的是父类的成员变量。
3:当父类和子类具有相同的非静态方法(就是子类重写父类方法),多态下访问的是子类的成员方法。
4:当父类和子类具有相同的非静态方法(就是子类重写父类静态方法),多态下访问的是父类的静态方法。
5:父类引用变量指向了子类的对象
  1. package javaEnhance;

  2. public class Test {
  3. public static void main(String[] args) {
  4. A a = new B();                     //调A的还是调C的??
  5. a.fun1();                           非静态方法,访问子类对象,发现B类没有fun1,跑到A类找,找到fun1(),
  6.                                           //然后调用this.fun2(),注意这里的this是指向子类对象的,所以有会到子类调用fun2();得到b
  7. B b = new C();      //同理,C类有fun1,然后调用super,B类没有找到,到C类找,
  8.                              //然后在C类得fun1调用this.fun2,this同样指向子类,所有得到C
  9. b.fun1();
  10. a = new C();       //同上.
  11. a.fun1();
  12. }
  13. }

  14. class A {
  15. void fun1() {
  16. fun2();
  17. }
  18. void fun2() {
  19. System.out.println("A");
  20. }
  21. }
  22. class B extends A {
  23. void fun2() {
  24. System.out.println("B");
  25. }
  26. }
  27. class C extends B {
  28. void fun1() {
  29. super.fun1();
  30. }
  31. void fun2() {
  32. System.out.println("C");
  33. }
  34. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马