这是我写的程序的一部分:
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(它是可怕的程序),这就是我输入数据的方式。 print语句显示我输入的数据存储在方法中的变量中:Triangle,但不存储在方法中:isTriangle。编译器也不会让我使用return a;或类似的东西。我做错了什么?
答案 0 :(得分:1)
如果从已声明的构造函数中设置全局类字段,则引用它们的每个方法都将使用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;
}
答案 1 :(得分:1)
更改构造函数代码,如下所示
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);
}
您需要在构造函数中收到类变量中的值。
答案 2 :(得分:0)
我遇到的问题是我的变量数据不会从一个方法转移到另一个方法,即使变量是在类中声明的。
让我们看一下代码
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
个字段。
为什么呢?因为它们是不同的变量。构造函数的参数是构造函数的局部参数(就像方法的参数一样)。当构造函数结束时,它们会消失。在这种情况下,您对两组变量使用了相同的名称,但这并不能使它们成为相同的变量。
要使值传输到您之间,您需要分配它们。但这引发了第二个问题。您命名构造函数参数的方式是 shadowing 相应的字段名称。换句话说,在构造函数中,标识符a
指的是参数而不是字段。因此a = a;
实际上是a
参数的值。相反,您需要使用this
来限定对已被遮蔽的字段的引用。 Thuss
public Triangle(double a, double b, double c) {
this.a = a;
this.b = b;
this.c = c;
}
print语句显示我输入的数据存储在方法中的变量中:Triangle,但不存储在方法中:isTriangle。
实际上,这并不是它的表现。构造函数中的print语句实际上是打印参数 a
,b
和c
的值。再次遮蔽。
编译器也不会让我使用return a;或类似的东西。我做错了什么?
目前尚不清楚您试图放置return a;
的位置(或原因),但它不会在此课程中发挥作用。
如果您尝试将该语句放入构造函数中,构造函数永远不会返回值。
如果您尝试将其放入isTriangle
方法,则该方法无效,因为该方法的返回类型为boolean
而不是double
。< / p>
现在我想谈谈代码中的其他一些错误(如编写的那样)
double a, b, c;
这是一个糟糕的设计选择。除非你有充分的理由不这样做,否则你应该将所有变量声明为private
。如果你不这样做,那么你的Triangle
课程就会成为&#34;漏洞抽象&#34;。它在一个小应用程序中并不重要,但在一个更大的问题中,您可以让其他类读取或修改Triangle
的这些字段的值。
Triangle
中断,而在大型复杂的类中,很难找到发生破损的位置。Triangle
类和其他类或类之间存在不需要的依赖关系(&#34;耦合&#34;)。 下一步:
String Triangle, Scalene, Right;
与上面相同的问题,另一个(实际上是两个)。变量/字段的名称应以小写字母开头。 Triangle
,Scalene
和Right
等名称只能用于类。 (另一个问题是你已经有一个名为Triangle
的课程......这会使生活变得有趣并且#34 ;.
最后:
private boolean t ...
这实际上是非常错误。在您的代码中,t
方法中正在使用isTriangle
来保存工作变量。它不应该声明为字段。它应该在该方法中声明为局部变量。
为什么呢?有两个原因:
通过使t
字段而不是isTriangle
方法中声明的局部变量,您将导致该字段在Triangle
对象的生命周期内保留。这是一个(小)浪费的空间,因为isInstance
电话的持续时间(目前)只需要变量。
这是更重要的原因。通过使用字段来保存此局部变量,您已使isTriangle
方法不可重入。
如果代码有点不同并且isTriangle
调用自身(以有用的方式),则对isTriangle
的嵌套调用将践踏调用者的{{{{{{{ 1}}。
如果代码有点不同并且可以从多个线程调用t
,那么一个线程的调用可能会践踏另一个线程正在使用的isTriangle
值。
这些事情可能发生的事实意味着您的简单t
课程突然变得更难以理解。在确定您的申请是正确的之前,您需要考虑更多的事情,并保持这种状态。