Estrutura do for

[quote=maquiavelbona]O que vem após o tipo de objeto da iteração não importa, é um nome de variável. Se você declarar antes que umLapis como Lápis e na lista tiver um objeto do tipo Caderno vai ser lançada uma exceção. Na abordagem usando instanceof você se preocupa com o tipo de dado e faz o que quer fazer com cada um ( dentro podes usar um cast e transformar na classe que você quiser e assim acessar métodos e atributos convenientes ). Usando a segunda você não se importa com o tipo pois para você todos são do tipo Object e pronto.

Até![/quote]

Lembrando que o compilador de forma alguma deixará voce tentar fazer um cast de um objeto que de nenhuma forma tenha relacionamento de herança.

ClassCastException só serão lançadas caso o objeto de referência seja parente do objeto da instância.

Com a utilização do instanceof voce terá uma maneira segura de saber para qual objeto voce poderá efetuar o cast. Por exemplo:

[code]
public class Teste {

public static void main(String[] args) {

    List listaMaterialEscolar = new ArrayList();
    listaMaterialEscolar.add(new Caderno());
    listaMaterialEscolar.add(new Lapis());
    listaMaterialEscolar.add(new Borracha());

    for (Object item : listaMaterialEscolar) {
        if (item instanceof Lapis) {
            Lapis l = (Lapis) item; // sem problemas; tenho a certeza de que item se refere a um objeto Lapis
            // faca algo com o lapis
        } else if (item instanceof Caderno) {
	
            Caderno c = (Fichario) item; // compila; Fichario É-UM Caderno;		

            c.folhear(); // nenhum problema aqui; a referencia a Caderno enxerga o metodo folhear
            c.adicionarFolhas(1); 	// OPA! problema!; não compila; a variavel de referencia é de um objeto
                                    // Caderno e não Fichario! ou seja Caderno não tem o método adicionarFolhas
                                    // para isso funcionar, o cast deve ser feito na referencia e nao na instancia;
            Fichario f = (Fichario) f;
            f.adicionarFolhas(1); // Aqui sim!!! compila!! e não lança nenhuma exceção		
            Lapis l = (Lapis) item; // compila; porém lança uma ClassCastException em runtime		
        } else if (item instanceof Borracha) {
            // faca algo com a borracha
        } else {
            // algum codigo assustador aqui
        }
    }

}

}

class Lapis {}

class Caderno {
public void folhear() { }
}

class Borracha {}

class Fichario
extends Caderno {
public void adicionarFolhas(int qtde) {}
}[/code]

At.

Só mais uma coisa, a partir do Java 5 já podemo limitar o tipo de objetos que podemos adicionar em uma Collection através da utilização de Generics.

Ex.:


List<Lapis> listaDeLapis = new ArrayList<Lapis>();
listaDeLapis.add(new Lapis()); // isso funciona
listaDeLapis.add(new Caderno()); // isso nao compila, porque a lista esta esperando receber Lapis e nao Caderno

At.