为什么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...