Metodos staticos

9 respostas
cu_ringa

no final da pag 85 do livro SCJP(portugues) da kathy sierra ela fala q metodos estaticos não podem ser sobrecarregados. mas podem ser redefinidos. bem eu fiz esse codigo e ele deu certo. Nesse exemplo tanto o metodo A é subscrito como sobrecarregado. Ou estou errado?

package teste;

class A{
	
	public static void A(){
		System.out.println("A");	
	}
}

class B extends A {
	
	public static void A(){
		System.out.println("B");	
	}
	
	public static void A(int i){
		System.out.println("B");	
	}	
}

public class Teste {

	public Teste(){
		A.A();
		B.A(5);
	}

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

qm tiver o livro e poder da uma olhadinha p me ajudar eu agradeço.

9 Respostas

LPJava

bom n to com livro agora mais acho q ela fala que nao pode ser sobrecarreado por um metodo nao static nao é isso nao? pq ai vc tem um subscrito e um metodo sobrecarregado!! e lembre-se static so pode chamar static!! mais vou olhar a pg… e posto novamente…

F

A problema é que o método:

public static void A(int i){

System.out.println(B);	

}

Não esta sendo sobrecarregado ele é simplesmente um novo metodo criado
na classe B.

A

A mesma coisa eh para o metodo A() sem argumentos. Se vc fizer o seguinte:

A a = new A();
         A b = new B();

         a.A();
         b.A();

sera impresso “A” duas vezes! Isso pq metodos static sao definidos em tempo de compilacao e nao sao sobrescritos!

se o metodo A() nao fosse static a resposta mudaria para:

A
B

ae galera! espero ter ajudado!

O

Sobre sobrecargas de métodos estaticos prestem atençao!

As AFIRMATIVAS ao redor do exame:

  1. Métodos estáticos NÃO podem ser sobrecarregados!

Quando você tem um método estatico na subclasse que tem a mesma assinatura de um método estatico na classe Super ele NÃO é uma sobrecarga, o que ele faz é OCULTAR o método da super!

Não estou estudando em portugues, assim to enviando várias regras, em Ingles, sobre esse assunto que pega muita gente!

about overriding !

  1. A static method of a subclass hides–but does not override–an accessible superclass method with the same signature;

  2. A compile-time error is generated if a subclass contains a declaration of an instance method that shares the same signature as an accessible static method of the superclass;

  3. A subclass can override a concrete implementation of a method with an abstract method declaration;

  4. The modifiers, synchronized, native and strictfp, specify implementation details that the programmer is free to change in a subclass.

  • If a superclass method is synchronized, then the overriding method may or not be synchronized;
  • If a superclass method is native, then the overriding method may or not be native;
  • If a superclass method is strictfp, then the overriding method may or not be strictfp;
  1. A subclass method may not have weaker access than the overridden superclass method;

  2. A subclass method can provide greater access than a superclass method;

Paulo_Silveira

cuidado: voces estao errando os termos sobrecarregado e sobrescrito

sobrecarrego é overload e sobrescrito é override! voces estao falando o contrario!

metodos estaticos PODEM ser overloaded, mas nao ha sentido em falar de override de metodos estaticos (ja que nao ha uma instancia para poder falar em invocacao virtual de metodo)

mister_m

Ou pondo de outra forma: overriding/sobrescrita tem a ver com polimorfismo e polimorfismo soh existe com instancias.

O

Paulo Silveira:
cuidado: voces estao errando os termos sobrecarregado e sobrescrito

sobrecarrego é overload e sobrescrito é override! voces estao falando o contrario!

metodos estaticos PODEM ser overloaded, mas nao ha sentido em falar de override de metodos estaticos (ja que nao ha uma instancia para poder falar em invocacao virtual de metodo)

De fato!

Corrigindo

  1. Métodos estáticos NÃO podem ser SOBRESCRITOS!

Quando você tem um método estatico na subclasse que tem a mesma assinatura de um método estatico na classe Super ele NÃO é um OVERRIDEN, o que ele faz é OCULTAR o método da super!

jaboot

Então a resposta para esta questão é “AB” ?

O

SIM!

Mas se quiser fazer mais testes

Troque o codigo do construtor por esse:

A.A();
 		B.A(5);
		
		System.out.println("");
		
		A a = new A();
		a.A();
		
		B b = new B();
		b.A();		
		
		System.out.println("");
		
		A ab = new B();
		
		ab.A();

Voce verá, na ultima instanciacao, que o metodo chamado SEMPRE sera o da classe A, diferentemente se os metodos fossem metodos de instancia ao inves de estaticos.

Criado 2 de dezembro de 2006
Ultima resposta 8 de dez. de 2006
Respostas 9
Participantes 8