[英]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.