[英]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);
}
在上述版本中,构造函数中的a
, b
和c
的值不会转移到构造函数中的a
, b
和c
字段。
为什么? 因为它们是不同的变量。 构造函数的参数是构造函数的局部变量(就像方法的参数一样)。 当构造函数结束时,它们消失了。 在这种情况下,您为两组变量使用了相同的名称,但这并没有使它们成为相同的变量。
要在各个值之间进行传递,您需要分配它们。 但这引起了第二个问题。 你命名的构造函数参数的方式,他们的阴影相应的字段名称。 换句话说,在构造函数中,标识符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语句实际上是在打印参数 a
, b
和c
。 再次阴影。
编译器也不会让我使用return a; 或类似的东西。 我究竟做错了什么?
目前尚不清楚您要在何处(或为什么)将return a;
,但在该课程中不起作用。
如果您试图将该语句放入构造函数中,构造函数将永远无法返回值。
如果您尝试将其放入isTriangle
方法中,则该方法将无效,因为该方法的返回类型为boolean
not double
。
现在,我想谈谈您的代码中的其他一些错误(按书面规定)
double a, b, c;
这是一个糟糕的设计选择。 除非您有充分的理由这样做,否则应将所有变量声明为private
。 如果您不这样做,那么您的Triangle
类将是“泄漏抽象”。 在一个很小的应用程序中这无关紧要,但是在一个更大的问题中,您可以让其他类读取或修改Triangle
的这些字段的值。
Triangle
,而在一个大型而复杂的类中,可能很难找到中断发生的位置。 Triangle
类和另一个或多个其他类之间具有有害的依赖关系(“耦合”)。 下一个:
String Triangle, Scalene, Right;
与上述相同的问题,另外一个(实际上是两个)。 变量/字段的名称应以小写字母开头。 诸如Triangle
, Scalene
和Right
类的名称仅应用于类。 (另一个问题是您已经有了一个名为Triangle
的类,它将使生活变得“有趣”。)
最后:
private boolean t ...
这实际上是非常错误的 。 在你的代码, t
是正在内使用isTriangle
方法来保存工作变量。 不应将其声明为字段。 在该方法中应将其声明为局部变量。
为什么? 两个原因:
通过将字段isTriangle
t
而不是在isTriangle
方法中声明的局部变量,将导致该字段在Triangle
对象的生存isTriangle
被保留。 这是一个(很小的)空间浪费,因为在isInstance
调用期间仅(当前)需要该变量。
这是更重要的原因。 通过使用字段来保存此局部变量,可以使isTriangle
方法不可重入。
如果代码有些不同,并且isTriangle
调用了本身(以一种有用的方式),则对isTriangle
的嵌套调用将isTriangle
调用者的t
副本。
如果代码有些不同, isTriangle
可以从多个线程中调用isTriangle
,则一个线程的调用可能会践踏另一线程正在使用的t
值。
这些事情可能发生的事实意味着您简单的Triangle
类突然变得更加难以理解。 在确保应用程序正确并保持这种状态之前,您需要考虑更多事项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.