Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Não está funcionando

Apesar do modificador "protected", o compilador acusa erro (The field Conta.saldo is not visible) e sugere trocar o modificador para "public" (Change visibility of 'saldo' to 'public').

//CLASSE Contas; package br.com.bytebank.banco.modelo; public abstract class Conta { protected double saldo; private int agencia; private int numero; private Cliente titular; private static int total = 0; // CODIGO OMITIDO; }

//CLASSE ContaEspecial; package br.com.bytebank.banco.especial; import br.com.bytebank.banco.modelo.Conta; public class ContaEspecial extends Conta { public ContaEspecial(int agencia, int numero) { super(agencia, numero); } //CODIGO OMITIDO; }

//CLASSE TestaContas; package br.com.bytebank.banco.test; import br.com.bytebank.banco.especial.ContaEspecial; import br.com.bytebank.banco.modelo.ContaCorrente; import br.com.bytebank.banco.modelo.ContaPoupanca; import br.com.bytebank.banco.modelo.SaldoInsuficienteException; public class TesteContas { public static void main(String[] args) throws SaldoInsuficienteException{ //int a = 3; //int b = a / 0; //ContaCorrente outra = null; //outra.deposita(200.0); ContaCorrente cc = new ContaCorrente(111, 111); cc.deposita(100.0); ContaPoupanca cp = new ContaPoupanca(222, 222); cp.deposita(200.0); cc.transfere(10.0, cp); System.out.println("CC: " + cc.getSaldo()); System.out.println("CP: " + cp.getSaldo()); ContaEspecial ce = new ContaEspecial(3333, 44444); //AQUI O ERRO DO COMPILADOR; System.out.println(ce.saldo); } }

4 respostas

Olá Sergio, tudo tranquilo?

O modificador protected dá acesso ao pacote e às classes filhas. No caso, a classe TestaContas não herda de nenhuma das Contas, e nem está no mesmo pacote. Portanto, para que TestaContas tenha acesso ao saldo, é preciso mudar a visibilidade do atributo para public (todos tem acesso) ou, o que é mais recomendável nesse caso, simplesmente usar o getSaldo() implementado nas contas.

System.out.println(ce.getSaldo());

Testa aí e veja se faz sentido para você. Qualquer dúvida estou à disposição!

Abraços e bons estudos!!

Olá Thiago, tudo bem? Sim, claro que com public funciona, mas o problema é: por que não funciona com protected? A filha de Conta, no caso, não é classe a TestaContas, mas a classe ContaEspecial, cujo saldo é protected, e ce.saldo referencia a ContaEspecial. Aliás, é o que o exercício manda verificar, veja:

==============================

4) Na classe Conta, remova o protected do atributo saldo, transformando-o em package private.

5) Veja que mesmo a classe ContaEspecial sendo uma classe filha de Conta, ela não tem acesso ao atributo package private.

6) Coloque novamente o protected e verifique que sua classe filha volta a ter acesso ao atributo da classe mãe mesmo estando em outro pacote.

OBS: Só é visível para os filhos!

Opa Sergio! Tranquilo?

Mesmo a ContaEspecial sendo filha de Conta e tendo acesso ao saldo dentro de sua própria classe, isso não significa que poderemos chamar o saldo diretamente em outras classes. Até porque isso quebraria o princípio do Encapsulamento! Lembrando que o encapsulamento prega que devemos esconder e restringir as informações das nossas classes, deixando essas informações disponíveis apenas através de métodos.

No caso do exercício, que eu admito que ficou confuso por não deixar claro onde e como deveríamos testar esse acesso ao saldo, a motivação é mostrar que dentro da classe ContaEspecial nós podemos manipular o saldo protected livremente. Mas fora as classes que estão no mesmo pacote que Conta e a própria ContaEspecial, nós só podemos acessar o saldo através dos métodos. Caso contrário, ContaEspecial se tornaria uma vulnerabilidade onde bastaria instanciar ela em qualquer lugar do nosso sistema que teríamos acesso à seus atributos protected.

Não sei se consegui ser claro na explicação, mas me avisa aqui se algum ponto não fez sentido! Realmente não é a toa que até o Nico concorda que o modificador protected é o mais chatinho de entender!

Abraços!!

solução!

Ok Thiago, acho que entendi. Obrigado!