Erro de acesso a atributos

boa tarde,

estou tento a seguinte mensagem de erro: Programa.java:33: error> nome has private access in Cliente
return this.titular.nome;
^
1 error
no codigo abaixo:

[code]class Cliente{
private String nome;
private String sobrenome;
private String cpf;
private int idade;

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

private void validaCPF(String cpf){
	//regras para validacao
	System.out.println("CPF Validadado");
}

public void mudaCPF(String cpf){
	if(this.idade <= 60){
	validaCPF(cpf);	
	}
	this.cpf = cpf;
}

}

class Conta{
private int numero;
private String dono;
private double saldo;
private double limite;
private double novoSaldo;
Cliente titular = new Cliente();

	public Cliente getName(){
	return this.titular.nome;
}[/code]

creio que seja no acesso ao atributo nome da classe cliente dentro do método getName(); como posso fazer para acessar um atributo de uma classe a outra? estou na linha de pensamento correta?

error> nome has private access in Cliente
traduzindo: “nome tem acesso privado em Cliente”

Você precisa entender como funcionam os modificadores de acesso.

Veja estes links:
http://www.devmedia.com.br/modificadores-de-acesso-do-java/25404
http://www.caelum.com.br/apostila-java-orientacao-objetos/modificadores-de-acesso-e-atributos-de-classe/

Cweiler, primeiramente obrigado estou estudando a linguagem java exatamente pela postila da Caelum. Pelo que entendi eu não posso acessar um atributo de uma determinada classe, em uma outra. Porem quando eu tento acessar o atributo nome da Classe Cliente dentro do escopo da propria classe veja o erro que me é emitido:

[/img]

veja o meu codigo como ficou:

[code]class Cliente{
private String nome;
private String sobrenome;
private String cpf;
private int idade;

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

private void validaCPF(String cpf){
	//regras para validacao
	System.out.println("CPF Validadado");
}

public void mudaCPF(String cpf){
	if(this.idade <= 60){
	validaCPF(cpf);	
	}
	this.cpf = cpf;
}

}

class Conta{
private int numero;
private String dono;
private double saldo;
private double limite;
private double novoSaldo;
Cliente titular = new Cliente();

	public String getDono(){
		return this.dono;
	}
	
	public void setDono(String dono){
		this.dono = dono;
	}
	
	public double getSaldo(){
		if(this.saldo == 0){
			System.out.println("Conta sem nenhum valor disponível!");
		}
		return this.saldo;
	}
	public void deposita(double valor){
		if(valor <=  0){
			System.out.println("Valor não permitido!");
		}
		else{
			this.saldo = valor+saldo;
		}
	}
	boolean saca(double valor){
		if(this.saldo < valor){
			System.out.println("Valor de saldo Insuficiente!");
			this.saldo = saldo;
			return false;
		}
		else{
			this.saldo = saldo - valor;
			return true;
		}
	}
	
	boolean transeferePara(Conta destino, double valor){
		boolean retirou = this.saca(valor);
			if(retirou == false){
				System.out.println("Trasferencia não realizada saldo insuficiente");
				return false;
			}
			else{
				destino.deposita(valor);
				System.out.println("Transferencia realizada com sucesso!"+"\nValor Transferido :"+valor);
				
				return true;
			}
	}
		
	void imprime(){
		System.out.println("Titular : "+getDono()+"\nSaldo :"+getSaldo()+"\nNome :"+getName());
	}

}

class Programa{
public static void main(String[] args){
Conta minhaConta = new Conta();
Cliente c = new Cliente();
//minhaConta.setDono(“Joao”);
minhaConta.deposita(100.0);
minhaConta.saca(50.0);
c.setNome(“luiz”);
minhaConta.imprime();

}

}[/code]

eu coloquei meu metodo getName(), dentro da classe onde o está o atributo, porém não consigo “imprimi-lo”.

Este é outro erro:
error: cannot find symbol
traduzindo: “não foi possível encontrar o símbolo”

O marcador de posição está sobre a chamada “getName” (o marcador de posição é o sinal de circunflexo ‘^’), mas, mesmo que não queira observar o marcador de posição você ainda tem:
symbol: method getName()
location: class Conta

[quote=i_rodrigues]Cweiler, primeiramente obrigado estou estudando a linguagem java exatamente pela postila da Caelum. Pelo que entendi eu não posso acessar um atributo de uma determinada classe, em uma outra. Porem quando eu tento acessar o atributo nome da Classe Cliente dentro do escopo da propria classe veja o erro que me é emitido:

[/img]

veja o meu codigo como ficou:

[code]class Cliente{
private String nome;
private String sobrenome;
private String cpf;
private int idade;

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

private void validaCPF(String cpf){
	//regras para validacao
	System.out.println("CPF Validadado");
}

public void mudaCPF(String cpf){
	if(this.idade <= 60){
	validaCPF(cpf);	
	}
	this.cpf = cpf;
}

}

class Conta{
private int numero;
private String dono;
private double saldo;
private double limite;
private double novoSaldo;
Cliente titular = new Cliente();

	public String getDono(){
		return this.dono;
	}
	
	public void setDono(String dono){
		this.dono = dono;
	}
	
	public double getSaldo(){
		if(this.saldo == 0){
			System.out.println("Conta sem nenhum valor disponível!");
		}
		return this.saldo;
	}
	public void deposita(double valor){
		if(valor <=  0){
			System.out.println("Valor não permitido!");
		}
		else{
			this.saldo = valor+saldo;
		}
	}
	boolean saca(double valor){
		if(this.saldo < valor){
			System.out.println("Valor de saldo Insuficiente!");
			this.saldo = saldo;
			return false;
		}
		else{
			this.saldo = saldo - valor;
			return true;
		}
	}
	
	boolean transeferePara(Conta destino, double valor){
		boolean retirou = this.saca(valor);
			if(retirou == false){
				System.out.println("Trasferencia não realizada saldo insuficiente");
				return false;
			}
			else{
				destino.deposita(valor);
				System.out.println("Transferencia realizada com sucesso!"+"\nValor Transferido :"+valor);
				
				return true;
			}
	}
		
	void imprime(){
		System.out.println("Titular : "+getDono()+"\nSaldo :"+getSaldo()+"\nNome :"+getName());
	}

}

class Programa{
public static void main(String[] args){
Conta minhaConta = new Conta();
Cliente c = new Cliente();
//minhaConta.setDono(“Joao”);
minhaConta.deposita(100.0);
minhaConta.saca(50.0);
c.setNome(“luiz”);
minhaConta.imprime();

}

}[/code]

eu coloquei meu metodo getName(), dentro da classe onde o está o atributo, porém não consigo “imprimi-lo”.[/quote]

vc sabe dizer em que classe está o método “getName()” ?
Se seu titular de conta é um objeto da classe cliente, a chamada do seu método deveria ser “titular.getName()”

vc sabe dizer o que quer fazer para o cliente c dentro do main para o qual está setando o nome “luiz”?

Como o colega acima falou, é necessário vc entender o que são modificadores de acesso.
Outra sugestão de pesquisa seria:
buscar saber o que seja e quais as diferenças entre herança (extends) composição.
http://www.dsc.ufcg.edu.br/~jacques/cursos/map/html/pat/herancavscomposicao.htm

Obrigado pelo retorno, estarei lendo e estudando os materiais indicados por vocês e após isso posto aqui a evolução.

Luiz Augusto Prado,

Li o material que vc referenciou, percebi erros de minha parte no conceito, e gostaria de sua ajuda nisso. Quando vc me pergunta “vc sabe dizer em que classe está o método “getName()” ?” fiquei tentado em dar a resposta pronta que faz parte da classe ‘cliente’. Porém(ai que acredito está meu erro de conceito) tenho na minha classe ‘Conta’ o objeto(corrija se estiver errado qdo digo que é um objeto) ‘Cliente’ referenciado pela “variável” titular. Logo entendo que qdo quiser acessar qualquer atributo da classe ‘Cliente’ dentro do main, preciso fazê-lo a partir do ‘titular’, o que justifica chamar o método getName(), utilizando titular.getName(). Porém qdo crio um novo objeto ‘Cliente’ como o c por exemplo, não conseguir entender como setar valores em seus atributos. Devo utilizar o objeto titular da classe Conta? sendo que ele possui todos os atributos da classe ‘Cliente’? Mais o Cliente c já não é construído com os atributos de sua classe? Você poderia me ajudar com essas dúvidas?

[quote]Quando vc me pergunta “vc sabe dizer em que classe está o método “getName()” ?” fiquei tentado em dar a resposta pronta que faz parte da classe ‘cliente’. Porém(ai que acredito está meu erro de conceito) tenho na minha classe ‘Conta’ o objeto(corrija se estiver errado qdo digo que é um objeto) ‘Cliente’ referenciado pela “variável” titular. Logo entendo que qdo quiser acessar qualquer atributo da classe ‘Cliente’ dentro do main, preciso fazê-lo a partir do ‘titular’, o que justifica chamar o método getName(), utilizando titular.getName().
[/quote]

Correto.

[quote]
Porém qdo crio um novo objeto ‘Cliente’ como o c por exemplo, não conseguir entender como setar valores em seus atributos. [/quote]
vc só vai conseguir alterar os valores de seus atributos de qualquer cliente pelos métodos:
public String getName()
public void setNome(String nome)
public void mudaCPF(String cpf)

[quote]
Devo utilizar o objeto titular da classe Conta? sendo que ele possui todos os atributos da classe ‘Cliente’? Mais o Cliente c já não é construído com os atributos de sua classe? [/quote]
O objeto c no seu main não é o mesmo que o titular do seu objeto minhaConta. Apesar de ambas serem do mesmo tipo (cliente), elas não são as os mesmos objetos. Por isso que quiser modificar qualquer atributo dentro do seu objeto minhaConta ou vc insere a função para isso na sua classe conta, como fez para o dono, ou vc torna seu objeto publico no lugar de privado e altera diretamente. Assim:

mudar
private String dono;
para
public String dono;

desta forma vc conseguira fazer a alteração sem precisar utilizar o método setDono:
minhaConta.dono = luiz;

o mesmo serviria para Cliente titular = new Cliente();
que poderia ser
public Cliente titular = new Cliente();
onde permitiria vc alterar:

minhaConta.titular.setNome(“luiz”);

Luiz Augusto Prado, acredito que entendi sobre o controle de acesso aos atributos. Porém ao que estou confuso é no seguinte: a criacão do objeto ‘Cliente’ dentro da Classe ‘Conta’ através da “variável” titular não tem a intenção de sempre qdo eu criar um novo objeto ‘Conta’ ele já componha a classe ‘Cliente’ e seus atributos?

Se sim o meu entendimento é que quando eu criei o Cliente ‘c’ ele estava “apontando” para o titutlar que faz referencia a classe ‘Cliente’, e então setar o valor nome no cliente ‘c’ seria da seguinte forma: titular.c.setName();
Seria isso mesmo?

Se não então eu deveria setar o nome do cliente diretamente pelo metodo da classe ‘Cliente’ e “imprimir” utilizando o metodo da classe e não utilizando o “titular”.

Seria um desses pensamentos ou nenhum deles.

Também já quero agradecer a disponibilidade pelos esclarecimentos!

Uma classe é a definição para um objeto, quando você “cria um objeto” você possui uma instância.

No seu código:
Cliente titular = new Cliente();
Cliente c = new Cliente();

Você está criando 2 instâncias de objeto baseadas na classe Cliente.

Para ter referências a mesma instância deveria ser assim:
Cliente titular = new Cliente();
Cliente c = titular;

Então você teria 2 referências a 1 instância de objeto baseada na classe Cliente.

Já que você falou que está seguindo as apostilas da Caelum:
https://www.caelum.com.br/apostila-java-orientacao-objetos/orientacao-a-objetos-basica/#4-4-criando-e-usando-um-objeto

bom, fiz o mais simples…retirei do código o objeto “c” que faz referencia a classe “Cliente” e deixei apenas o objeto “titular”.
criei os metodos set e get dentro da classe “Cliente”. Dentro do main tentei aplicar o método setName() criado na classe “Cliente” através do “titular”; porém não tive sucesso!!! Veja como ficou o código:

[code]class Cliente{
private String nome;
private String sobrenome;
private String cpf;
private int idade;

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

public String getName(){
	return this.nome;
}

private void validaCPF(String cpf){
	//regras para validacao
	System.out.println("CPF Validadado");
}

public void mudaCPF(String cpf){
	if(this.idade <= 60){
	validaCPF(cpf);	
	}
	this.cpf = cpf;
}

}

class Conta{
private int numero;
private String dono;
private double saldo;
private double limite;
private double novoSaldo;
Cliente titular = new Cliente();

	public String getDono(){
		return this.dono;
	}
	
	public void setDono(String dono){
		this.dono = dono;
	}
	
	public double getSaldo(){
		if(this.saldo == 0){
			System.out.println("Conta sem nenhum valor disponível!");
		}
		return this.saldo;
	}
	public void deposita(double valor){
		if(valor <=  0){
			System.out.println("Valor não permitido!");
		}
		else{
			this.saldo = valor+saldo;
		}
	}
	boolean saca(double valor){
		if(this.saldo < valor){
			System.out.println("Valor de saldo Insuficiente!");
			this.saldo = saldo;
			return false;
		}
		else{
			this.saldo = saldo - valor;
			return true;
		}
	}
	
	boolean transeferePara(Conta destino, double valor){
		boolean retirou = this.saca(valor);
			if(retirou == false){
				System.out.println("Trasferencia não realizada saldo insuficiente");
				return false;
			}
			else{
				destino.deposita(valor);
				System.out.println("Transferencia realizada com sucesso!"+"\nValor Transferido :"+valor);
				
				return true;
			}
	}
		
	void imprime(){
		System.out.println("Titular : "+getDono()+"\nSaldo :"+getSaldo());
	}

}

class Programa{
public static void main(String[] args){
Conta minhaConta = new Conta();
titular.setName(“luiz”);
minhaConta.setDono(“Joao”);
minhaConta.deposita(100.0);
minhaConta.saca(50.0);

}

}[/code]

Em qual conceito posso estar falhando?

O erro que me é mostrado é esse:

Escopo, visibilidade, composição, … São diversos conceitos.

Este último erro vem do fato que titular não é visível no método main da classe Programa. titular foi criado dentro de minhaConta e é visível apenas no escopo desta última, ou seja, você precisa acessar titular através de minhaConta.

Veja bem, você está sofrendo com diversos erros de conceito que são importantíssimos, recomendo que você recomesse o curso da caellum, não se afobe e absorva os conceitos antes de seguir em frente, ou até procure um curso apenas de orientação a objetos em qualquer linguagem. Falo isso de boa fé, você pode encontrar ajuda aqui no fórum para resolver um ou outro erro de conceito, mas veja que você está saindo de um e caindo em outro.

CWeiler boa tarde,

creio que tenha razão os erros que estou cometendo são de conceitos de OO. Gostaria que pudessem me indicar algum material que explore apenas esses conceitos, para somente após isso eu entre no mérito da apostila da Caellum.

Falei isso para um amigo daqui do fórum outro dia e vou repetir pra você.

Saída da Matrix em relação a OO foi ao ler o “Use a cabeça, Java!”. Caiu como uma luva pra mim. :wink:

Abs []

adriano_si,

obrigado a você e aos demais colegas que vieram aqui passar algumas dicas. Irei procurar por esse material para fixar os conceitos de OO.
Abcs!