Sobrescrever

Posso sobrescrever e usar comportamento políformico com métodos static sem probemas…?

Bem no meu exemplo isso não acontece:

package com.polimorfismo;

public class Transporte 
{
	
	public static void exibeDados()
	{
		
		System.out.println("Método de exibição de dados");
	}
}

class Navio extends Transporte
{
	public static void exibeDados()
	{
		System.out.println("Transporte navio");
	}
}

class Onibus extends Transporte
{
	public static void exibeDados()
	{
		System.out.println("Transporte Onibus");
	}
}

class Carro extends Transporte
{
	public static void exibeDados()
	{
		
		System.out.println("Transporte Carro");
	}
}

class Bicicleta extends Transporte
{
	
	public static void exibeDados()
	{
	   
		System.out.println("Transporte Bicicleta");
	}
}


class Exibe
{
	 public static void main(String args[])
	 {
		 Transporte vet[] = new Transporte[4];
		 vet[0]=new Bicicleta();
		 vet[1]=new Carro();
		 vet[2]=new Onibus();
		 vet[3]=new Navio();
		 
		 
		 for(Transporte tipo:vet)
		 {
			 tipo.exibeDados();
		 }
	 }
  	
}




Alguém sabe o porque disso..?

A sobrescrita do método funciona. Acontece que um método com o modificador “static” é estático e não um membro de instância da classe. Ou seja, ele independe da instância do objeto em questão, ele faz referência direta à classe e não ao objeto.

Por exemplo eu poderia acessar Transporte.exibeDados() diretamente, sem nem mesmo ter uma instância da classe transporte.

Portanto se você deseja acessar o método das subclasses, deve fazer referência a elas. Bicicleta.exibeDados() por exemplo.

Ah… é considerado uma boa prática sempre que for acessar membros estáticos de uma classe de modo direto através do nome da classe (como eu fiz acima). Acessar membros estáticos através da instância de algum objeto (como você fez tipo.exibeDados():wink: não é uma boa prática!

Espero ter ajudado. Até.

Métodos estáticos podem ser sobreescritos, mas o comportamento polimórfico não se aplica a eles.

Muito obrigado…!

o polimorfismo se aplica a instancia e nao a membro static… até pq os membros static eles nao sao herdados e sim redefinidos… nesse caso ai nao tem subscrição e sim uma redefinição.


Transporte t = new Navio();
t.exibeDados();

ele vai chamar o metodo da classe de Transporte, ou seja, do tipo de referencia(antes =) e nao do objeto( após o =).

flw!!