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.
ATÉ 50% OFF
TÁ ACABANDO!
0 dias
0 horas
0 min
0 seg
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.
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");
}
}
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á.