关于多态以及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


你可能感兴趣的:(java,String,Class,float,output)