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

Exemplo PRÁTICO do acesso Default no Java

Olá!

Quando me disseram que o "default é acessível no pacote" não entendi bem.

Alguém poderia me dar um Exemplo PRÁTICO do acesso Default no Java, por favor ?

Com todas as possibilidades envolvidas: private, protected e public também.

Obrigado !

8 respostas

Os níveis são os que você disse: private, default, protected e public

Private: A única classe que tem acesso ao atributo é a própria classe que o define, ou seja, se uma classe Pessoa declara um atributo privado chamado nome, somente a classe Pessoa terá acesso a ele.

Default: Tem acesso a um atributo default (identificado pela ausência de modificadores) todas as classes que estiverem no mesmo pacote que a classe que possui o atributo.

Protected: Praticamente igual ao default, com a diferença de que se uma classe (mesmo que esteja fora do pacote) estende da classe com o atributo protected, ela terá acesso a ele. Então o acesso é por pacote e por herança.

Public: Todas as classes do projeto tem acesso :)

Oi.

Alguém tem um exemplo COM código?

Obrigado

Opa, ainda estou na espera. :-)

Vamos la Marcelo:

Primeiro vamos criar uma classe Carro com um método para ligar o carro:

package br.com.modelo;

public class Carro {

    void ligar() {
        System.out.println("Liguei o carro");
    }

}

Repare que a classe se encontra no pacote br.com.modelo, então vamos criar uma outra classe responsável por testar o método ligar:

package br.com.modelo;

public class LigarCarro {

    public static void main(String[] args) {
        Carro carro = new Carro();
        carro.ligar();
    }

}

Veja novamente que ambas estão no mesmo pacote, então tudo irá funcionar, pois o modificar de acesso default é publico para o próprio pacote.

Porém se criarmos uma outra classe, com o mesmo método main, FORA do pacote onde se localiza a classe Carro, o código não irá funcionar:

package br.com.controller;

import br.com.modelo.Carro;

public class LigarCarroFora {

    public static void main(String[] args) {
        Carro carro = new Carro();
        carro.ligar();
    }

}

Veja que o código nem compila, pois o método ligar não é visível para a classe LigarCarroFora, podemos resolver o problema tornando o método publico ou adicionado a classe no mesmo pacote da classe Carro.

Espero ter ajudado.

Ajudou bastante!

Agora nesse mesmo contexto, faz uma brincadeira com um método "protected", por favor.

Obrigado.

solução!

Vamos:

Imagine que temos uma classe Carro dentro do pacote br.com.modelo:

package br.com.modelo;

public class Carro {

    protected void liga() {
        System.out.println("Vruuum!!!");
    }

}

Se criarmos uma outra classe no mesmo pacote para ligar o carro, a mesma irá funcionar:

package br.com.modelo;

public class LigaCarro {

    public static void main(String[] args) {
        Carro c = new Carro();
        c.liga();
    }

}

Porém se a classe para ligar o carro esteja em outro pacote, o código não iria compilar, pois o modificador de acesso protected só pode ser acessado por classes do mesmo pacote ou classes filhas(extends):

package br.com.modelo2;

import br.com.modelo.Carro;

public class LigaForaDoPacote {

    public static void main(String[] args) {
        Carro c = new Carro();
        c.liga();
    }

}

O código acima não compila, para resolver o problema devemos definir o método liga como público ou criar uma nova classe no pacote br.com.modelo2 que herde de Carro e chame o método liga:

package br.com.modelo2;

import br.com.modelo.Carro;

public class CarroForaDoPacote extends Carro {

    public void ligaDaMae() {
        super.liga();
    }

}

Assim, podemos refatorar a classe LigaForaDoPacotepara utilizar a classe CarroForaDoPacote, pois ao herdar de carro, por mais que as classes sejam de pacotes diferentes, é possível acessar o método pois esta definido como protected.

package br.com.modelo2;

public class LigaForaDoPacote {

    public static void main(String[] args) {
        CarroForaDoPacote c = new CarroForaDoPacote();
        c.ligaDaMae();
    }

}

Espero ter ajudado.

Ajudou sim, obrigado.

De nada, sempre que precisar não deixe de criar suas dúvidas.