Metodos estaticos e variaveis de instancia

3 respostas
faeldix

segue o codigo:

package capitulo01;

import java.io.*;

public class Mae {

	public Mae(String a){
		System.out.println("Call Construct of Mother Class");
	}

}
package capitulo01;

public class Filho extends Mae {

	public static void metodo(){
		System.out.println("Metodo Called");
	}

	public Filho(String s){
		super("f");
	}

}
package capitulo01;

import other.*;
import java.util.*;
import java.io.*;

public class Main {

	public static void main(String[] args) {
		Mae mae = new Filho("");
		mae.metodo();
	}

}

isso nao funciona.. mesmo sendo um objeto do tipo Filho.. agora isso funciona:

package capitulo01;

import other.*;
import java.util.*;
import java.io.*;

public class Main {

	public static void main(String[] args) {
		new Filho("").metodo();
	}

}

mas tbm nao deveria funcionar.. visto que ali so existe uma referencia ao objeto.. e nao uma variavel.. justo?

3 Respostas

R

É prq o metodo “metodo” só existe em Filho, logo quando vc chama o método “metodo” na instancia classe Filho,na realidade é chamado Filho.metodo().

luksrn

Resumidamente, você só pode chamar os métodos que estão definidos no tipo declarado da variável. Se ele é um instância de uma classe X ou Y não interessa.

Sami_Koivu

Olá,

Talvez seria interessante notar que esse código que você postou:

package capitulo01;  
  
import other.*;  
import java.util.*;  
import java.io.*;  
  
public class Main {  
  
    public static void main(String[] args) {  
        new Filho("").metodo();  
    }  
  
}

é funcionalmente igual ao esse código (ao ponto de que o compilador vai gerar exatamente o mesmo codigo compilado no .class para os dois):

package capitulo01;  
  
import other.*;  
import java.util.*;  
import java.io.*;  
  
public class Main {  
  
    public static void main(String[] args) {  
        new Filho("");
        Filho.metodo();  
    }  
  
}

Que o sintaxe do Java permite você escrever uma chamada estatica desta forma, talvez seja um erro: só serve para confundir. A referencia não está sendo utilizado para nada. O metodo estatico a ser chamado é decidido na hora de compilar (pelo tipo da referencia/variavel, como o luksrn falou). Você pode até fazer isso:

package capitulo01;  
  
import other.*;  
import java.util.*;  
import java.io.*;  
  
public class Main {  
  
    public static void main(String[] args) {  
        Filho f = null;
        f.metodo();  
    }  
  
}

E vai chamar o metodo estatico, e não vai dar NullPointerException.

[]s,
Sami

Criado 24 de janeiro de 2013
Ultima resposta 24 de jan. de 2013
Respostas 3
Participantes 4