繁体   English   中英

在Java和变量中没有主要方法的程序

[英]Programs without a main method in java and variables

这是我正在编写的程序的一部分:

public class Triangle {
double a, b, c;
private boolean t,s,r,e,i;
String Triangle, Scalene, Right;
public Triangle(double a, double b, double c) {
    //I dont know what to put here...
    System.out.print(a + " " + b + " " + c);

}
public boolean isTriangle() {
    t = true;
    System.out.print(a + " " + b + " " + c);
    if(a + b > c) {
        if(a + c > b) {
            if(b + c > a) {
                //boolean remains true
                t = true;
            }
        }
    }
    else {
        //boolean is false
        t = false;
    }
    return t;
}

我遇到的问题是,即使变量在类中声明,我的变量数据也不会从一种方法转移到另一种方法。 我的部分任务是使用bluej(它是可怕的程序),这就是我输入数据的方式。 打印语句显示我输入的数据存储在方法:Triangle中的变量中,但不存储在方法:isTriangle中。 编译器也不会让我使用return a; 或类似的东西。 我究竟做错了什么?

如果您从已声明的构造函数中设置全局类字段,则引用它们的每个方法都将使用a,b,c。

public class Triangle {
double a = 0.0;
double b = 0.0;
double c = 0.0;
private boolean t,s,r,e,i;
String Triangle, Scalene, Right;
public Triangle(double a, double b, double c) {
    this.a = a;
    this.b = b;
    this.c = c;
    System.out.print(a + " " + b + " " + c);

}
public boolean isTriangle() {
    t = true;
    System.out.print(a + " " + b + " " + c);
    if(a + b > c) {
        if(a + c > b) {
            if(b + c > a) {
                //boolean remains true
                t = true;
            }
        }
    }
    else {
        //boolean is false
        t = false;
    }
    return t;
}

如下更改您的构造函数代码

public Triangle(double a, double b, double c) {

    this.a = a;
    this.b = b;
    this.c = c;

    //I dont know what to put here...
    System.out.print(a + " " + b + " " + c);

}

一旦在构造函数中收到,您需要在类变量中设置值。

我遇到的问题是,即使变量在类中声明,我的变量数据也不会从一种方法转移到另一种方法。

让我们看一下代码

double a, b, c;

public Triangle(double a, double b, double c) {
    //I dont know what to put here...
    System.out.print(a + " " + b + " " + c);
}

在上述版本中,构造函数中的abc的值不会转移到构造函数中的abc字段。

为什么? 因为它们是不同的变量。 构造函数的参数是构造函数的局部变量(就像方法的参数一样)。 当构造函数结束时,它们消失了。 在这种情况下,您为两组变量使用了相同的名称,但这并没有使它们成为相同的变量。

要在各个值之间进行传递,您需要分配它们。 但这引起了第二个问题。 你命名的构造函数参数的方式,他们的阴影相应的字段名称。 换句话说,在构造函数中,标识符a引用参数而不是字段。 所以a = a; 实际上是其自身的a参数值。 相反,您需要使用this来限定对已阴影字段的引用。 苏斯

public Triangle(double a, double b, double c) {
    this.a = a;
    this.b = b;
    this.c = c;
}

打印语句显示我输入的数据存储在方法:Triangle中的变量中,但不存储在方法:isTriangle中。

实际上,这不是所显示的。 构造函数中的print语句实际上是在打印参数 abc 再次阴影。


编译器也不会让我使用return a; 或类似的东西。 我究竟做错了什么?

目前尚不清楚您要在何处(或为什么)将return a; ,但在该课程中不起作用。

  • 如果您试图将该语句放入构造函数中,构造函数将永远无法返回值。

  • 如果您尝试将其放入isTriangle方法中,则该方法将无效,因为该方法的返回类型为boolean not double


现在,我想谈谈您的代码中的其他一些错误(按书面规定)

double a, b, c;

这是一个糟糕的设计选择。 除非您有充分的理由这样做,否则应将所有变量声明为private 如果您不这样做,那么您的Triangle类将是“泄漏抽象”。 在一个很小的应用程序中这无关紧要,但是在一个更大的问题中,您可以让其他类读取或修改Triangle的这些字段的值。

  • 修改另一个类中的字段可能会破坏Triangle ,而在一个大型而复杂的类中,可能很难找到中断发生的位置。
  • 即使某个其他类仅读取非私有字段,这也意味着您在Triangle类和另一个或多个其他类之间具有有害的依赖关系(“耦合”)。

下一个:

String Triangle, Scalene, Right;

与上述相同的问题,另外一个(实际上是两个)。 变量/字段的名称应以小写字母开头。 诸如TriangleScaleneRight类的名称仅应用于类。 (另一个问题是您已经有了一个名为Triangle的类,它将使生活变得“有趣”。)

最后:

private boolean t ...

这实际上是非常错误的 在你的代码, t是正在内使用isTriangle方法来保存工作变量。 不应将其声明为字段。 在该方法中应将其声明为局部变量。

为什么? 两个原因:

  1. 通过将字段isTriangle t而不是在isTriangle方法中声明的局部变量,将导致该字段在Triangle对象的生存isTriangle被保留。 这是一个(很小的)空间浪费,因为在isInstance调用期间仅(当前)需要该变量。

  2. 这是更重要的原因。 通过使用字段来保存此局部变量,可以使isTriangle方法不可重入。

    • 如果代码有些不同,并且isTriangle调用了本身(以一种有用的方式),则对isTriangle的嵌套调用将isTriangle调用者的t副本。

    • 如果代码有些不同, isTriangle可以从多个线程中调用isTriangle ,则一个线程的调用可能会践踏另一线程正在使用的t值。

    这些事情可能发生的事实意味着您简单的Triangle类突然变得更加难以理解。 在确保应用程序正确并保持这种状态之前,您需要考虑更多事项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM