我有这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);
}
}
我收到了输出:
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(子类)?
答案 0 :(得分:12)
这是使用可见字段的问题之一 - 您最终使用它们......
color
和Rect
都有CRect
字段。字段不多态,因此当您使用cr2.color
时,使用Rect
中声明的字段,始终设置为{{1} }。
您的"transparent"
类不应该有自己的CRect
字段 - 它应该为超类构造函数提供颜色。单个矩形有两个不同的color
字段是没有意义的 - 它当然可以有color
和borderColor
- 但只是fillColor
太模糊了......
答案 1 :(得分:0)
您应该在子类的构造函数中包含显式的super()
调用:
public CRect(double w, double h ,String c) {
super(w, h);
width=w;
height=h;
color=c;
}
答案 2 :(得分:0)
cr2.area()
会致电CRect.area()
,但cr2.color
会使用字段Rect.color
。您应该使用函数样式getArea()并使用CRect.getColor() { return color; }
以及Rect.getColor() { return color; }