2014-03-29 79 views
-1

我正在製作第二個程序,並決定嘗試製作一個存儲值的程序,然後允許在其他方法或其他類中調用它們。然後我嘗試用this.arguement語法添加所有這些值,但沒有成功。另一個包含「this」關鍵字的擴展程序

所有this.args都產生了同樣的錯誤,「錯誤:無法找到符號」線39

什麼有錯?

class students 
{ 
    public void students() 
    { 
     String strgirl = "Jenna"; 
     String strboy = "Tommy"; 
    } 
} 

class math extends students 
{ 
    public void studentsmath() 
    { 
     double tommymath = 88.49; 
     double jennamath = 91.15; 
    } 
} 

class english extends math 
{ 
    public void studentsenglish() 
    { 
     double tommyenglish = 91.5; 
     double jennaenglish = 89.18; 
    } 
} 

class science extends english 
{ 
    public void studentsscience() 
    { 
     double tommyscience = 70.11; 
     double jennascience = 96.1; 
    } 
} 

class averagetotal extends science 
{ 
    public void averagetotal() 
    { 
     double total; 
     this.tommymath + this.jennamath + this.tommyenglish + this.jennaenglish + this.tommyscience + this.jennascience = total; 
     System.out.println(total); 
     double average; 
     average = (total/6); 
    } 
} 
+0

你的變量不是類字段。查找「範圍」。 –

+1

對於'this'這個關鍵詞,請參考:http://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html – yellowB

回答

0

什麼是錯的是你被this試圖參考變量是局部變量。請參閱http://www.coderanch.com/t/416862/java/java/Difference-Variable-Field

你需要做的是將聲明放在主類主體和方法主體之外。

即,代替

class students { 
public void students() 
{ 
    String strgirl = "Jenna"; 
    String strboy = "Tommy"; 
} 

}

使用

class students{ 
    String strgirl = "Jenna"; 
    String strboy = "Tommy"; 
} 
+0

好吧,但是,也許我被錯誤地教了,但我認爲類不能直線上升代碼在他們?我認爲這是類/方法/ THEN代碼。 – Dont

+0

@Dont'String strgirl =「Jenna」;'不是真正的「代碼」。這是一個初始化器的變量聲明。如果你說'String strgirl; strgirl =「Jenna」;'第二個陳述將是一個賦值語句,它將是不能直接出現在類中的代碼。 – ajb

0

您正在聲明在函數studentsscience()可變tommysciencescience類。 tommyscience僅當studentsscience()被調用時才存在,並在該功能完成時停止存在。 tommysciencescope僅限於該功能。

因此,試圖在averagetotal類使用它不能正常工作,因爲變量,至於averagetotal()構造而言tommyscience不存在。這是與jennaenglish,jennamath,jennascience,tommyenglishtommymath相同的問題;

這就是爲什麼你得到symbol not found編譯器錯誤。

另外:

  • 你真的應該考慮資本類名需要
  • voidaveragetotal()構造函數之前(在所有類別)被淘汰。這是合法的,但這不是你想要的。當你這樣做的時候,所有的構造函數都會依次執行(實例化一個new averagetotal()將按以下順序執行構造函數:averagetotalscienceenglishmathstudents),但在修復變量範圍問題之前,你仍然無法訪問任何變量,只要你想。
  • 你的課沒有國家。除了內部函數外,沒有其他變量。例如,不要將String strgirl = "Jenna";放入函數中,而是將其放在函數的外部,即類的頂部(在public class行和students構造函數之間)。

還有一些更基本的問題,但這些較小的應該讓你開始。

0

正如已經指出的那樣,您可以使用初始值設定項聲明成員字段。這可能更常見初始化它們的構造函數,雖然:

class math extends students 
{ 
    public double tommymath; 
    public double jennamath; 

    public math() 
    { 
     tommymath = 88.49; 
     jennamath = 91.15; 
    } 
} 

math()是一個構造,因爲它具有相同的名稱作爲類。當你說new math()時,它執行構造函數中的語句。關鍵是你在做而不是double這個詞或其他任何類型的名字放在構造函數中的tommymathjennamath之前。如果你這樣做,這將是一個新的局部變量具有相同的名稱,你不會初始化字段成員。

一兩件事:你寫它的樣子,你寫了一個方法,而不是一個構造函數:

class math extends students 
{ 
    public double tommymath; 
    public double jennamath; 

    public void studentsmath() 
    { 
     tommymath = 88.49; 
     jennamath = 91.15; 
    } 
} 

這是完全合法的,但是現在你確實有呼叫studentsmath方法,以得到變量tommymathjennamath初始化。我沒有看到代碼中studentsmath();被調用的任何地方。所以你可能會以0結束,而不是88.49或91.15。

相關問題