Duvidas no código - Porlimorfismo

Olá pessoal, gostaria que alguem me explicasse os codigos instanceof, e o cast ((Citadino)carro).ligarManual(), abaixo no codigo

aqui é um exemplo de polimorfismo, com quatro classes, uma para carro, outra Citadino, Familiar, Jipe. Todo o codigo eu entendi só não entendi as funções dos codigos acima.


import java.util.Scanner;

public class Carroo {
    
    public static void main(String[] args) {
   
        Scanner s = new Scanner(System.in);
        
        System.out.println("Digite o tipo de carro: ");
        
        String tipoCarro =s.nextLine();
        
        Carro carro;
        
        if(tipoCarro.equals("citadino")){
            
         carro = new Citadino();
        
        }
        else if(tipoCarro.equals("familiar")){
            
         carro = new Familiar();
        
        }
        else if(tipoCarro.equals("jipe")){
        
         carro = new Jipe();
        
        }
        else {
        
         carro = new Carro();
        
        carro.buzinar();
        
        }
        
        if (carro instanceof    Citadino)
            
            ((Citadino)carro).ligarManual();
        
        else if (carro instanceof Familiar)
            
            ((Familiar)carro).alarme();
        
        else if (carro instanceof Jipe)
            
            ((Jipe)carro).tração4x4();
    }
}

grato!!!

[quote=Jeanfbs]Olá pessoal, gostaria que alguem me explicasse os codigos instanceof, e o cast ((Citadino)carro).ligarManual(), abaixo no codigo

aqui é um exemplo de polimorfismo, com quatro classes, uma para carro, outra Citadino, Familiar, Jipe. Todo o codigo eu entendi só não entendi as funções dos codigos acima.


import java.util.Scanner;

public class Carroo {
    
    public static void main(String[] args) {
   
        Scanner s = new Scanner(System.in);
        
        System.out.println("Digite o tipo de carro: ");
        
        String tipoCarro =s.nextLine();
        
        Carro carro;
        
        if(tipoCarro.equals("citadino")){
            
         carro = new Citadino();
        
        }
        else if(tipoCarro.equals("familiar")){
            
         carro = new Familiar();
        
        }
        else if(tipoCarro.equals("jipe")){
        
         carro = new Jipe();
        
        }
        else {
        
         carro = new Carro();
        
        carro.buzinar();
        
        }
        
        if (carro instanceof    Citadino)
            
            ((Citadino)carro).ligarManual();
        
        else if (carro instanceof Familiar)
            
            ((Familiar)carro).alarme();
        
        else if (carro instanceof Jipe)
            
            ((Jipe)carro).tração4x4();
    }
}

grato!!![/quote]

Cara, o instanceof tem um retorno boolean, de modo que se o objeto pertencer a instância, o retorno é “true”… No seu caso, se o carro for do tipo “Citadino” então terá um retorno “true”.
E sobre o cast ((Citadino)carro).ligarManual()… Bem, ele só entra nessa linha de código se obviamente ele for do tipo “Citadino”, mas se não fizer o cast o objeto não consegue acessar os métodos da classe Citadino, ele vai acessar os métodos da classe Carro… apesar de receber a instância do tipo Citadino, e TIPO dele é CARRO… daí a necessidade do cast, deu pra entender?

Não há nenhum exemplo de polimorfismo aí. So haveria se você tirasse a chamada carro.buzinar() de dentro do else.

O operador instanceof serve para você testar o tipo de variável. Como você viu aí, você pode atribuir qualquer tipo de carro a uma variável do tipo Carro.
E se você quisesse saber o tipo de carro que você colocou lá dentro? Para isso, usa-se o instanceof:

if (carro instanceof Ferrari) //testa se dentro da variável carro tem uma Ferrari

A segunda operação é chamada de cast. Você sabe que toda Ferrari é um carro, por isso, uma chamada como essa não exige cast:

Carro x = new Ferrari(); //Ok, toda Ferrari é um carro.

Entretanto, nem todo carro é uma Ferrari. Por isso, a conversão no sentido contrário exige que você, programador, peça explicitamente por ela:

Ferrari x = (Ferrari) carro; //Isso pode dar erro

Essa conversão é sujeito a erros. Se a variável corre for inicializada com new Fusca() ou qualquer outro new que não tenha uma Ferrari, essa linha de código do cast vai disparar um ClassCastException.

Você as vezes precisa fazer esse tipo de conversão para chamar um método que só a Ferrari tenha, e não outros tipos de carro.

Valeu mesmo consegui entender, agora quero apenas entender melhor:

ViniGodoy, você disse que não tem exemplo de polimorfismo no código, a não ser que eu tirasse o método buzinar que está na classe Carro.

Pelo que eu entendi polimorfismo seria você utilizar de vários métodos diferentes. Seria isso mesmo? E porque o método buzinar() de Carro
não se adéqua a um polimorfismo visto que todas as subclasses tem ele como herança?

Mas de qualquer jeito valeu pelas respostas.

Poli = muitos, morfos = formas.
Isso implica em, diferente do que você percebeu, que um método seja escrito e (portanto), executado de maneiras diferentes.
Como assim?
Todos os trabalhadores executam o método deslocarAteOTrabalho. Cada trabalhador o faz de uma forma diferente:
Quem vai à pé, executa o método andando.
Quem vai de bicicleta, executa o mesmo método pedalando.
Quem vai de moto, executa pilotando.
Quem vai de carro, executa dirigindo.
E há outras formas ainda de executar este mesmo método, ir nadando, ir de helicóptero, skate, etc.

Veja que, para o mesmo método, existem várias formas do mesmo ser executado.

Isto é polimorfismo.

hum!!! agora entendi valeu mesmo