为什么java多态在我的例子中不起作用

问题描述:

我有这4个java条款:
1

I have these 4 java clases: 1

public class Rect {
    double width;
    double height;
    String color;

    public Rect( ) {
        width=0;
        height=0;
        color="transparent";      
    }

    public Rect( double w,double h) {
        width=w;
        height=h;
        color="transparent";
    }

    double area()
    {
        return  width*height;
    } 
}

2

public class PRect extends Rect{
    double depth;

    public PRect(double w, double h ,double d) {
        width=w;
        height=h;
        depth=d;
    }

    double area()
    {
        return  width*height*depth;
    }     
}

3

public class CRect extends Rect{ 
    String color;

    public CRect(double w, double h ,String c) {
        width=w;
        height=h;
        color=c;
    }

    double area()
    {
        return  width*height;
    }     
}

4

public class test {

    public test() { }

    public static void main(String[] args) {  
        Rect r1=new Rect(2,3);
        System.out.println("area of r1="+r1.area());

        PRect pr1=new PRect(2,3,4);
        System.out.println("area of pr1="+pr1.area());


        CRect cr1=new CRect(2,3,"RED");
        System.out.println("area of cr1="+cr1.area()+"  color = "+cr1.color);


        System.out.println("\n POLY_MORPHISM ");
        Rect r2=new Rect(1,2);
        System.out.println("area of r2="+r2.area());

        Rect pr2=new PRect(1,2,4);
        System.out.println("area of pr2="+pr2.area());


        Rect cr2=new CRect(1,2,"Blue");
        System.out.println("area of cr2="+cr2.area()+"  color = "+cr2.color); 

    }
}

I得到了输出:

I got the output:


area of r1=6.0
area of pr1=24.0
area of cr1=6.0  color = RED
POLY_MORPHISM 
area of r2=2.0
area of pr2=8.0
area of cr2=2.0  color = transparent***

为什么将cr2视为Rect(超类)并将透明颜色视为具有蓝色颜色的CRect(子类) ?

这是使用可见字段的问题之一 - 您最终使用它们......

This is one of the problems of using visible fields - you end up using them...

你在 Rect 中都有颜色字段和 CRect 。字段不是多态,因此当您使用 cr2.color 时,它使用 Rect $ c中声明的字段$ c>,总是设置为透明

You've got a color field in both Rect and CRect. Fields are not polymorphic, so when you use cr2.color, that uses the field declared in Rect, which is always set to "transparent".

你的 CRect 类应该有自己的颜色字段 - 它应该为超类提供颜色构造函数。单个矩形有两个不同的颜色字段是没有意义的 - 它可能有 borderColor fillColor ,当然 - 但只是颜色太模糊了......

Your CRect class should not have its own color field - it should supply the colour to the superclass constructor. It makes no sense for a single rectangle to have two different color fields - it could have borderColor and fillColor, of course - but just color is too ambiguous...