/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
	public void testaTudo(){
		List<ClasseTeste> lista = new ArrayList<ClasseTeste>();
		
		ClasseTeste teste1 = new ClasseTeste("Joao", 100);
		
		teste1.imprimir(); 
		
		lista.add(teste1); // adiciona teste1 na lista
		// note que a variável teste1 ainda está apontando para um objeto do tipo Classeteste
		// o valor não some automaticamente
		
		teste1.imprimir(); // imprime a mesma coisa que da primeira vez
		
		ClasseTeste teste2 = new ClasseTeste("Pedro", 200);
		
		teste2.imprimir();
		
		lista.add(teste2); // adiciona teste2 na lista
		
		// daí podemos fazer:
		
		lista.get(0).imprimir(); // imprime o Joao, que foi o primeiro adicionado à lista
		lista.get(1).imprimir(); // imprime o Pedro
		
		ClasseTeste teste3 = lista.get(0); // coloca em teste3 o primeiro elemento da lista : Joao
		// note que o elemento não é removido da lista
		
		teste3.setValor(300);
		
		teste3.imprimir(); // imprime o Joao, mas com valor 300
		teste1.imprimir(); // também imprime Joao, e com valor 300
		
		lista.get(0).imprimir(); // tambem imprime Joao, e com valor 300
		
		// Nós não mudamos a referência da variável teste1, então 
		// tanto teste1 quanto teste3 e lista.get(0) retornam o mesmo objeto.
		
		// inclusive, podemos fazer:
		lista.get(0).setValor(500);
		
		lista.get(0).imprimir(); // Joao, com valor 500
		teste1.imprimir(); // Joao, com valor 500
		
	}
	
	public static void main (String[] args) throws java.lang.Exception
	{
		
		new Ideone().testaTudo();
	}
	
	class ClasseTeste{
		String nome;
		int valor;
		
		public ClasseTeste(String nome, int valor){
			this.nome = nome;
			this.valor = valor;
		}

		// permite alterar o valor
		public void setValor(int novovalor){
			this.valor = novovalor;
		}

		// exibe nome e valor
		public void imprimir(){
			System.out.println("Nome : " + this.nome + "  Valor : " + this.valor);
		}
	}
}