2014-03-29 27 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。

相关问题