java多态的理解

来源:互联网 发布:鬼脚七为什么离开淘宝 编辑:程序博客网 时间:2024/05/17 08:55

转自:http://www.cnblogs.com/gnuhpc/

子类重写父类的方法,会存在多态,在子类用构造函数创建一个对象的时候,这个对象的本质就是子类类型的,即使它被强制转换成父类类型,但他的本质依旧是子类类型。


用以下代码说明:

<span style="font-size:18px;">class A {     int i = 1;    String s = "AA";<span style="white-space:pre"></span>public String f(A obj)     {         return("A");     } } class B extends A { <span style="white-space:pre"></span>int i = 2;<span style="white-space:pre"></span>String s = "BB";    public String f(B obj)     {         return("C");     }     public String f(A obj)     {         return("D");     } }</span><pre name="code" class="java">

使用子类创建一个对象:

B b = new B();

然后再将这个子类的引用放到父类对象中:

Aa = b; //这里也可以写成   a = (A)b,b是子类对象,把他赋给a,是上转型,不需要强制转换。 

那么这个父类对象a是子类对象b的上转型对象,对象的实体由子类负责建立,实质还是子类,只是损失了一些功能而已,这样的得失具体如下:

得:上转型对象可以操作和使用子类继承或者重写的方法。

失:上转型对象丧失了对子类新增成员变量或新增的方法的操作和使用。

注:凡是涉及到多态的成员方法,那么上转型的对象都会指向子类的重写,不涉及到多态的,如数        值类型,字符串等成员变量,指向的是父类的成员变量。

下边这段测试代码,a2是上转型,他的本质还是B,但他能看到的只有B从A中继承的那部分,而继承的方法有多态效应,所以,B只能有public String f(A obj) 这个方法是可以用的,对于成员变量,a2指向的是父类的成员变量。

<span style="font-size:18px;">public class Test {public static void main(String args[]) {A a1 = new A();     A a2 = (A)new B(); //子类对象转化为父类,称为上转型,不需要强制转换。    B b = new B();     System.out.println(b.f(b)); //“D”    System.out.println(a2.i);   // 1    System.out.println(b.i);    // 2    System.out.println(a2.s);   // AA    System.out.println(b.s);    // BB    if (a2 instanceof B) {        B b1 = (B) a2;  //父类对象转化为下转型,此时需要使用强制转换,此时需要先判断要转换的这个对象(也就是a2指向的这个对象)是不是B类的实例        System.out.println(b1.f(b));//"C"        System.out.println(b1.f(a1));//"D"     }}}</span>

总结:父类引用指向子类对象。子类和父类中定义同名的变量时,仅仅是隐藏了,变量没有多态性;而对于覆盖的方法,Java表现出多态性,会调用更具体的子类里面的方法,无论从哪里调用,无论使用什么引用类型调用。

另外说说向上转型的作用:由于向上转型的作用,在要传入子类实例的时候,我们可以方便的将父类实例作为参数定义在方法的传入参数上,这样不用利用多态特性进行方法的重载了。其实向上转型也是一种多态特性的体现。

 

作者:gnuhpc 
出处:http://www.cnblogs.com/gnuhpc/

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 3岁儿童大便干燥怎么办 外痔疮出血了该怎么办 外痔疮流血了怎么办呢 外痔疮破了出血怎么办 拉稀拉的肛门疼怎么办 大人屁股沟裂了怎么办 肛门痛大便有血怎么办 肛裂出血几天了怎么办 肛裂拉屎出血该怎么办 孕期肛裂出血该怎么办 老人大便拉不出来怎么办 拉屎拉的屁眼疼怎么办 拉屎堵在肛门口怎么办 上火拉大便有血怎么办 7岁儿童大便带血怎么办 阴炎用药后出血怎么办 孕晚期大便拉不出来怎么办 想拉屎拉不出来怎么办 4岁幼儿大便干燥怎么办 2岁幼儿大便干燥怎么办 1岁幼儿大便干燥怎么办 5岁幼儿大便干燥怎么办 4岁儿童大便干燥怎么办 狗吃别的狗的屎怎么办 狗狗黄疸怎么办最有效 拉屎出血但不疼怎么办 没拉出时就出血怎么办 拉不出大便怎么办肛门像被堵住 尿里粘液丝高怎么办 右肋骨里面疼是怎么办 腰受凉直不起来怎么办 干活累了腰疼怎么办 打球腰打球腰疼怎么办 生完孩子腰酸痛怎么办 腰窝哪里痛是怎么办 尿结石疼的时候怎么办 站久了脚底痛怎么办 站久了脚板痛怎么办 站久脚底板酸痛怎么办 累的腿疼怎么办小妙招 脚走路多了疼怎么办