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

Modificador Public

Faço graduação em Sistemas de Informação, minha professora foi bastante confusa ao falar deste modificador (public), dando a entender que pode ser acessado até por não filhos da classe em questão.

Gostaria de mais detalhes sobre ele.

6 respostas

O modificador public deixa qualquer classe acessar o metodo da classe que esta com esse modificador.

Gosto de pensar nos modificadores de acesso como se fosse um celular;

O modificador public funcionaria como se você não configurasse nenhum padrão, senha ou pin de segurança. Qualquer um pode acessar o seu celular dessa maneira.

O modificador protected funcionaria como se você tivesse configurado um dos métodos de segurança mencionados acima. Qualquer um que saiba ou tenha visto o seu padrão, senha ou pin consegue acessar o seu celular (nessa analogia, o "qualquer um" refere-se a uma classe filha ou quem está contido no mesmo pacote, que são quem tem acesso ao que é protected).

Já o modificador private seria o sensor biométrico ou o FaceID, somente quem é dono - você - pode acessar o celular dessa forma.

Na minha analogia, o default (package private) seria alguém que está perto de você e bisbilhota sua senha (ou padrão ou pin) e também consegue acessar seu celular por causa disso.

Isso não faz sentido para mim O que quer dizer que qualquer um tem acesso?

Pelo que vejo apenas classes filhas podem acessar, meu problema não é com o ou modificadores limitadores, é com o public mesmo.

public class teste {

    public static void main(String[] args) {
        testar();
    }
}

class testadora{
    public void testar() {
        System.out.println("Testando");
    }
}

O código acima não funciona. Se todo mundo pode acessar, então eu não precisaria herdar para utilizar o método, mas, não é o que acontece.

Elias, ao criar um objeto daquela classe os métodos public estarão acessíveis. Os métodos protected apenas se a classe que criou o objeto for dentro do mesmo pacote. Os métodos private só são acessíveis pela classe original.

Para o seu código funcionar:

public class teste {

    public static void main(String[] args) {
        testadora teste = new testadora();
        // Cria o objeto testadora na variavel teste
        teste.testar();
        // chama o método public testar do objeto test
    }
}

class testadora{
    public void testar() {
        System.out.println("Testando");
    }
}
solução!

Elias,

Só complementando o que o Gustavo falou, você não precisa "herdar" da outra classe. Herdar tem a ver com o extends e não é necessário estender da outra classe para utilizar o método.

Talvez você estivesse querendo falar sobre criar um referência a um objeto e aí a questão muda um pouco. Para métodos "normais", somente um objeto consegue utilizá-los. Por isso você precisa primeiro criar a referência e instanciá-lo.

Na minha analogia do celular, o celular é objeto, por exemplo. Sem ele, não faz sentido falar de acessar algo ou não (os botões, os apps, as configurações)

Para utilizar o método sem criar um objeto, ele precisaria ser static (aí ele seria um método da classe e não do objeto) e isso não tem nada a ver com ele ser public ou não. Acho que ficou um pouco confuso pra você a questão de "o que é acesso".

EDIT: o que eu quis dizer com qualquer um tem acesso, é que você instancia um objeto numa classe e você pode utilizar qualquer método ou atributo public dele. Se você tentar fazer o mesmo em classes de pacotes diferentes, por exemplo, os métodos default já não conseguem ser acessados. E se a classe em questão não for filha da classe que você está instanciando o objeto, então os protected também não serão acessíveis.

Obrigado pessoal, agora entendi.

É que como quem chama o método é sempre um objeto da tal classe que possui o método eu não entendia como poderia outra classe ter acesso a ele.

Na verdade o objeto da tal classe, se instanciado dentro de outra classe que não tenha relação com a do tipo do objeto sofre limitação nos métodos da sua classe. Agora saquei.

Para tal, se servir de exemplo, usei os seguintes códigos :

package teste;

import testePacotes.testadora;

public class teste {

    public static void main(String[] args) {
        testadora teste = new testadora();
        teste.testar();
    }
}


package testePacotes;

public class testadora{
    void testar() {
        System.out.println("Testando");
    }
}

Da forma acima não compila o código pela limitação do default, notem que as classes estão em pacotes diferentes. Para compilar preciso colocar o método testar como público, mesmo que o objeto teste seja do tipo testadora ele não consegue acessar o método testar() porque ele não pode ser acessado de dentro da classe teste

Segue o exemplo que compila.

package teste;

import testePacotes.testadora;

public class teste {

    public static void main(String[] args) {
        testadora teste = new testadora();
        teste.testar();
    }
}


package testePacotes;

public class testadora{
    public void testar() {
        System.out.println("Testando");
    }
}

Peço desculpas pelos nomes meio confusos, eu fiz pra ir testando depois resolvi postar para ajudar quem acesse no futuro já ver no código a diferença.

Mais uma vez, muito obrigado pessoal, ajudaram muito eu tenho essa pulga atrás da orelha desde quase um ano atrás já.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software