Passando this como parametro, nao entendo

Tem um exercicio na apostila da caelum que diz para criar uma classe Cidade e uma Trem. O trem pode ou nao estar parado naquela cidade mas quando muda de cidade, ele tem que ser removido da array daquela cidade. Para isso, ele dis para remover o trem pela propra classe Trem utilizando o metodo removeTrem(this), ou seja, utilizando o parametro this. Eu nao entendo, pq do this? Sei que e para referenciar a propria classe, mas nao seria muito mais facil pegar a ultima posicao da array e substituir o valor por null? Se eu referenciar a propria classe, ele vai ser escluido da array?

Falae Danilo!

Então, o termo correto é “passar como argumento o this”.
Não sei qual a implementação do método removeTrem(this), porém a assinatura do método tem sentido.
O this não referencia a classe, mas sim o objeto corrente daquela classe (levendo em consideração herença, etc…).

Confie no pessoal da Caelum, vai excluir sim (:

Abraços!

qual a diferenca de passar parametro e passar argumento? E como isso seria implementado? Como eu usaria o this como argumento? Como poderia ser o resto do metodo? nao tenho ideia :shock:

Olá Danilo!
Fique tranquilo, as coisas são mais simples do que você imagina. Também tinha muitas dúvidas (como as suas).

qual a diferenca de passar parametro e passar argumento?

  • Quando invocamos um método que possui na assinatura dois parâmetros por exemplo (quando lembrar de assinatura, associe com o fato de que aquilo terá de ser cumprido, como um contrato assinado) passamos dois argumentos na assinatura do método teremos dois parâmetros.

Exemplo:

[code] public static void facaAlgo() {
// Aqui passamos duas strings como ARGUMENTO para o método imprimaAlgo
imprimaAlgo(“Esta é a mensagem 1”, “Esta é a mensagem 2”);
}

public static void imprimaAlgo(String mensagem1, String mensagem2) {
	// Aqui imprimimos os PARAMETROS recebidos
	System.out.println("Parâmetro mensagem1: " + mensagem1);
	System.out.println("Parâmetro mensagem2: " + mensagem2);
}

public static void main(String[] args) {
	// Aqui iniciamos nosso programa invocando o método facaAlgo
	facaAlgo();
}[/code]

Quando o this, ele referencia o objeto corrente veja se esse código pode te ajudar, nele utilizo o “this” para uma variedade de funcionalidades. Nada melhor que um exemplo prático (:

[code]package br.com.marcio.general;

public class Carro {

private String marca;

public Carro(String marca) {
	// Este construtor indica que todo carro para existir terá de ter uma marca
	// Note que ele pega o objeto corrente "this" e seta um nome de marca nele
	this.marca = marca;
	
}


public String getMarca() {
	// Simplemente retorna nome da marca
	return this.marca;
}

public void setMarca(String marca){
	// Aqui fala que o objeto corrente (atual) de carro vai receber o nome recebido como parâmetro
	this.marca = marca;
}

public void imprimeMarca() {
	// Novamente utilizamos a palavra reservada this para nos trazer o objeto (carro) atual e imprimir sua marca
	System.out.print("A marca do carro agora é: " + this.marca);
}

public static void main(String[] args) {
	// Instanciamos a classe que estou utilizando para teste (o nome da classe não tem muito a ver)
	// Note que a marca inicial do carro é FIAT
	Carro carro = new Carro("Fiat");
	// Para comprovar que a marca do carro é FIAT vamos chamar o método que imprime a marca
	carro.imprimeMarca();
	// Agora vamos alterar a marca do carro
	carro.setMarca("Chevrolet");
	// Agora vamos ver como ficou a marca do carro depois da alteração
	carro.imprimeMarca();
}

}[/code]

Espero ter tirado algumas dúvidas!
Qualquer dúvida só contactar!

Abraços!

Falando na lógica…

vc passa o this pq vc pode ter varios trens em uma cidade, mas o q vc quer tirar da lista é o THIS… o próprio cara que ta chamando o método tiraTrem. E detalhe, se tem vários trens na cidade, nada garante que ele seja o último da lista, como sugeriu apenas tirar o último elemento, colocando null.

Espero ter ajudado alguma coisa.

[2]

desculpe estar acendendo de novo o topico, mas nao entendi bem ao certo. Eu deveria tirar o ultimo da lista com o this? Como eu faria se eu nao quisece tirar o ultimo da lista? Uso uma ArrayList né?

Se vc quiser tirar o ultimo da lista, basta vc fazer um método removeLast (removerUltimo) ou alguma coisa do genero. Nesse caso, vc nao precisaria ter parametro, já que já está implicito no método que o trem a ser removido seria o ultimo.
Agora se vc quer tirar um trem qualquer que esteja na lista, vc tem que informar qual trem como parametro, seja passando uma instacia da classe Trem ou até um índice ( como existe na classe ArrayList). Então qdo vc passa o this como parametro, vc está informando que quer retirar da lista a própria instancia da classe trem que está chamando o método remover.

Posta o codigo das classes acho que fica mais entender a sua dúvida e te ajudar.