簡體   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