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

2022-01-24 00:00:00 subclass polymorphism java superclass

我有这 4 个 java 类:1

公共类矩形{双倍宽度;双高;字符串颜色;公共矩形(){宽度=0;高度=0;颜色=透明";}公共矩形(双w,双h){宽度=w;高度=h;颜色=透明";}双面积(){返回宽*高;}}

2

公共类 PRect 扩展 Rect{双倍深度;公共PRect(双w,双h,双d){宽度=w;高度=h;深度=d;}双面积(){返回宽*高*深;}}

3

公共类 CRect 扩展 Rect{字符串颜色;公共CRect(双w,双h,字符串c){宽度=w;高度=h;颜色=c;}双面积(){返回宽*高;}}

4

公共类测试{公共测试(){}公共静态无效主要(字符串[]参数){矩形 r1=新矩形(2,3);System.out.println("r1的面积="+r1.area());PRect pr1=新 PRect(2,3,4);System.out.println("pr1的面积="+pr1.area());CRect cr1=new CRect(2,3,"RED");System.out.println("cr1的面积="+cr1.area()+" color = "+cr1.color);System.out.println("
 POLY_MORPHISM");矩形 r2=新矩形(1,2);System.out.println("r2的面积="+r2.area());矩形 pr2=新 PRect(1,2,4);System.out.println("pr2的面积="+pr2.area());矩形 cr2=new CRect(1,2,"蓝色");System.out.println("cr2的面积="+cr2.area()+" color = "+cr2.color);}}

我得到了输出:

<上一页>r1=6.0的面积pr1的面积=24.0cr1=6.0 颜色的面积 = REDPOLY_MORPHISMr2=2.0 的面积pr2的面积=8.0cr2的面积=2.0 颜色=透明***

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

解决方案

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

RectCRect 中都有一个 color 字段.字段不是多态的,所以当你使用 cr2.color 时,它使用 Rect 中声明的字段,即 always 设置为 透明".

您的 CRect 类应该不 有自己的 color 字段 - 它应该为超类构造函数提供颜色.单个矩形有两个不同的 color 字段是没有意义的 - 当然,它可以有 borderColorfillColor - 但只有 颜色太模棱两可了……

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("
 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 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***

why consider cr2 as Rect(super class) and with "transparent" color not as CRect (sub class) with "Blue" color ?

解决方案

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

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".

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...

相关文章