Java 设置扩展抽象类的子类的实例变量

Java 设置扩展抽象类的子类的实例变量,java,swing,polymorphism,abstract,shapes,Java,Swing,Polymorphism,Abstract,Shapes,我有一个名为Shape的抽象类,还有一个名为Circle的扩展Shape的类 Shape shapeCircle = new Circle(); 我可以很好地设置和获取shapeCircle的颜色,因为颜色获取器和设置器都在形状中,但圆的尺寸仅适用于圆类(radius) 如果Circle类有一个实例变量private int radius和一个名为getRadius()的方法,如何获取/设置shapeCircle的半径?我尝试了shapeCircle.getRadius(),但运气不佳。您必须

我有一个名为
Shape
的抽象类,还有一个名为
Circle
的扩展Shape的类

Shape shapeCircle = new Circle();
我可以很好地设置和获取shapeCircle的颜色,因为颜色获取器和设置器都在形状中,但圆的尺寸仅适用于圆类(radius)


如果Circle类有一个实例变量
private int radius
和一个名为
getRadius()
的方法,如何获取/设置
shapeCircle
的半径?我尝试了
shapeCircle.getRadius()
,但运气不佳。

您必须使用
instanceof
关键字来检查此处的原始类型。如果类型为
Circle
,则可以键入cast并调用
getRadius
方法。差不多

if (shapeCircle instanceof Circle) {
 Circle circle = (Circle)shapeCircle;
 int radius = circle.getRadius();
}

应该可以。

您必须使用
instanceof
关键字来检查此处的原始类型。如果类型为
Circle
,则可以键入cast并调用
getRadius
方法。差不多

if (shapeCircle instanceof Circle) {
 Circle circle = (Circle)shapeCircle;
 int radius = circle.getRadius();
}
这样就可以了

只有形状的方法可以通过对象shapeCircle访问。 shapeCircle是类型Shape,圆圈中的方法不可见

用这个,

 Circle shapeCircle = new Circle();
您可以同时调用圆和形状两种方法。上述情况仅利用继承

编辑

但是如果您添加
public abstract int getDimension()
Shape
类和
Circle
类中实现
getDimension()
方法

@Override
    public int getDimension() {
        return radius;
    }
扩展
Shape
的所有类都需要实现
getDimension()
方法。但每个子类都有自己的维度

你可以用

    Shape shapeCircle = new Circle();
    shapeCircle.getDimension();
这同时利用了多态性和抽象类

只有形状的方法可以通过对象shapeCircle访问。 shapeCircle是类型Shape,圆圈中的方法不可见

用这个,

 Circle shapeCircle = new Circle();
您可以同时调用圆和形状两种方法。上述情况仅利用继承

编辑

但是如果您添加
public abstract int getDimension()
Shape
类和
Circle
类中实现
getDimension()
方法

@Override
    public int getDimension() {
        return radius;
    }
扩展
Shape
的所有类都需要实现
getDimension()
方法。但每个子类都有自己的维度

你可以用

    Shape shapeCircle = new Circle();
    shapeCircle.getDimension();

这同时利用了多态性和抽象类

“形状不是圆”=圆方法不适用于形状。

“形状不是圆”=圆方法不适用于形状

Shape shapeCircle = new Circle();
这里引用的是Shape,Shape类没有定义radius变量,所以不能使用
shapeCircle.getRadius()

要调用get/set radious方法类型,请按如下方式强制转换shapecircle变量

Circle shapeCircle = (Circle)shapeCircle;
现在您可以调用get/set radious方法。请注意,类型转换代码应该采用不同的方法,以便使用多态性

编辑:

您应该将抽象类或接口设计为具有所有重要/通用操作/方法,这些操作/方法将帮助您编写多态代码。例如:RADIUS字段对于一个圈类是特定的,但是考虑最终要计算该区域。因此,您应该在抽象类中定义CalculateArea()方法,并让每个形状实现该方法。这样,您就实现了多态性

Shape ShapeCicle = new Circle(Radius);
Float area = ShapeCircle.area();
重点是不要局限于radius示例。尝试以一种可以从多态性中获益的方式定义类

Shape ShapeCicle = new Circle(Radius);
Float area = ShapeCircle.area();
这里引用的是Shape,Shape类没有定义radius变量,所以不能使用
shapeCircle.getRadius()

要调用get/set radious方法类型,请按如下方式强制转换shapecircle变量

Circle shapeCircle = (Circle)shapeCircle;
现在您可以调用get/set radious方法。请注意,类型转换代码应该采用不同的方法,以便使用多态性

编辑:

您应该将抽象类或接口设计为具有所有重要/通用操作/方法,这些操作/方法将帮助您编写多态代码。例如:RADIUS字段对于一个圈类是特定的,但是考虑最终要计算该区域。因此,您应该在抽象类中定义CalculateArea()方法,并让每个形状实现该方法。这样,您就实现了多态性

Shape ShapeCicle = new Circle(Radius);
Float area = ShapeCircle.area();

重点是不要局限于radius示例。尝试以一种可以从多态性中获益的方式定义类

我想从多态性中获益,但如果我能直接创建Circle类及其方法的实例((Circle)shapeCircle),我就无法理解抽象方法的意义;工作,不知道它是否是多态性我已经更新了一些评论我的答案。请勾选@DogI,我想从多态性中获益,但如果我能直接创建Circle类及其方法的实例((Circle)shapeCircle),我就无法理解抽象方法的意义;工作,不知道它是否是多态性我已经更新了一些评论我的答案。请检查@dogThank,我现在可以访问这些方法,但是如果我这样声明的话,我不理解Shape抽象类的点。我添加了更多的解释。请检查。谢谢,我现在可以访问这些方法,但是如果我这样声明的话,我不理解Shape抽象类的点。我添加了更多的解释。请检查一下。
Shape ShapeCicle = new Circle(Radius);
Float area = ShapeCircle.area();