Overridden ou overload metodos estaticos

Galera… pintou uma dúvida aqui!!!

Tipo… métodos estáticos não podem ser overridden ou overload?

donatinho

Métodos estáticos podem ser sobrecarregados(overload) ou redefinidos, mas não sobrescritos(override).

[code]class Animal{
public static void teste(){
System.out.println("animal");
}
}

class Dog extends Animal {
public static void teste(){
System.out.println("dog");
}
}[/code]

Se você usar “Animal a = new Dog()” e chamar o método “a.teste()” é a mesma coisa que “Animal.teste()” e imprimirá “animal”. Neste caso o método teste() foi redefinido e não sobrescrito, pois por se tratar de método estático não é possível utilizá-lo em polimorfismo.

Beleza Victor, entao métodos estaticos podem ser sobrepostos (overload) e nunca substituídos, mas se eu tiver um método estático (classe) e o overridden em uma instância (objeto). Gera um erro conforme o código abaixo deixa mostra.

Esse erro é gerado porque a JVM não sabe qual método teste ela deve referenciar?


class Animal{
	public static void teste() {
		System.out.println("animal");
	}
}

public class Dog extends Animal {
   public void teste(){
	   System.out.println("dog");
   }
}

Esse erro é gerado porque um método declarado estático não pode ser declarado não-estático (de instância) na subclasse. O mesmo vale ao contrário, se um método é de instância na super-classe não pode ser estático na classe que a herda.

Isso não é compilavel provavelmente para não ocorrer confusões como essa:

[code]public class Dog extends Animal {
public void teste(){
System.out.println("dog");
}

public static void main(String[] args) {
teste(); // linha 1
}
}[/code]

Na linha 1… deveria ser chamado o método estático da classe Animal ou teria que dar um erro de compilação porque está tentando acessar um membro de instância dentro de um contexto estático? Seria meio confuso se o compilador deixasse alterar o modificardor static na declaração de métodos substituidos ou redefinidos.

xiiiiiiiiiiiiiiiiiiiiiii… fiz um exemplo e me embananei tudo…

veja se é isto que você enxerga também…



public class SuperStatic {
	public static int x(char a) {
	   return 0;
	}
}


public class SubStatic extends SuperStatic {
	public static int x(char a) { 
                 return 1;
	}
	
	public int x(int a) {
		return 2;
	}	
}

Métodos estáticos podem ser overridden e/ou overload desde que a keyword ‘static’ não seja retirada.

Observando o código abaixo:

public class SuperStatic {
	public static int x(char a) {
	   return 0;
	}	
}

public class SubStatic extends SuperStatic {
	public int x(char a) {     XXX ERRO DE COMPILAÇÃO
            return 0;
	}
	
	public static int x(int a) {
		return 0;
	}	
}

XXX–> Um método de instância não pode overridden um método estático de SuperStatic

Então um método que seja de uma instância nunca poderá substituir um método estático, métodos de instância apenas podem overload um método estático.

É isso?

:???:

quote=“donatinho” XXX–> Um método de instância não pode overridden um método estático de SuperStatic

Então um método que seja de uma instância nunca poderá substituir um método estático, métodos de instância apenas podem overload um método estático.

É isso?

:???:[/quote]
Isso. :wink:

Se você pegar o último código que postou ele irá funcionar se adicionar static em “public int x(char a)” da classe SubStatic.