2013-10-11 3 views
-4

Я довольно новичок в Java, и у меня возникают проблемы с пониманием того, что я делаю неправильно. Вот краткое описание цели программы.Нестатическая переменная bankAcc не может ссылаться на статический контекст

  1. Сделайте банковский счет.
  2. Депозит 1000 в него.
  3. Вывод 400.
  4. Вывод 500.
  5. Распечатайте результаты и ожидаемые результаты.

Вот мой код. Продолжает говорить, что нестатическая переменная bankAcc не может ссылаться на статический контекст.

public class BankAccountTester 
    { 
     private double bankAcc; //Stores bankAcc balance 

     public void money(double deposit) 
     { 
      deposit= (1000); 

      int withdraw1 = -400; 
      int withdraw2= -500; 
      bankAcc= bankAcc + withdraw1 + withdraw2; 
     } 

     public double getbankAcc()//Returns value to bankAcc so it has new balance 
     { 
      return bankAcc; 
     } 

     //Prints out value and expected value 
     public static void main(String[] args){ 
      System.out.Println("My bank account has " + bankAcc); 
      System.out.Println("Expected is 100"); 
     } 
    } 
+0

Как вы думаете, а это значит? –

+0

Google - ваш друг. Вставьте сообщение об ошибке в google (и удалите переменную из сообщения), и вы получите десятки ответов. –

+0

Кроме того, нет 'System.out.Println'. Используйте среду IDE, такую ​​как Eclipse; это твой друг. – chrylis

ответ

0

main() является static метод т.е. не экземпляр класса связан с ним. Хотя bankAcc является членом экземпляра класса BankAccountTester и, следовательно, не может быть доступен без создания его экземпляра. Проверьте свою программу с экземпляром объекта доступен как:

public static void main(String[] args){ 
    BankAccountTester bat = new BankAccountTester(); 
    bat.deposit(0.0); 
    System.out.Println("My bank account has " + bat.getbankAcc()); 
    System.out.Println("Expected is 100"); 
} 

Также см here.

0

Когда вы пишете класс, есть два «аромата» содержимого класса. Static, который существует как глобальные свойства, привязанные к «классу» и нестатическому, который живет на отдельных объектах, которые вы создаете, используя это определение класса. Таким образом, ваш код -в Java- выглядит следующим образом:

  • объектов: private double bankAcc, public void money, public double getbankAcc
  • для глобального доступа класса: public static void main

статический код существует независимо от того, каких-либо объектов были созданы, поэтому вы не можете сообщить статическому методу, что он должен обращаться к переменной объекта: он не существует, насколько известно. Даже если вы создадите объект из этого класса, он будет локально иметь переменную, называемую backAcc, но она не является статически доступной.

Общий рецепт вы хотите следовать это:

public class Test { 
    private long whatever = 123456; 
    public Test() { 
     // real code goes here. 
     System.out.println("my whatever variable holds " + whatever); 
    } 
    public static void main(Sting[] args) { 
     // build an object based on the Test class. 
     // and let it handle everything else. 
     new Test(); 
    } 
} 

При компиляции и выполнения этого кода, класс Test будет иметь статический (= глобально отозваны) метод main, который строит фактический Test объект , Прежде чем вы это сделаете, есть объекты для работы, существует только определение класса. После того как вы создадите объект Test, он сможет сделать все, что вам нужно, красивым объектно-ориентированным способом.

0

Во-первых, static (повторно. Переменная) означает, что существует один глобальный экземпляр этой переменной для класс. Это противоречит просто private double bankAcc;, в котором говорится, что каждый экземпляр класса имеет свой собственный bankAcc.

Более конкретно к вашей проблеме, так как main является static, это не метод на экземплярBankAccountTester. Это означает, что когда вы пытаетесь распечатать bankAcc, вы пытаетесь получить доступ к нестатической переменной из статического контекста, что запрещено.

не видя, где именно вы используете money и getbankAcc, вы можете исправить это за счет изменения:

private double bankAcc;

к:

private static double bankAcc;

0

Переменная bankAcc является переменной экземпляра, значение что он существует только при создании экземпляра BankAccountTester (с использованием new BankAccountTester()). Поскольку вы вызываете его только из метода static main() без создания экземпляра, нет переменной bankAcc. Измените объявление на private static double bankAcc;, чтобы ваша программа работала.

0

С main является статическим методом, он может относиться только к статическим переменным и методам. Статическая переменная выглядит следующим образом:

private static double bankAcc; 

Как вы это написали, bankAcc является экземпляр переменной, означает, что он привязан к конкретному экземпляру BankAccountTester.

Поскольку у вас нет каких-либо экземпляров (т. Е. Вы не создали new BankAccountTester()), вы можете ссылаться только на статические части BankAccountTester.

0

Это базовая Java. Вот почему кто-то проголосовал за ваш вопрос. Но вот ответ.

В Java наиболее распространенным способом выполнения кода является ссылка на класс, который содержит основной метод при запуске JVM с помощью команды java. Например:

java com.me.MyClass 

Это запустит jvm и будет искать основной метод MyClass для выполнения. Примечание. Основной метод - статический.

С другой стороны, классы Java чаще всего определяют «классы». Это определение структуры объекта. Объект является экземпляром среды выполнения класса, в комплекте с собственной памятью. Поле bancAcc - поле экземпляра, а не статическое поле. Это означает, что каждый экземпляр объекта вашего класса BankAccountTester будет иметь собственную выделенную память для хранения значения bankAcc. Обратите внимание: это не существует, если вы не создаете ojbect.

Итак, в вашем коде вы не создали объект экземпляра. Вы можете сделать это с помощью нового конструктора, а затем ссылаться на bankAcc на этот экземпляр объекта; Заметьте, что нет bankAcc, если нет объекта экземпляра. Так . , ,

BankAccountTester accTester = new BankAccountTester(); 
accTester.bankAcc = 100.00; 
System.out.Println("My bank account has " + accTester.getBankAcc()); 

Обратите внимание, вы были смущены, потому что вы ошибочно полагаете, что существование основного метода в вашем классе есть что-то делать с классом, определенного в нем. Размещение основного здесь произвольно и не связано с вашим фактическим определением класса. Чтобы прояснить это в вашей голове, вы должны создать два класса, один из которых определяет банковский счет, а другой - ваш класс «bootstrapper».

Бутстраппер будет содержать ТОЛЬКО основной метод и будет создавать экземпляры объектов, определенные классами, найденными в отдельных файлах классов, и выполнять на них методы.

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