Dúvida com OO

Boa noite pessoal, meu nome é Pedro e sou novo aqui.

Bom, estou fazendo um exércicio de java e me deparei com uma dúvida que não consigo encontrar solução sozinho e vou tentar explicar:

O Ex. pede para eu criar 3 classes diferentes ( Pacote, FormaPagamento e Servico, além da main, é claro), com seus respectivos atributos;

Pacote:
codPacote : int, dataJogo : String, valorPacote : double e servico : Servico

FormaPagamento:
tipoServico : String, valServico : double

A classe FormaPagamento possui um método chamado ’ valorTotal ’ com retorno double;

A Parte que não entendo está aqui, em uma observação no exercício :
Está me dizendo que uma FormaPagamento possui um Pacote e um Pacote possui um Servico e após isso dois exemplos: formaPagto.getPacote().getvalorTotal() e formaPagto.getPacote().getServico().getTipo().

Alguém por favor poderia me explicar como ficaria no código e me ajudar a entender isso? se não consegui deixar claro me desculpe, peça que explico de uma nova forma.

Muito Obrigado,
Pedro Henrique.

O que você conseguiu fazer?

Poste o código pra gente ver e quem sabe ajudar.

Bom, ai vai:

Classe Pacote

package tds.ltp.semestral001;

import java.io.Serializable;

public class Pacote implements Serializable{

	private static final long serialVersionUID = 1L;

	private int codigo;
	private String dataJogo;
	private double valor;
	private Servico servico;
	
	public int getCodigo() {
		return codigo;
	}
	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}
	public String getDataJoto() {
		return dataJogo;
	}
	public void setDataJoto(String dataJogo) {
		this.dataJogo = dataJogo;
	}
	public double getValor() {
		return valor;
	}
	public void setValor(double valor) {
		this.valor = valor;
	}
	public Servico getServico() {
		return servico;
	}
	public void setServico(Servico servico) {
		this.servico = servico;
	}
	
	
	Pacote(){}
	
	Pacote(int codigo, String dataJogo, double valor, Servico servico){
		this.codigo = codigo;
		this.dataJogo = dataJogo;
		this.valor = valor;
		this.servico = servico;
	}
	
	
	public double valorTotal(){
		
		getValor();
		
		return getValor();
		
	}
	
	
	
}

Classe Serviço

package tds.ltp.semestral001;

import java.io.Serializable;

public class Servico implements Serializable{

	private static final long serialVersionUID = 1L;
	
	private String tipo;
	private double valor;
	
	public String getTipo() {
		return tipo;
	}
	public void setTipo(String tipo) {
		this.tipo = tipo;
	}
	public double getValor() {
		return valor;
	}
	public void setValor(double valor) {
		this.valor = valor;
	}
	
	
	Servico(){}
	
	Servico(String tipo, double valor){
		this.tipo = tipo;
		this.valor = valor;
	}
	
}

Classe FormaPagamento

package tds.ltp.semestral001;

import java.io.Serializable;

public class FormaPagamento implements Serializable{

	private static final long serialVersionUID = 1L;

	private String forma;
	private String nomeCliente;
	private String cpf;
	private int notaFiscal;
	private Pacote pacote;
	
	public String getForma() {
		return forma;
	}
	public void setForma(String forma) {
		this.forma = forma;
	}
	public String getNomeCliente() {
		return nomeCliente;
	}
	public void setNomeCliente(String nomeCliente) {
		this.nomeCliente = nomeCliente;
	}
	public String getCpf() {
		return cpf;
	}
	public void setCpf(String cpf) {
		this.cpf = cpf;
	}
	public int getNotaFiscal() {
		return notaFiscal;
	}
	public void setNotaFiscal(int notaFiscal) {
		this.notaFiscal = notaFiscal;
	}
	public Pacote getPacote() {
		return pacote;
	}
	public void setPacote(Pacote pacote) {
		this.pacote = pacote;
	}
	
	
	FormaPagamento(){}
	
	
	
	
}

Classe TesteCompraIngresso

package tds.ltp.semestral001;

import java.util.Scanner;

public class TesteCompraIngresso {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		FormaPagamento pgto = new FormaPagamento();
		
		
	
		System.out.print("Entre com a forma de pagamento (Dinheiro ou Cartão): ");
		pgto.setForma(sc.next());
	
		System.out.print("Informe seu nome: ");
		pgto.setNomeCliente(sc.next());
		
		System.out.print("Insira seu CPF: ");
		pgto.setCpf(sc.next());
		
		System.out.println("Entre com o código da nota fiscal: ");
		pgto.setNotaFiscal(sc.nextInt());
		
		System.out.println("Entre com o valor gasto:");

	
		sc.close();
	}
}

Ainda está faltando coisas, pq nesse exato momento estou com o clipse aberto dando continuidade ao código.

EDIT v0.2
Na o método valorTotal está totalmente incorreto, apenas inseri qualquer dado para parar de apitar o vermelho de erro :stuck_out_tongue:
Desculpa, sou novissimo no fórum MAUHAHUA.

Bom, não querendo ser chato mas já sendo, é bom editar seu post anterior com o código e inserí-lo nas tag , assim fica mais fácil visualizar seu código.

Opa, a visualização do código é outra viu só?

Bem, pelo que percebi sua dúvida está nesse tipo de chamada:

...
formaPagamento.getPacote().getServico(); // e por ai vai
...

Não é isso?

Isso chama-se referencia direta ao objeto criado, sem precisar usar uma variável e também funciona dessa forma:

FormaPagamento forma = new FormaPagamento();
Pacote pacote = forma.getPacote();
Servico servico = pacote.getServico();

Claro que para que essas atribuições funcionem corretamente, seus objetos não podem estar nulos (null).

Como reparei que no seu código possuem métodos setters (setServico(), setPacote(), etc), esses devem ser preenchidos primeiro obviamente, caso o contrário você terá alguns NullPointerException explodindo, o que de certa forma não é ruim pois vai te familiarizar com erros e o principal, aprender a consertá-los.

Perfeito !

Agora compreendo esse

formaPagamento.getPacote().getServico()

Estava confuso e dificil de entender sozinho.

Ou seja, nessa linha de código estou apenas acessando o conteúdo do servico, correto? então precisaria fazer todo esse caminho através dos sets para inserir dados?

[quote=Kike_Rulez]Perfeito !

Agora compreendo esse

formaPagamento.getPacote().getServico()

Estava confuso e dificil de entender sozinho.

Ou seja, nessa linha de código estou apenas acessando o conteúdo do servico, correto? então precisaria fazer todo esse caminho através dos sets para inserir dados?[/quote]

Depende, vi que você declarou construtores para suas classes correto, para preencher um pacote por exemplo, pode ser assim:

FormaPagamento forma = new FormaPagamento();
forma.setPacote(new Pacote(1, "16/05/2013", 0.50, null));

Pacote pacoteCriado = forma.getPacote();
pacoteCriado.setServico(new Servico("Jogo", 1.00)); // na linha do setPacote, o servico estava nulo, agora não mais

Servico servicoCriado = pacoteCriado.getServico();

Isso usamos setters + construtor certo, poderíamos resolver isso já na construção da FormaPagamento:

FormaPagamento forma = new FormaPagamento(new Pacote(1, "16/05/2013", 0.50, new Servico("Jogo", 1.00)));

Importante frisar que métodos “set”, tem o comportamento de alterar objetos ou atributos que podem ocasionar erros do tipo:

pacote.setServico(null);
pacote.getServico(); // o que vem aqui?

Isso só irá gerar erro pra você quando executar o programa, ou seja, os famosos “erros de execução”.

A segunda parte que estou com dificuldades é a seguinte:

Preciso retornar o valorTotal()

pra isso, preciso informar o pacote e o servico.

E ai que pega, pois, este método valorTotal() está na classe ’ Pacote ’

[code]public class Pacote implements Serializable{

private int codigo;
private String dataJogo;
private double valor;
private Servico servico;[/code]

[code]public double valorTotal(){

	double valorTotal;
	return valorTotal = getValor() + getServico();
	
}[/code]

está acusando um erro, dizendo que não posso usar operador + num tipo String, ou seja, a variavel servico está como tipo string. Como faço para arrumar isso, fazendo o usuário digitar o valor do serviço e arrumar o tipo de variavel ?

Quanto aos construtores, o professor pediu apenas para implementar, não precisa usa-los.
Só pra saber se aprendemos usar.

Errado!

Seu método getServico() retorna um objeto do tipo Servico e não uma String.

Seu método valorTotal retorna um double, um tipo numérico, como você pretende somar um valor com um Servico?

Para realizar essa soma você precisa pegar o valor do Servico e somá-lo ao valor do Pacote:

public double valorTotal(){  
        return valorTotal = getValor() + getServico().getValor();  
}

Muito obrigado, agora está indo, e estou entendendo

Porém < UHAUHAUHA > agora a conta não está me retortando nada e está dando o famoso erro NullPointException

Segue o código:

[code]package tds.ltp.semestral001;

import java.io.Serializable;

public class Pacote implements Serializable{

private static final long serialVersionUID = 1L;

private int codigo;
private String dataJogo;
private double valor;
private Servico servico;

public int getCodigo() {
	return codigo;
}
public void setCodigo(int codigo) {
	this.codigo = codigo;
}
public String getDataJoto() {
	return dataJogo;
}
public void setDataJoto(String dataJogo) {
	this.dataJogo = dataJogo;
}
public double getValor() {
	return valor;
}
public void setValor(double valor) {
	this.valor = valor;
}
public Servico getServico() {
	return servico;
}
public void setServico(Servico servico) {
	this.servico = servico;
}


Pacote(){}

Pacote(int codigo, String dataJogo, double valor, Servico servico){
	this.codigo = codigo;
	this.dataJogo = dataJogo;
	this.valor = valor;
	this.servico = servico;
}


public double valorTotal(){
	
	
	return getValor() + getServico().getValor();  
	
}

}
[/code]

main

[code]package tds.ltp.semestral001;

import java.util.Scanner;

public class TesteCompraIngresso {

public static void main(String[] args) {
	
	Scanner sc = new Scanner(System.in);
	FormaPagamento pgto = new FormaPagamento();
	Servico serv = new Servico();
	Pacote pack = new Pacote();
	
	

	System.out.print("Entre com a forma de pagamento (Dinheiro ou Cartão): ");
	pgto.setForma(sc.next());

	System.out.print("Informe seu nome: ");
	pgto.setNomeCliente(sc.next());
	
	System.out.print("Insira seu CPF: ");
	pgto.setCpf(sc.next());
	
	System.out.print("Entre com o código da nota fiscal: ");
	pgto.setNotaFiscal(sc.nextInt());
	
	System.out.print("Entre com o valor do serviço: ");
	serv.setValor(sc.nextDouble());
	
	System.out.print("Entre com o valor do Pacote: ");
	pack.setValor(sc.nextDouble());


	System.out.print("O valor total é de: ".concat(String.valueOf(pack.valorTotal())));
	
	sc.close();
}

}
[/code]

Tranquilo, mas agora o NullPointerException vai fazer bem pra sua alma, kkkkk, brincadeira, mas sério, tente entender o que ele te diz (a linguagem fala com você!!! kkk) e se não conseguir mesmo, daí poste a dúvida e o erro claro!

Fui