Um erro no this...ora vejam...!

9 respostas
P
public class Numero
 {
    private int num;
 
    public Numero(int num)
    {
        this.num = num;
    }
 
    public void setNum(int num)
    {
         this.num = num;
    }
 
    public int getNum()
    {
        return num; // não é necessário o this
    }
   
    public static void main(String[] args)
    {
        int a;
        a=this.num;
        //int a=this.num; //ver!!
        Numero n = new Numero(a); // cria um nome Numero com valor 10
        System.out.println(n.getNum()); // imprime o valor de n (10)
        n.setNum(a); // seta o valor de num para 20
        System.out.println(n.getNum()); // imprime o valor de n (20)
    }
 }

Dentro no main temos o:
int a;
a=this.num;
Que quero dizer com estas 2 linhas, que o a guarda o valor da variavel de instancia num, certo? Assim valores alterados pelo utilizador ficarao no num, que por sua vez fica no a, certo?

A ideia é ao excutar a main imprimir os valores mudados pelo utilizador.
Dá erro na linha a=this.num;

Que será?

9 Respostas

peczenyj

Simples: o método main é de contexto estático (static)

Explicação: uma classe pode ter atributos e métodos estáticos, isso significa que podem ser acessados diretamente, sem precisar instanciar um objeto para isso. Dentro do contexto estático a palavra reservada this não faz sentido, pois o this é um ponteiro para a instancia atual da classe. Como não há instancia…

Por que precisamos de método estáticos? Imagina criar um objeto pra tudo! Pra imprimir, pra calcular o cosseno, etc… não precisa. Pra que ter 58769348 objetos no mesmo programa acessando o mesmo código repetidamente? Tcharam, métodos estáticos.

Math.cos(0.0); // acessa a classe Math diretamente

System.out.println(“hello o mundo”); /* a classe System possui um PrintStream estatico chamado out – que possui um método chamado println() */

Sacou?

Deh

Exception in thread “main” java.lang.Error: Unresolved compilation problem:
Cannot use this in a static context

at Numero.main(Numero.java:23)

Ou seja, não se pode usar this em um contexto estático =p

diego2005

Complementado o que os amigos falaram, static significa que o atributo pertence a classe e não a uma instância específica, por exemplo:

public class Teste
{
    static String s1 = "Static";
    String s2 = "Nao Static"

    public static void main(String[] args)
    {
        System.out.println(Teste.s1); // ok
        System.out.println(Teste.s2); // erro
        System.out.println(new Teste().s2); // ok
    }
}

O mesmo vale para métodos....

P
Entendi mais ou menos! Retirei o static da main e ja compila, mas se quiser correr a main n consigo! Fica assim pra compilar:
public class Numero
 {
    private int num;
 
    public Numero(int num)
    {
        this.num = num;
    }
 
    public void setNum(int num)
    {
         this.num = num;
    }
 
    public int getNum()
    {
        return num; // não é necessário o this
    }
   
    public void main(String[] args) //sai o static
    {
        
        //int a=getNum();
        //a=(this.num);
        int a=this.num; //ver!!
        Numero n = new Numero(num); // 
        System.out.println(n.getNum()); // 
        n.setNum(num); // 
        System.out.println(n.getNum()); // 
    }
 }

Compila, mas se invocar o metodo main nao aparece nada!

Deh

ele vai compilar normalmente…

pois public void main(String args[]) { }

é um método qualquer!

quando você for executar um programa

ele vai procurar por um

public static void main(String args[]) { }

acho que isso responde =]

P
A questao é como posso compilar o programa e por o main a funcionar? E a funcionar de modo a que a main imprime os resultados que o utilizador vai mundano!
public class Numero
  {
     private int num;
  
     public Numero(int num)
     {
         this.num = num;
     }
  
     public void setNum(int num)
     {
          this.num = num;
     }
  
     public int getNum()
     {
         return num; // não é necessário o this
     }
    
     public void main(String[] args) //sai o static
     {
         
         //int a=getNum();
         //a=(this.num);
         int a=this.num; //ver!!
         Numero n = new Numero(num); // 
         System.out.println(n.getNum()); // 
         n.setNum(num); // 
         System.out.println(n.getNum()); // 
     }
  }

Se fizer setNum e meter 10, a main há mostrar 10, se de seguida mudar pra 14 a main ha-de mostrar 14, certo? Mas como? Não tou vendo visto q pra compilar tive de tirar o static.
Eu pus int a=this.num; pra querer dizer q a guardara o valor da variavel de instancia que é a variavel usada pelos metodos setNum e getNum.
Que acham?

peczenyj

chame esse seu metodo main de outra coisa. Principal por exemplo.

no metodo publico (public), estático (static), que não retorna nada (void) chamado main que tem como argumento um array de Strings vc faça:

Numero n = new Numero();
n.Principal();

ou

new Numero().Principal();

pronto, vc fez o teste que vc quer :wink:

P

public static void Principal(String[] args) { new Numero().Principal(); //int a=getNum(); //a=(this.num); int a=this.num; //ver!! Numero n = new Numero(num); // cria um nome Numero com valor 10 System.out.println(n.getNum()); // imprime o valor de n (10) n.setNum(num); // seta o valor de num para 20 System.out.println(n.getNum()); // imprime o valor de n (20) }

Dá erro! Cannot find symbol, constructor Numero.
Que será?

peczenyj

Ah

Falta declarar um construtor sem argumentos para fazer dessa forma.

Ah o velho construtor default que desaparece se vc declarar algum construtor…

Criado 16 de outubro de 2006
Ultima resposta 17 de out. de 2006
Respostas 9
Participantes 4