Problemas com uma classe Pilha

Estou tentando instanciar um objeto da classe Pilha que eu criei.

    public class Pilha{
public ArrayList <Integer> data; // declara a pilha, apenas

public Pilha(int tamanho){
    data = new ArrayList<Integer>(); // inicializa a pilha com o tamanho informado
}

public void Push(Integer elm){
    data.add(elm); // adiciona o elemento informado ao topo
}

public Integer Pop(){
    if(data.size() == 0){
      throw new IllegalStateException("Pilha vazia. ");
    }
    return data.remove((data.size() - 1)); // remove o elemento no indice do topo
}

public Integer Top(){
    if(data.size() == 0){
      throw new IllegalStateException("Pilha vazia. ");
    }
    return data.get(data.size() - 1); // retorna o topo da pilha
}

public boolean isEmpty(){
    return data.isEmpty(); // retorna se está vazia
}

public int Size(){
  return data.size(); // retorna o numero de elementos no ArrayList
}

}

Criei um menuzinho na main pra testar essa classe, mas acontece um erro nesta terceira linha:

System.out.println("Bem vindo! insira o tamanho da pilha: ");
tamanho = input.nextInt();
Pilha stack = new Pilha(tamanho);          // erro

o erro é o non-static variable this cannot be referenced from a static context

Não consigo identificar a solução. Podem me ajudar?

Sem colocar a classe main inteira, não tem como saber corretamente.
Mas, acredito que você tenha um atributo chamado “tamanho” que não é estático.

Consegui resolver o problema. Mudei a classe para static e rodou.

public class Teste {
public static void main(String[] args){

  int tamanho;
  int choice;
  int aux;
  boolean check;

  Scanner input = new Scanner(System.in);
  System.out.println("Bem vindo! insira o tamanho da pilha: ");
  tamanho = input.nextInt();
  Pilha stack = new Pilha(tamanho);


  do{
      System.out.println("Escolha uma opcao; ");
      System.out.println("1 - Inserir elemento; ");
      System.out.println("2 - Remover elemento; ");
      System.out.println("3 - Consultar topo da pilha; ");
      System.out.println("4 - Verificar se esta vazia; ");
      System.out.println("5 - Tamanho da pilha; ");
      System.out.println("6 - Sair; ");

      choice = input.nextInt();
      switch(choice){
        case 1: // PUSH
            int elm;
            System.out.print("digite o elemento que deseja inserir: ");
            elm = input.nextInt();
            stack.Push(elm);
            break;
        case 2: // POP
            aux = stack.Pop();
            System.out.println("Elemento " + aux + " removido!");
            break;
        case 3: // Top
            aux = stack.Top();
            System.out.println("Topo atual: " + aux);
            break;
        case 4: // isEmpty
            check = stack.isEmpty();
            System.out.println("Pilha vazia: " + check);
            break;
        case 5: // Size
            aux = stack.Size();
            System.out.println("Tamanho atual da pilha: " + aux);
            break;
        case 6:
            break;
      }
  }while(choice != 6);
}



public static class Pilha{
    private ArrayList <Integer> data; // declara a pilha, apenas
  
    public Pilha(int tamanho){
               data = new ArrayList(tamanho); // inicializa a pilha com o tamanho informado
    }

    public void Push(Integer elm){
             data.add(elm); // adiciona o elemento informado ao topo
    }

   public Integer Pop(){
            if(data.size() == 0){
                   throw new IllegalStateException("Pilha vazia. ");
            }
           return data.remove(data.size() - 1); // remove o elemento no indice do topo
   }

  public Integer Top(){
           if(data.size() == 0){
                 throw new IllegalStateException("Pilha vazia. ");
           }
          return data.get(data.size() - 1); // retorna o topo da pilha
  }

  public boolean isEmpty(){
         return data.isEmpty(); // retorna se está cheia
  }

  public int Size(){
        return data.size(); // retorna o numero de elementos no ArrayList
  }
}

}

Não sei se entendi corretamente o conceito da Pilha usando ArrayList em Java ou se implementei errado, pois a pilha ainda recebe elementos mesmo após ter excedido o tamanho (então esse atributo ficou inútil), mas pelo menos agora rodou. Já é um avanço.

É que normalmente não se usa arraylist para isso, afinal, este tipo de objeto possui alocação dinâmica de memória, o que significa que você tem como limite o total de memória disponível configurado para o java. O ideal seria vetor mesmo, que te limita a X posições.
Com arraylist, o ideal é ter uma variável de controle que limite o tamanho da lista. chegou aquele tamanho, impede a inserção de novos objetos.

Concordo com você, mas o professor exigiu que fosse utilizando ArrayList. Pra limitar o tamanho, eu usei o atributo tamanho, porém a pilha continua recebendo mesmo após o número de elementos ser igual ao limite (ela não sobescreve dado algum, apenas continua recebendo até o total de memória disponível kkk)

Mas aí é tua responsabilidade verificar o tamanho e impedir inserções após o limite ser atingido.

certo, isso é fácil de resolver. Obrigado