【问题标题】:Drivers for Classes in Java “Rectangle"Java“矩形”类的驱动程序
【发布时间】:2017-03-28 22:38:20
【问题描述】:

我从未在 Java 中为驱动程序使用单独的文件。我习惯于只使用 main 方法。我在 Python 中使用了单独的文件,但 Java 是新的。下面是我为每个类(“Rectangle”和“Driver”)编写的代码,每个类都来自不同的文件。

将方法更改为静态的更新:不要注意类名或格式的更改……我只是在进行调整,以便它可以与 MyProgrammingLab 一起使用。我仍然必须添加长度和宽度的参数,仅在 0.0 和 20.0 之间(简单的 if-else 语句)。

import java.util.Scanner;

公共类驱动程序{

public static void main(String[] args) {

    Scanner input = new Scanner( System.in);

    System.out.print("Enter length of rectangle:");
    double length = input.nextDouble();
    System.out.print("Enter width of rectangle:");
    double width = input.nextDouble();

    Rectangle  Perimeter = new Rectangle(length, width);
    Perimeter.getPerimeter();
    Rectangle  Area = new Rectangle(length, width);
    Area.getArea();

    System.out.printf("Area: %.1f, Perimeter: %.1f",Rectangle.getArea(),Rectangle.getPerimeter());

}

}

最终类矩形 {

private static double mLength;
private static double mWidth;

public Rectangle(double length, double width){
    mLength = length;
    mWidth = width;
}   
public double getLength(){
    return mLength;
}

public double getWidth(){
    return mWidth;
}

public static double getArea(){
    double area = mWidth*mLength;
    return area;    
}
public static double getPerimeter(){
    double perimeter = (mWidth*2)+(mLength*2);
    return perimeter;

}

}

【问题讨论】:

    标签: java class methods instantiation mutators


    【解决方案1】:

    创建一个具有长度和宽度的Rectangle 对象更有意义,因此通过传递lengthwidth 参数(由用户输入)使用重载的Rectangle 构造函数 )如下图:

    Rectangle  Perimeter = new Rectangle(length, width);
    

    构造函数 Rectangle() 未定义。有人可以帮忙吗?

    重要的一点是,当你有一个像 Rectangle 类中的重载构造函数时(没有默认的构造函数,即没有编写参数构造函数),你不能使用 new Rectangle(); 创建对象,这是因为编译器不会自动为您添加默认构造器。我建议查看here 了解更多详情。

    另外,如果你想打印带有lengthwidth细节的Rectangle对象,你需要overridetoString()方法从java.lang.Object方法,如下所示:

    public class Rectangle {
    
        private double mLength;
    
        private double mWidth;
    
        //add your code here as is
    
        @Override
        public String toString() {
            return "Rectangle [mLength=" + mLength + ", mWidth=" + mWidth + "]";
        }
    }
    

    【讨论】:

    • 谢谢!我使用了您的建议,因为它与下面的 TheBakker 相同。如果您对我的打印输出也有任何建议,我将不胜感激!查看他的帖子上的评论...
    • 谢谢...我明白了,但我必须将我的 getArea 和 getPerimeter 更改为静态。似乎没有引起任何问题,但你能解释一下原因吗?
    【解决方案2】:

    如果没有显式编写构造函数,编译器会提供默认构造函数。

    但是如果你在类中显式地编写任何构造函数,那么无论何时调用构造函数,无论是无参数还是有参数,它总是会在类中寻找显式定义的构造函数。

    而且,这在逻辑上是正确的,因为如果你想阻止创建没有任何数据的对象,那么添加一个带参数的构造函数是可行的方法。

    因此,要么在 Rectangle 中显式编写无参数构造函数并使用 setter 设置其属性,要么仅在方法中使用参数构造函数。


    向 Rectangle.class 添加一个空的构造函数:

    public Rectangle() {
    
    } 
    

    或者在你的方法中使用带参数声明的构造函数

    Rectangle rectangle = new Rectangle(length, width);
    

    在您的情况下,您错误地使用了矩形对象。 我想你想做的是这样的:

    Rectangle  rectangle = new Rectangle(length , width );
    System.out.printf("Area: %.1f, Perimeter: %.1f",rectangle.getArea() ,rectangle.getPerimeter());
    

    【讨论】:

    • 或者,如果可以的话,删除设置器并将参数传递给构造函数调用
    • 我在尝试这两个选项时收到 Formatter 错误。有什么建议吗?你还需要更多的东西吗...
    • 我在没有使用“printf”的情况下对其进行了测试。它试图打印区域和周长的内存位置而不是实际值。我删除了我的设置器并改为传递参数,但不确定它为什么要打印该输出。示例:面积:矩形@211d0a4f 周长:矩形@798fd984
    • 打印默认的 toString() 方法,它是 Rectangle 对象的引用。我想你想做的是:Rectangle rectangle = new Rectangle(length , width ); System.out.printf("Area: %.1f, Perimeter: %.1f",rectangle.getArea() ,rectangle.getPerimeter());
    • 当我以某种方式调用 Area.getArea() 时,我可以将其连接起来吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    相关资源
    最近更新 更多