关于多态以及upcast




class PolyBase ...{
    
public PolyBase() ...{
        System.out.println(
"PolyBase");
    }


    
int a = 1;
    
double d = 2.0;

    
void show() ...{
        System.out.println(
"PolyBase A: a=" + a + " b=" + d);
    }

}


public class PolySub extends PolyBase ...{
    
public PolySub() ...{
        System.out.println(
"PolySub");
    }


    
float a = 3.0f;

    String d 
= "java prog";

    
void show() ...{
        
super.show();
        System.out.println(
"PolySub b=" + a + " d=" + d);
    }


    
public static void main(String[] args) ...{
        PolyBase b
=new PolySub();
        System.out.println(b.a);
        b.show();
    }

}

 

A b = new B(); 这条语句,实际上有三个过程:
(1) A b;
将b声明为父类对象,只是一个引用,未分配空间
(2) B temp = new B();
通过B类的构造函数建立了一个B类对象的实例,也就是初始化
(3) a = (A)temp;
将子类对象temp转换未父类对象并赋给b,这就是上传(upcast),是安全的。
经过以上3个过程,b就彻底成为了一个A类的实例。
子类往往比父类有更多的属性和方法,上传只是舍弃,是安全的;而下传(downcast)有时会增加,通常是不安全的,不过上传会重写A的方法,多态的特性。

父类的属性不能被子类覆盖,而父类的方法可以被子类覆盖,因此b.a输出的是父类的属性,而b.show()调用的则是子类的方法。

OUTPUT:
PolyBase
PolySub
1
PolyBase A: a=1    b=2.0
PolySub b=3.0    d=java prog


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值