Non-static error method cannot be Reference

Asked

Viewed 2,248 times

3

I’m having a problem:

non Static method write cannot be referenced from a Static context.

I tried to change the function to static, however, there gives it problem of:

non Static variable

This is the class Personagem in my code:

import java.util.Random;

class Personagem extends Atributos
{

    //ATRIBUTOS

    public static String nome;
    public static String classe; 
    public static int defesa;
    public static int critico;
    public static int danoMinimo; 
    public static int danoMaximo; 
    public static int healthPoints;
    public static int manaPoints; 


    //CONSTRUTOR

    public Personagem ()
    {
        this.nome = ""; 
        this.classe = "Mago"; 
        this.vitalidade = 10;
        this.armadura = 10; 
        this.forca = 10;
        this.inteligencia = 10;
        this.agilidade = 10; 
        this.sorte = 10; 
        this.defesa = 10 + this.armadura; 
        this.critico = this.sorte / 100; 
        this.healthPoints = 100;
        this.manaPoints = 100; 
        this.danoMinimo = 10;
        this.danoMaximo = 20; 
    }

    //SETTERS 

    public void setNome (String nome)
    {
        this.nome = nome;
    }

    public void setClasse (String classe)
    {
        this.classe = classe;
    }

    public void setDefesa (int defesa)
    {
        this.defesa = defesa;
    }

    public void setCritico (int critico)
    {
        this.critico = critico; 
    }

    public void setHealthPoints (int healthPoints)
    {
        this.healthPoints = healthPoints;
    }

    public void setManaPoints (int manaPoints)
    {
        this.manaPoints = manaPoints;
    }

    public void setDanoMinimo (int danoMinimo)
    {
        this.danoMinimo = danoMinimo;
    }

    public void setDanoMaximo (int danoMaximo)
    {
        this.danoMaximo = danoMaximo; 
    }

    //GETTERS

    public String getNome ()
    {
        return this.nome;
    }

    public String getClasse ()
    {
        return this.classe;
    }

    public int getDefesa ()
    {
        return this.defesa;
    }

    public int getCritico ()
    {
        return this.critico; 
    }

    public int getHealthPoints ()
    {
        return this.healthPoints;
    }

    public int getManaPoints ()
    {
        return this.manaPoints; 
    }

    public int getDanoMinimo ()
    {
        return this.danoMinimo;
    }

    public int getDanoMaximo ()
    {
        return this.danoMaximo;
    }

    public void Ataque (Personagem inimigo)
    {
        Random rand = new Random();

        int ataque; 

        ataque = rand.nextInt(this.danoMaximo) + this.danoMinimo; 
        inimigo.recebeDano(ataque);

    }

    public void recebeDano (int ataque)
    {
        this.healthPoints = ataque - defesa;

    }

}

And that’s the class Partida:

import java.util.Scanner;
import java.util.Random; 

class Partida 
{
    Scanner scanf = new Scanner(System.in);
    Random  rand  = new Random();

    Personagem jogador = new Personagem(); 
    Personagem inimigo = new Personagem(); 

    public static void main(String[] args)
    {
        Introducao();
        telaPersonagem();
        chamaTurno();
        jogadorTurno();
        cpuTurno();
        vitoria();

    }

    public static void Introducao ()
    {
        System.out.println("SEJA BEM-VINDO A ARENA, GUERREIRO! DIGA-NOS SEU NOME: "); 
        jogador.setNome("LUCAS"); 
        inimigo.setNome("CPU"); 

    }

    public void telaPersonagem() // MOSTRA A TELA COM INFORMAÇÕES DOS PERSONAGENS 
    {
        System.out.println("NOME: " + jogador.getNome() + "                 NOME:" + inimigo.getNome());
        System.out.println("HP: " + jogador.getHealthPoints() + "               HP: "  + inimigo.getHealthPoints());
        System.out.println("MP: " + jogador.getManaPoints() + "                 MP: "  + inimigo.getManaPoints());

    }

    public void chamaTurno() 
    {

        int jogadorAgi; 
        int cpuAgi; 

        do
        {

        jogadorAgi = rand.nextInt(1) + jogador.getAgilidade(); 
        cpuAgi = rand.nextInt(1) + inimigo.getAgilidade(); 

            if(jogadorAgi > cpuAgi)
            {
                jogadorTurno(); 

            } else
            {
                cpuTurno();

            }

        } while(jogadorAgi != cpuAgi);

    }

    public void jogadorTurno()
    {
        int acao; 

        do
        {

            System.out.println("SEU TURNO"); 
            System.out.println(""); 
            System.out.println("Escolha uma ação"); 
            System.out.println("1 - Atacar"); 
            System.out.println("2 - Atacar forte"); 
            System.out.println("3 - Atacar FORTE MESMO"); 
            acao = scanf.nextInt(); 

            switch(acao)
            {
                case 1 : 
                    jogador.Ataque(inimigo);
                    System.out.println("Ataque realizado com sucesso"); 
                    chamaTurno(); 
                    break; 

                default : 
                    System.out.println("Digite um comando válido"); 
            }   

        } while(jogador.healthPoints != 0); 

    }

    public void cpuTurno()
    {
        int acao; 

        acao = rand.nextInt(1) + 3;

        System.out.println("TURNO INIMIGO"); 

        do
        {
            switch (acao)
            {
                case 1:
                    inimigo.Ataque(jogador); 
                    System.out.println("Você é atacado com sucesso"); 
                    chamaTurno();
                    break;

                case 2: 
                    inimigo.Ataque(jogador); 
                    System.out.println("Você é atacado com sucesso"); 
                    chamaTurno(); 
                    break;

                case 3:
                    inimigo.Ataque(jogador); 
                    System.out.println("Você é atacado com sucesso"); 
                    chamaTurno(); 
                    break;
            }
        } while(inimigo.healthPoints != 0);

    }

    public void vitoria()
    {
        if(jogador.healthPoints == 0)
        {
            System.out.println("Você perdeu!");
        }

        if(inimigo.healthPoints == 0)
        {
            System.out.println("Você venceu!");
        }
    }

}

1 answer

3


This happens because you have these two lines out of the method main:

Personagem jogador = new Personagem(); 
Personagem inimigo = new Personagem();

When a class is instantiated (i.e., created with new), its variables are by definition nonstatic (since they are specific to that particular instantiated object), hence the error.

Move these two lines inside the main. Put in also the other two lines. You just need these objects while the method main is running, they do not need (nor should) be class variables.

  • I did this, only in this case I do not recognize the other instantiated objects, but I’ve solved the problem by making them static already! Thank you very much!

  • Mark the answer as correct to help colleagues who have the same question as you.

  • 1

    Right! Thank you very much!

Browser other questions tagged

You are not signed in. Login or sign up in order to post.