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();