2015-10-03 2 views
-2

Код, который вы видите здесь, несколько недостроен; но я пытаюсь проверить функцию push и pop. Однако я продолжаю получать сообщение об ошибке:Почему main (String [] args) не принимает это?

Невозможно сделать статическую ссылку на стек нестатического поля.

import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.NoSuchElementException; 

class IntegerStackGeneric extends IntegerStack { 
    ArrayList<Integer> stack; 

    IntegerStackGeneric() { 
     stack = new ArrayList<>(); 
    } 

    public void push(int x) { 
     stack.add(x); 
     return; 
    } 

    public int pop() throws NoSuchElementException { 
     if(!stack.isEmpty()) { 
      throw new NoSuchElementException("IntegerStackGeneric: pop()"); 
     } 
     return stack.remove(stack.size()-1); 
    } 

    public int size() { 
     return stack.size(); 
     // return -1; 
    } 

    public boolean contains(int x) { 
     return false; 
    } 

    public void reverse() { 
     return; 
    } 

    public Iterator<Integer> iterator() { 
     return new ArrayList<Integer>().iterator(); 
    } 

    public static void main(String[] args) { 
     stack.push(1); 
     stack.push(2); 
     stack.push(3); 
     System.out.println(stack); 
     System.out.println(stack.pop()); 
     System.out.println(stack); 
    } 
} 

Кто-нибудь есть какие-нибудь идеи?

+1

вы смотрели на другие вопросы о статических ссылок на не-го атичные поля? –

+0

'ArrayList stack;' является нестатическим полем, но 'main()' выполняется в статической среде. Сначала вам нужно создать объект IntegerStackGeneric, чтобы получить доступ к полю экземпляра. – GiantTree

+1

Runnable classes вызываются без получения экземпляра непосредственно из основного метода. Таким образом, это означает, что у него есть «нулевой» экземпляр. Статические методы можно вызывать из других классов (если они являются общедоступными или вызываемыми), не получая экземпляр. Если вы определяете переменную из статического метода, как здесь, то вы должны иметь тот же модификатор, что и статический, чтобы вызвать его. Также вы должны инициализировать. –

ответ

1

Ответ прямо в сообщении об ошибке:

Не удается сделать статическую ссылку на стек без статического поля.

Ваше stack поле является экземпляр поле. main - это метод static, в этом месте нет экземпляра. Если вы хотите использовать stack, вам нужен экземпляр, например:

IntegerStackGeneric isg = new IntegerStackGeneric(); 
isg.stack.push(/*...*/); 

Вы, вероятно, хотите поставить свою логику в экземпляр метода вы звоните из main, а не непосредственно в main хотя:

IntegerStackGeneric isg = new IntegerStackGeneric(); 
isg.doStuff(); 

И:

private void doStuff() { 

    stack.push(1); 
    stack.push(2); 
    stack.push(3); 
    System.out.println(stack); 
    System.out.println(stack.pop()); 
    System.out.println(stack); 
} 
+0

Я действительно должен был знать, что это был дубликат, изменил ответ на нерепрессивный CW. –

+0

Я не совсем уверен, что понимаю; У меня уже есть IntegerStackGeneric(), я переместил материал в main на «doStuff», как вы предложили. Но это дает мне ту же ошибку, но теперь в doStuff() – Jacklyn

+0

@Jacklyn: 'IntegerStackGeneric()' в вашем коде является * конструктором *, а не выражением, создающим экземпляр. (Чтобы быть последним, он должен был быть внутри чего-то [метода, например], и иметь перед ним «новый».) Я предлагаю работать с некоторыми учебниками по Java, [например, это на классах и объектах] (https: // Docs.oracle.com/javase/tutorial/java/javaOO/index.html). –

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