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

编程入门 行业动态 更新时间:2024-10-28 12:16:16
本文介绍了为什么 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...

更多推荐

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

本文发布于:2023-11-15 07:03:27,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1592206.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:示例   中不   多态   java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!