为什么 java 多态在我的示例中不起作用
我有这 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(子类)?
解决方案这是使用可见字段的问题之一 - 你最终会使用它们...
Rect
和 CRect
中都有一个 color
字段.字段不是多态的,所以当你使用 cr2.color
时,它使用 Rect
中声明的字段,即 always 设置为 透明"
.
您的 CRect
类应该不 有自己的 color
字段 - 它应该为超类构造函数提供颜色.单个矩形有两个不同的 color
字段是没有意义的 - 当然,它可以有 borderColor
和 fillColor
- 但只有 颜色
太模棱两可了……
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...
相关文章