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:
classCliente{privateStringnome;privateStringsobrenome;privateStringcpf;privateintidade;publicvoidsetNome(Stringnome){this.nome=nome;}privatevoidvalidaCPF(Stringcpf){//regras para validacaoSystem.out.println("CPF Validadado");}publicvoidmudaCPF(Stringcpf){if(this.idade<=60){validaCPF(cpf);}this.cpf=cpf;}}classConta{privateintnumero;privateStringdono;privatedoublesaldo;privatedoublelimite;privatedoublenovoSaldo;Clientetitular=newCliente();publicClientegetName(){returnthis.titular.nome;}
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?
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:
classCliente{privateStringnome;privateStringsobrenome;privateStringcpf;privateintidade;publicStringgetName(){returnthis.nome;}publicvoidsetNome(Stringnome){this.nome=nome;}privatevoidvalidaCPF(Stringcpf){//regras para validacaoSystem.out.println("CPF Validadado");}publicvoidmudaCPF(Stringcpf){if(this.idade<=60){validaCPF(cpf);}this.cpf=cpf;}}classConta{privateintnumero;privateStringdono;privatedoublesaldo;privatedoublelimite;privatedoublenovoSaldo;Clientetitular=newCliente();publicStringgetDono(){returnthis.dono;}publicvoidsetDono(Stringdono){this.dono=dono;}publicdoublegetSaldo(){if(this.saldo==0){System.out.println("Conta sem nenhum valor disponível!");}returnthis.saldo;}publicvoiddeposita(doublevalor){if(valor<=0){System.out.println("Valor não permitido!");}else{this.saldo=valor+saldo;}}booleansaca(doublevalor){if(this.saldo<valor){System.out.println("Valor de saldo Insuficiente!");this.saldo=saldo;returnfalse;}else{this.saldo=saldo-valor;returntrue;}}booleantranseferePara(Contadestino,doublevalor){booleanretirou=this.saca(valor);if(retirou==false){System.out.println("Trasferencia não realizada saldo insuficiente");returnfalse;}else{destino.deposita(valor);System.out.println("Transferencia realizada com sucesso!"+"\nValor Transferido :"+valor);returntrue;}}voidimprime(){System.out.println("Titular : "+getDono()+"\nSaldo :"+getSaldo()+"\nNome :"+getName());}}classPrograma{publicstaticvoidmain(String[]args){ContaminhaConta=newConta();Clientec=newCliente();//minhaConta.setDono("Joao");minhaConta.deposita(100.0);minhaConta.saca(50.0);c.setNome("luiz");minhaConta.imprime();}}
eu coloquei meu metodo getName(), dentro da classe onde o está o atributo, porém não consigo "imprimi-lo".
CWeiler
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
Luiz_Augusto_Prado
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:
classCliente{privateStringnome;privateStringsobrenome;privateStringcpf;privateintidade;publicStringgetName(){returnthis.nome;}publicvoidsetNome(Stringnome){this.nome=nome;}privatevoidvalidaCPF(Stringcpf){//regras para validacaoSystem.out.println("CPF Validadado");}publicvoidmudaCPF(Stringcpf){if(this.idade<=60){validaCPF(cpf);}this.cpf=cpf;}}classConta{privateintnumero;privateStringdono;privatedoublesaldo;privatedoublelimite;privatedoublenovoSaldo;Clientetitular=newCliente();publicStringgetDono(){returnthis.dono;}publicvoidsetDono(Stringdono){this.dono=dono;}publicdoublegetSaldo(){if(this.saldo==0){System.out.println("Conta sem nenhum valor disponível!");}returnthis.saldo;}publicvoiddeposita(doublevalor){if(valor<=0){System.out.println("Valor não permitido!");}else{this.saldo=valor+saldo;}}booleansaca(doublevalor){if(this.saldo<valor){System.out.println("Valor de saldo Insuficiente!");this.saldo=saldo;returnfalse;}else{this.saldo=saldo-valor;returntrue;}}booleantranseferePara(Contadestino,doublevalor){booleanretirou=this.saca(valor);if(retirou==false){System.out.println("Trasferencia não realizada saldo insuficiente");returnfalse;}else{destino.deposita(valor);System.out.println("Transferencia realizada com sucesso!"+"\nValor Transferido :"+valor);returntrue;}}voidimprime(){System.out.println("Titular : "+getDono()+"\nSaldo :"+getSaldo()+"\nNome :"+getName());}}classPrograma{publicstaticvoidmain(String[]args){ContaminhaConta=newConta();Clientec=newCliente();//minhaConta.setDono("Joao");minhaConta.deposita(100.0);minhaConta.saca(50.0);c.setNome("luiz");minhaConta.imprime();}}
eu coloquei meu metodo getName(), dentro da classe onde o está o atributo, porém não consigo "imprimi-lo".
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"?
Obrigado pelo retorno, estarei lendo e estudando os materiais indicados por vocês e após isso posto aqui a evolução.
I
i_rodrigues
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?
Luiz_Augusto_Prado
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().
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?
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:
mudarprivateStringdono;parapublicStringdono;
desta forma vc conseguira fazer a alteração sem precisar utilizar o método setDono:
minhaConta.dono = 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!
CWeiler
Uma classe é a definição para um objeto, quando você “cria um objeto” você possui uma instância.
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:
classCliente{privateStringnome;privateStringsobrenome;privateStringcpf;privateintidade;publicvoidsetName(Stringnome){this.nome=nome;}publicStringgetName(){returnthis.nome;}privatevoidvalidaCPF(Stringcpf){//regras para validacaoSystem.out.println("CPF Validadado");}publicvoidmudaCPF(Stringcpf){if(this.idade<=60){validaCPF(cpf);}this.cpf=cpf;}}classConta{privateintnumero;privateStringdono;privatedoublesaldo;privatedoublelimite;privatedoublenovoSaldo;Clientetitular=newCliente();publicStringgetDono(){returnthis.dono;}publicvoidsetDono(Stringdono){this.dono=dono;}publicdoublegetSaldo(){if(this.saldo==0){System.out.println("Conta sem nenhum valor disponível!");}returnthis.saldo;}publicvoiddeposita(doublevalor){if(valor<=0){System.out.println("Valor não permitido!");}else{this.saldo=valor+saldo;}}booleansaca(doublevalor){if(this.saldo<valor){System.out.println("Valor de saldo Insuficiente!");this.saldo=saldo;returnfalse;}else{this.saldo=saldo-valor;returntrue;}}booleantranseferePara(Contadestino,doublevalor){booleanretirou=this.saca(valor);if(retirou==false){System.out.println("Trasferencia não realizada saldo insuficiente");returnfalse;}else{destino.deposita(valor);System.out.println("Transferencia realizada com sucesso!"+"\nValor Transferido :"+valor);returntrue;}}voidimprime(){System.out.println("Titular : "+getDono()+"\nSaldo :"+getSaldo());}}classPrograma{publicstaticvoidmain(String[]args){ContaminhaConta=newConta();titular.setName("luiz");minhaConta.setDono("Joao");minhaConta.deposita(100.0);minhaConta.saca(50.0);}}
Em qual conceito posso estar falhando?
O erro que me é mostrado é esse:
CWeiler
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.
I
i_rodrigues
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.
adriano_si
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.
Abs []
I
i_rodrigues
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!