为什么java多态性不能在我的例子中工作

我有这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); } } 

我得到了输出:

 r1 = 6.0的区域
 pr1的面积= 24.0
 cr1 = 6.0的面积= RED
 POLY_MORPHISM 
 r2 = 2.0的面积
 pr2的面积= 8.0
 cr2的面积= 2.0色=透明***

为什么认为Cr2作为Rect(超类)和“透明”颜色不是作为与“蓝”颜色CRect(子类)?

这是使用可见字段的问题之一 – 你最终使用它们…

RectCRect中都有一个color域。 字段不是多态的,所以当你使用cr2.color ,它使用Rect声明的字段,它始终设置为"transparent"

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

你应该在你的子类的构造函数中包含一个显式的super()调用:

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

cr2.area()将调用CRect.area()cr2.color将使用字段Rect.color 。 你应该使用函数风格getArea()并且有CRect.getColor() { return color; } CRect.getColor() { return color; }以及Rect.getColor() { return color; } Rect.getColor() { return color; }

Interesting Posts