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.
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á.