这是我在这里发表的第一篇文章,请耐心等待!我有一个我需要编写的程序。以下是说明:在该类中创建一个名为areaExcersice的类,您将拥有一个名为shapes的超类,然后在它下面是twoDimensionalShapes,后面是subDimensionalShapes下的子子类circle和square。在circle extends twoDimensionalShapes中,我将传递radius的用户输入,例如:
System.out.print("what is the radius");
然后
radius = input.nextDouble()
已经知道如何在层次结构系统中创建和分配类,但是,我不知道我将如何在twiDimensionalShapes下调用我的circle类。我必须创建一个if语句,以便用户可以选择要选择的形状,这样就像这样#34;按1代表圆形,2代表方形"在我的
if(user_input == 1){
这是我的问题,如何在twodDimensionalShapes下调用circle类来查找区域并传递半径?谢谢,这就是我需要知道的一切,如果你能指出我已经为我做了一个实例的好方向
Circle c = new Circle
然后在我的if语句中我会c.getArea()
但是那时我会把用户询问的半径放在哪里?
答案 0 :(得分:0)
您可以移动所有Shape或TwoDimensionalShape子类中常见的任何内容,以便可以一般性地引用它们:
public abstract class Shape<T extends TwoDimensionalShape> {
public abstract String getName(); // Get the name of the shape for display purposes
public abstract double getArea(); // Get the surface area of this Shape
}
public abstract class TwoDimensionalShape<T extends TwoDimensionalShape> extends Shape<T> {
private double area = 0;
public double getArea() {
return this.area;
}
protected void setArea(double area) {
this.area = area;
}
}
public class Circle extends TwoDimensionalShape<Circle> {
public Circle ( double radius ) {
setArea( Math.PI * Math.pow(radius, 2) );
}
public String getName() {
return "Circle";
}
}
public class Square extends TwoDimensionalShape<Square> {
public Square ( double width, double height ) {
setArea( width * height );
}
public String getName() {
return "Square";
}
}
答案 1 :(得分:0)
我对这些项目感到非常恼火的是,他们明确要求你在不需要的时候创建课程。这只会让那些无法弄清楚他们为什么要做某事的学生感到困惑,因为实际上没有理由去做。你没有理由拥有一个Shape类。在现实世界中,我会以此为借口摆脱它。因为你需要有一个我发明它存在的理由:颜色。这样您就可以看到Shape可能有用。如果你说“我不需要颜色”,我说“你不需要形状”。看看它是如何工作的?
我在这里使用一个叫做静态内部类的脏小技巧,所以这一切都在一个文件中工作。如果你复制它至少取类的静态并将它们移动到自己的文件中。
import java.util.Scanner;
public class AreaExcersice {
public static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
System.out.println("Choose 1 for circle or 2 for square:");
int userInput = Integer.parseInt( input.nextLine() );
TwoDimensionalShape twoDShape = null;
if (userInput == 1) {
System.out.println("Enter a radius for circle:");
int radius = Integer.parseInt( input.nextLine() );
twoDShape = new Circle("Blue", radius, radius, radius);
} else if (userInput == 2) {
System.out.println("Enter a length for the sides of the square");
int side = Integer.parseInt( input.nextLine() );
twoDShape = new Rectange("Green", 0, 0, side, side);
} else {
System.out.println("Invalid input.");
}
if (twoDShape != null) {
System.out.println( twoDShape.toString() );
}
}
public static abstract class Shape {
String color;
public Shape(String color) {
this.color = color;
}
public abstract String toString();
}
public static abstract class TwoDimensionalShape extends Shape {
int x;
int y;
public TwoDimensionalShape(String color, int x, int y) {
super(color);
this.x = x;
this.y = y;
}
public abstract double getArea();
}
public static class Circle extends TwoDimensionalShape {
int radius;
public Circle(String color, int x, int y, int radius) {
super(color, x, y);
this.radius = radius;
}
@Override
public double getArea() {
return Math.PI * Math.pow(radius, 2);
}
@Override
public String toString() {
return color + " circle at " + x + ", " + y + " with radius " +
radius + " and area of " + getArea();
}
}
public static class Rectange extends TwoDimensionalShape {
int height;
int width;
public Rectange(String color, int x, int y, int height, int width) {
super(color, x, y);
this.height = height;
this.width = width;
}
@Override
public double getArea() {
return width * height;
}
@Override
public String toString() {
return color + " rectange at " + x + ", " + y + " with height " +
height + ", width " + width + " and area of " + getArea();
}
}
}
显示器:
Choose 1 for circle or 2 for square:
1
Enter a radius for circle:
20
Blue circle at 20, 20 with radius 20 and area of 1256.6370614359173
这可能有些过分,但它应该清楚地向您展示继承结构可以为您做什么。每个类只有特定的实现代码。没有什么是重复的。相反,它是共享的。有问题吗?
答案 2 :(得分:0)
因此,拥有TwoDimensionalShapes的观点有点模糊,但我们可以猜测它定义的方法类似于&#34; getArea()&#34;没有实现它们。扩展TwoDimensionalShapes的每个类都必须实现自己的区域计算。
我不会想像&#34; setArea(双面积)&#34;非常有用;区域不是很难计算,我们需要存储它们,并存储它们会导致其他问题。
所以我们最终得到类似的东西:
public TwoDShape extends Shape // I have no use for Shape in this example...
{
public double getArea(); // this is an abstract method, hope you've covered those.
}
public Circle extends TwoDShape
{
private double radius;
public Cirlcle(double givenRadius) { radius = givenRadius; }
public double getArea() { return PI*radius*radius; }
}
我遗漏了很多东西。例如,getArea()应确保radius不为0并执行类似抛出异常的操作。
现在,要使用它,您可能有:
public class Main
{
public static void main(String ... arguments)
{
Circle c = new Circle(4.0);
System.out.println("Radius of 4 gives area of " + c.getArea();
}
}
现在,我将离开Square去做,它将与Circle非常相似。让我们知道怎么回事。在您完成Square之后,您将能够执行以下操作:
public Main
{
public static void main(String ... arguments)
{
Shape[] shapes = new Shape[3];
shapes[0] = new Circle(4.0);
shapes[1] = new Square(5.0);
shapes[2] = new Square(6.0);
for (shape : shapes)
{
System.out.println("Area is " + shape.getArea());
}
}
}
答案 3 :(得分:0)
谢谢你们!你们都很棒!!我还没有涵盖抽象类,但你的显式代码向我展示了方式!点击我和唉!我看到房间里的灯光闪耀!我崇拜你的程序员以及敬佩你,因为有一天我会像你们一样成为一名专业人士。我正在努力在编程领域内获得深刻的知识,这只是一个开始。再次非常感谢你清理我的头并指出我正确的方向!自己完成一个程序并正确输出它感觉非常好,感谢Stack Overflow及其所有成员!我是一个菜鸟,第一次在这里发帖,所以我可能会因为格式错误而被投票回答。