Passar um objeto para o método transferir()

Gostaria de saber como passo um objeto para o método transferencia do meu código, esse objeto seria a conta que vou fazer a transferencia, notem que deixei como comentário no meu código para eu conseguir usar o resto do programa. Está no bloco do switch case 4.

Na verdade meu sonho de consumo era eu poder passar o número da conta destino como parametro, poderiam me ajudar nessas 2 formas, tanto passando a classe como passando um numero de conta que faça o metodo entender a que objeto seria esse numero de conta?

import java.util.Scanner;

public class Conta implements CaixaEletronico {
	private int numConta;
	private String nome;
	private float saldo;
	
	Scanner t = new Scanner (System.in);
	
	public Conta(int numConta, String nome) {
		super();
		this.numConta = numConta;
		this.nome = nome;
		this.setSaldo(0);
	}

	public int getNumConta() {
		return numConta;
	}

	public void setNumConta(int numConta) {
		this.numConta = numConta;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public float getSaldo() {
		return saldo;
	}

	public void setSaldo(float saldo) {
		this.saldo = saldo;
	}
	
	@Override
	public void menu() {
		boolean sair = true;
		do {
			System.out.println("=======================================================");
			System.out.println("            C A I X A   E L E T R O N I C O            ");
			System.out.println("=======================================================");
			System.out.println("Bem vindo " + this.getNome());
			System.out.println("=======================================================");
			System.out.println("[1] Saldo");
			System.out.println("[2] Sacar");
			System.out.println("[3] Depositar");
			System.out.println("[4] Transferir");
			System.out.println("[0] Sair");
			System.out.println("=======================================================");
			System.out.print("Operação: ");
			int operacao = t.nextInt();
			switch (operacao) {
			case 1:
				this.saldo();
				break;
			case 2:
				System.out.print("Valor para o saque: R$ ");
				float valorSaque = t.nextFloat();
				this.sacar(valorSaque);
				break;
			case 3:
				System.out.print("Valor para depósito: R$ ");
				float valorDeposito = t.nextFloat();
				this.depositar(valorDeposito);
				break;
			case 4:
				System.out.print("Conta para transferencia: ");
				//Conta conta = t.next();
				System.out.print("Valor para transferencia: R$ ");
				float valorTransferencia = t.nextFloat();
				//this.transferir(conta, valorTransferencia);
				break;
			case 0:
				sair = false;
				break;
			default:
				System.out.println("Operação inválida");	
			}
		} while (sair);
		System.out.println("Até logo " + this.getNome());
	}
	
	@Override
	public void saldo() {
		System.out.println("Seu saldo é de R$ " + this.getSaldo());
	}

	@Override
	public void sacar(float valor) {
		if (this.getSaldo() < valor) {
			System.out.println("Saldo insuficiente para a operação");
		} else {
			this.setSaldo(this.getSaldo() - valor);
		}
	}

	@Override
	public void depositar(float valor) {
		this.setSaldo(valor);
	}

	@Override
	public void transferir(Conta conta, float valor) {
		if (this.getSaldo() < valor) {
			System.out.println("Saldo insuficiente para a operação");
		} else {
			this.setSaldo(this.getSaldo() - valor);
			conta.setSaldo(conta.getSaldo() + valor);
		}
	}

}

O método transferir espera uma conta e qual o valor a ser transferido.
Logo, você vai pegar o objeto conta que já deve possuir e o valor dessa transferência e invocar o método:

Mas, isso só vai funcionar se você descomentar as linhas onde lê a conta, mudar para receber um número e depois instanciar a tal conta

Conta conta = new Conta();
int numeroConta = Integer.parseInt(sc.nextLine());
conta.setNumero(numeroConta);

transferir(conta, valorTransferencia);

Não entendi bem.

Sim tenho uma classe principal que instancia as contas c1 e c2 e chama o método c1.menu(). E também uma interface com os métodos que estão @Override.

O meu maior problema é passar esse objeto via Scanner, não quero apenas colocar tipo c1.transfere(c2, 100). Quero ter um campo com Scanner para passar para qual objeto, tipo: Conta para transferir: c2. Porém com Scanner eu preciso passar como next(), mas qual seria o tipo da classe?

Isso ocorre pelo simples fato de que você JAMAIS terá algo assim:

Pois Conta é uma classe que você criou, totalmente desconhecida para os objetos Scanner.
Conta é uma classe que possui atributos, como o número da conta e o seu respectivo saldo. Estes sim, podem ser lidos pelo Scanner, por serem conhecidos por ele (String, int, float, double, etc).

Logo, o que eu disse acima, deve funcionar

Ok, mas como eu faria um algoritmo que lê o número da conta destino e a partir daí eu possa mexer no saldo dessa conta destino? Não faço a menor ideia de como fazer isso.

Cara, você que precisa fazer isso, eu já dei o caminho.
Como é tua classe Conta?
Como é o método que faz a transferência?

O programa vai ler conforme parâmetros que você passou no método. Da uma olhada:

boolean transferir(Conta contaDestino, double valor) {
	if(this.saldo >= valor) {
		this.saldo -= valor;
		contaDestino.saldo += valor;
		return true;
	}
		return false;
	}

No main() ficaria assim:

   public class Programa {

      public static void main(String[] args) {
      cc1.transferir(cp1, 1000.0); //irá transferir 1000.0 da Conta cc1 para a Conta cp1.

Olá Vagner, se vc ver, meu programa é interativo, eu não coloco c1.transferir(c2, 100);
Eu uso a classe scanner pra fazer as operações, não justamente como na classe scanner falar para transferir para c2.

Minha classe principal só tem 2 objetos (c1 e c2), e o c1 inicia o programa com c1.menu();
Só isso, o resto está tudo nessa classe que postei.

@f.java13 você realmente quer trabalhar com desenvolvimento? Quer ser um programador?
Se sim, então comece a pensar fora da caixa, comece a entender que, na maioria das vezes, você encontrará exemplos totalmente diferentes do que você precisa e terá que adequar à tua realidade.
É isso que diferencia um programador medíocre do programador bom.

Quando você escolher o “case 4”, você tem que chamar o método transferir(). No método transferir, você vai pedir pra passar o argumento, de por exemplo, numeroConta. Depois vai fazer um “for” numa array de conta até achar a conta compatível com o numero passado e realizar a operação.

Faz sentido… Quando chegar casa vou testar e dou um feedback, valeu Vagner

Resolvi reescrever o código, agora fiz uma classe Conta e outra InternetBanking, então eu passo a Conta para o InternetBanking, porém está dando erro no meu for dentro do método menu(), case 4. No eclipse não está mostrando nenhum erro, mas ao tentar fazer a transferencia aparece uma mensagem de erro. Estou passando um array do objeto Conta para o método menu(). Segue código completo.

public class Conta {
	String numConta;
	String nome;
	float saldo;
	
	public Conta(String numConta, String nome) {
		super();
		this.numConta = numConta;
		this.nome = nome;
		this.setSaldo(0f);
	}

	public String getNumConta() {
		return numConta;
	}

	public void setNumConta(String numConta) {
		this.numConta = numConta;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public float getSaldo() {
		return saldo;
	}

	public void setSaldo(float saldo) {
		this.saldo = saldo;
	}
	
}



import java.util.Scanner;

public class InternetBanking {

	private Conta conta;
	
	Scanner entrada = new Scanner (System.in);
	
	public Conta getConta() {
		return conta;
	}

	public void setConta(Conta conta) {
		this.conta = conta;
	}

	public void menu(Conta conta, Conta c[]) {
		boolean sair = true;
		do {
			System.out.println("=======================================================");
			System.out.println("            C A I X A   E L E T R O N I C O            ");
			System.out.println("=======================================================");
			System.out.println("Bem vindo " + conta.getNome());
			System.out.println("=======================================================");
			System.out.println("[1] Saldo");
			System.out.println("[2] Sacar");
			System.out.println("[3] Depositar");
			System.out.println("[4] Transferir");
			System.out.println("[0] Sair");
			System.out.println("=======================================================");
			System.out.print("Operação: ");
			int operacao = entrada.nextInt();
			switch (operacao) {
			case 1:
				this.saldo(conta);
				break;
			case 2:
				System.out.print("Valor para o saque: R$ ");
				float valorSaque = entrada.nextFloat();
				this.sacar(conta, valorSaque);
				break;
			case 3:
				System.out.print("Valor para depósito: R$ ");
				float valorDeposito = entrada.nextFloat();
				this.depositar(conta, valorDeposito);
				break;
			case 4:
				Conta contaDestino = c[0];
				System.out.print("Conta para transferencia: ");
				String numContaDestino = entrada.next();
				for (int cont = 0 ; cont < 3 ; cont++) {
					if (c[cont].numConta == numContaDestino) {
						contaDestino = c[cont];
					}
				}
				System.out.print("Valor para transferencia: R$ ");
				float valorTransferencia = entrada.nextFloat();
				this.transferir(conta, contaDestino, valorTransferencia);
				break;
			case 0:
				sair = false;
				break;
			default:
				System.out.println("Operação inválida");	
			}
		} while (sair);
		System.out.println("Até logo " + conta.getNome());
	}
	
	public void saldo(Conta conta) {
		System.out.println("Seu saldo é de R$ " + conta.getSaldo());
	}

	public void sacar(Conta conta, float valor) {
		if (conta.getSaldo() < valor) {
			System.out.println("Saldo insuficiente para a operação");
		} else {
			conta.setSaldo(conta.getSaldo() - valor);
			System.out.println("Saque realizado com sucesso");
		}
	}

	public void depositar(Conta conta, float valor) {
		conta.setSaldo(conta.getSaldo() + valor);
		System.out.println("Depositado com sucesso");
	}

	public void transferir(Conta conta, Conta contaDestino, float valor) {
		this.sacar(conta, valor);
		this.depositar(contaDestino, valor);
	}
}



public class Banco {

	public static void main(String[] args) {
		InternetBanking i = new InternetBanking();
		Conta c[] = new Conta[3];
		c[0] = new Conta("00001", "João");
		c[1] = new Conta("00002", "Maria");
		i.menu(c[0], c);
	}
}

Vejo o método principal apenas como um método para iniciar o programa, ou nele eu programar algo que vá direcionando o programa para as classes e métodos. Não acho boa prática programar o meu menu na classe principal, lá provavelmente eu conseguiria interagir melhor com os objetos. Ou será que lá seria o melhor lugar para programar o menu?

Você vai ter que criar uma array com o seu Objeto Contas.

Conta[] minhasContas;
minhasContas = new Conta[10]; //criou uma array do tipo Conta com 10 posições (0-9)

Depois, pra cada conta instanciada, você vai ter que popular sua array

Conta c1 = new Conta();//Instanciei um objeto conta
minhasContas[0] = c1;//Populei minha array "minhasContas" com a conta instanciada na posição 0.

Ai sim, você consegue percorrer pela contas e identificar com qual o Número da Conta vai bater.

EDIT: Você fez isso, né… AHAHA, agora que vi aqui. Mostra o erro que ta dando.

Cara, to bem contente, consegui evoluir bem meu programa, já consigo transferir e até criar e excluir conta, ainda tem muita coisa pra melhorar como evitar que a conta com saldo seja excluida, ou então criar uma conta com mesmo número, mas até aqui to satisfeito, as poucos vou melhorando.

Infelizmente precisei criar muita coisa na classe principal pra poder acessar as outras classes, mas tudo bem, talvez eu deveria criar uma classe sistema e todo esse codigo da classe principal ficar lá, e de lá eu direciono para as outras classes.

Segue meu código.

import java.util.Scanner;

public class Conta {
	String numConta;
	String nome;
	float saldo;
	
	Scanner entrada = new Scanner (System.in);
	
	public Conta() {
		super();
		System.out.print("Número da conta: ");
		this.numConta = entrada.next();
		System.out.print("Nome: ");
		this.nome = entrada.next();
		this.setSaldo(0f);
	}

	public String getNumConta() {
		return numConta;
	}

	public void setNumConta(String numConta) {
		this.numConta = numConta;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public float getSaldo() {
		return saldo;
	}

	public void setSaldo(float saldo) {
		this.saldo = saldo;
	}
	
}
import java.util.Scanner;

public class InternetBanking {

	private Conta conta;
	private Conta contaDestino;
	
	Scanner entrada = new Scanner (System.in);
	
	public Conta getConta() {
		return conta;
	}

	public void setConta(Conta conta) {
		this.conta = conta;
	}

	public void menu(Conta conta, Conta contas[]) {
		boolean sair = true;
		do {
			System.out.println("=======================================================");
			System.out.println("            I N T E R N E T   B A N K I N G            ");
			System.out.println("=======================================================");
			System.out.println("Bem vindo " + conta.getNome());
			System.out.println("=======================================================");
			System.out.println("[1] Saldo");
			System.out.println("[2] Sacar");
			System.out.println("[3] Depositar");
			System.out.println("[4] Transferir");
			System.out.println("[0] Sair");
			System.out.println("=======================================================");
			System.out.print("Operação: ");
			int operacao = entrada.nextInt();
			switch (operacao) {
			case 1:
				saldo(conta);
				break;
			case 2:
				sacar(conta);
				break;
			case 3:
				depositar(conta);
				break;
			case 4:
				transferir(conta, contas);
				break;
			case 0:
				sair = false;
				break;
			default:
				System.out.println("Operação inválida");	
			}
		} while (sair);
		System.out.println("Até logo " + conta.getNome());
	}
	
	public void saldo(Conta conta) {
		System.out.println("Seu saldo é de R$ " + conta.getSaldo());
	}

	public void sacar(Conta conta) {
		System.out.print("Valor para o saque: R$ ");
		float valor = entrada.nextFloat();
		if (conta.getSaldo() < valor) {
			System.out.println("Saldo insuficiente para a operação");
		} else {
			conta.setSaldo(conta.getSaldo() - valor);
			System.out.println("Saque realizado com sucesso");
		}
	}

	public void depositar(Conta conta) {
		System.out.print("Valor para depósito: R$ ");
		float valor = entrada.nextFloat();
		conta.setSaldo(conta.getSaldo() + valor);
		System.out.println("Depositado com sucesso");
	}

	public void transferir(Conta conta, Conta contas[]) {
		System.out.print("Conta para transferência: ");
		String numContaDestino = entrada.next();
		for (int cont = 0 ; cont < 3 ; cont++) {
			if (contas[cont].getNumConta().equals(numContaDestino)) {
				contaDestino = contas[cont];
				break;
			}
		}
		System.out.print("Valor para transferência: ");
		float valor = entrada.nextFloat();
		conta.setSaldo(conta.getSaldo() - valor);
		contaDestino.setSaldo(contaDestino.getSaldo() + valor);
	}
	
}
import java.util.Scanner;

public class Banco {

	public static void main(String[] args) {
		
		InternetBanking i = new InternetBanking();
		Conta c[] = new Conta[3];
		
		Scanner entrada = new Scanner (System.in);
		
		boolean sair = true;
		do {
			System.out.println("=======================================================");
			System.out.println("            S I S T E M A   B A N C A R I O            ");
			System.out.println("=======================================================");
			System.out.println("[1] Internet Banking");
			System.out.println("[2] Abrir Conta");
			System.out.println("[3] Fechar Conta");
			System.out.println("[0] Sair");
			System.out.println("=======================================================");
			System.out.print("Operação: ");
			int operacao;
			operacao = entrada.nextInt();
			switch (operacao) {
			case 1:
				System.out.print("Número da Conta: ");
				String numConta = entrada.next();
				for (int cont = 0 ; cont < 3 ; cont++) {
					if (c[cont].getNumConta().equals(numConta)) {
						i.menu(c[cont], c);
						break;
					}
				}
				break;
			case 2:
				for (int cont = 0 ; cont < 3 ; cont++) {
					if (c[cont] == null) {
						c[cont] = new Conta();
						break;
					}
				}
				break;
			case 3:
				System.out.print("Número da conta que deseja fechar: ");
				String numContaFechar = entrada.next();
				for (int cont = 0 ; cont < 3 ; cont++) {
					if (c[cont].getNumConta().equals(numContaFechar)) {
						c[cont] = null;
						break;
					}
				}
				break;
			case 0:
				sair = false;
				break;
			default:
				System.out.println("Operação inválida");
			}
		} while (sair);
		System.out.println("Saindo do sistema");
		
	}
	
}