2014-03-29 4 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', pls ref: 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

Хорошо, но, может быть, меня учили неправильно, но я думал, что занятия не могут быть прямо вверх код в них? Я думал, что это код Class/method/THEN. – Dont

+0

@Dont 'String strgirl =" Jenna ";' на самом деле не "код". Это объявление переменной с инициализатором. Если вы сказали 'String strgirl; strgirl = "Jenna"; второй оператор будет оператором присваивания, который должен быть кодом, который не может отображаться непосредственно в классе. – ajb

0

Вы объявляете в функции studentsscience() переменной tommyscience в классе science. tommyscience существует только тогда, когда studentsscience() вызывается и останавливается, когда эта функция завершена. tommysciencescope является локальным только для этой функции.

Поэтому, пытаясь использовать его в averagetotal классе не может работать, так как переменная, насколько averagetotal() конструктор обеспокоенtommyscience не существует. Это та же проблема, что и у jennaenglish, jennamath, jennascience, tommyenglish и tommymath;

Вот почему вы получаете ошибки компилятора symbol not found.

также:

  • Вы действительно должны рассмотреть прописные буквы имен классов
  • void до averagetotal() конструктора (и во всех классах) должны быть устранено. Это законно, но это не то, что вы хотите. Когда вы сделаете это, все конструкторы будут выполнены, в своей очереди (инстанцирование new averagetotal() выполнят конструкторы в следующем порядке: averagetotal ->science ->english ->math ->students), но пока вы не исправить вашу переменную проблемы рамочной, вы» по-прежнему не имеют доступа к какой-либо переменной, как вы хотите.
  • У ваших классов нет состояния. Нет никакой переменной, кроме внутренних функций. Например, вместо того, чтобы помещать 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 или любое другое имя до tommymath и jennamath в конструктор. Если бы вы это сделали, это была бы локальная переменная с тем же именем, и вы бы не инициализировали член поля.

еще одно: То, как вы написали, вы написали метод вместо конструктора:

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

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

Это совершенно законно, но теперь вы на самом деле должны вызоваstudentsmath метод для того, чтобы получить переменные tommymath и jennamath инициализирован. И я не видел нигде в вашем коде, где был вызван studentsmath();. Таким образом, вы, вероятно, закончили бы с 0, вместо 88.49 или 91.15.

Смежные вопросы