您的位置:首页 > 编程语言 > Java开发

Java入门学习(2)多态的理解

2015-12-21 17:05 591 查看
Java入门学习(2)多态的理解

面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。

多态存在的三个必要条件

**一、要有继承;

二、要有重写;

三、父类引用指向子类对象。**

class A ...{
public String show(D obj)...{
return ("A and D");
}
public String show(A obj)...{
return ("A and A");
}
}
class B extends A...{
public String show(B obj)...{
return ("B and B");
}
public String show(A obj)...{
return ("B and A");
}
}
class C extends B...{}
class D extends B...{}


如下输出结果?

A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a1.show(b));   ①
System.out.println(a1.show(c));   ②
System.out.println(a1.show(d));   ③
System.out.println(a2.show(b));   ④
System.out.println(a2.show(c));   ⑤
System.out.println(a2.show(d));   ⑥
System.out.println(b.show(b));    ⑦
System.out.println(b.show(c));    ⑧
System.out.println(b.show(d));    ⑨


答案:
①   A and A
②   A and A
③   A and D
④   B and A
⑤   B and A
⑥   A and D
⑦   B and B
⑧   B and B
⑨   A and D


这是对于多态的深入理解,解释如下:

1.实例对象为A,参数为对象B,B为A的子类。执行A.class中show(A obj)

2.同上

3.实例对象为A,参数为对象D,执行A.class中show(D obj)

4.实例对象依然为A,参数为B,本应执行A.class中show(A obj),但是,B.class重写了show(A obj),所以执行B.class show(A obj)

5.同上

6.执行A.class show(D obj) B中并没有重写。

7,8.实例对象为B,参数为B或者B的子类,执行show(B obj)

9.实例对象为B,参数为D,因为B继承自A,也可以执行A中的show(D obj)

其中:

A a2 = new B();

栈中的引用变量是A,堆中的实例变量是B。

将子类的实例,赋值给父类的引用。就是向上转型。

向上转型,在运行时,会遗忘子类对象中与父类对象中不同的方法。也会覆盖与父类中相同的方法–重写。(方法名,参数都相同)

所以a2,可以调用的方法就是,A中有的,但是B中没有的方法,和B中的重写A的方法。

理解了吧,少年!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 多态 继承