黑马程序员技术交流社区
标题: 多态的问题(已解决) [打印本页]
作者: 杨锦 时间: 2012-8-6 18:51
标题: 多态的问题(已解决)
本帖最后由 杨锦 于 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");
}
}
程序是怎么运行的??
作者: hello world 时间: 2012-8-6 19:23
一句话这样子的问题就可以搞定:编译看左边,左边类型的类找不到调用的方法就报编译错误,运行看右边,执行的方法就是右边类型的方法,没有找到就去父类找。
创建哪个对象就执行哪个类的方法
作者: 黑马__李龙 时间: 2012-8-6 19:26
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"
作者: 王晓龙 时间: 2012-8-6 19:27
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");
}
}
希望对你有帮助
作者: 杨文宇 时间: 2012-8-6 19:34
本帖最后由 杨文宇 于 2012-8-6 19:37 编辑
1:当父类和子类具有相同的非静态成员变量,那么在多态下访问的是父类的成员变量
2:当父类和子类具有相同的静态成员变量,那么在多态下访问的是父类的静态成员变量
所以:父类和子类有相同的成员变量,多态下访问的是父类的成员变量。
3:当父类和子类具有相同的非静态方法(就是子类重写父类方法),多态下访问的是子类的成员方法。
4:当父类和子类具有相同的非静态方法(就是子类重写父类静态方法),多态下访问的是父类的静态方法。
5:父类引用变量指向了子类的对象- package javaEnhance;
- public class Test {
- public static void main(String[] args) {
- A a = new B(); //调A的还是调C的??
- a.fun1(); 非静态方法,访问子类对象,发现B类没有fun1,跑到A类找,找到fun1(),
- //然后调用this.fun2(),注意这里的this是指向子类对象的,所以有会到子类调用fun2();得到b
- B b = new C(); //同理,C类有fun1,然后调用super,B类没有找到,到C类找,
- //然后在C类得fun1调用this.fun2,this同样指向子类,所有得到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");
- }
- }
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |