Public, private, protected, e qual o outro?

25 respostas
wellington7

No eclipse, se eu não colocar um modificador de acesso ele mostra na árvore um simbolo diferente de public, private ou protected, mostra um triangulo… alguém sabe o que quer dizer? Qual o acesso de um metodo que não especifica o acesso? Imaginei que fosse public, pois consigo acessá-lo em outras classes…

25 Respostas

Rafael_Nunes

Default ou package. Que é o modificador quando você não tem nenhum modificador.
Significa que você só terá acesso dentro das classes do mesmo pacote.

francislon

Quando você não declara o tipo de acesso da sua classe ela fica como classe do pacote(package). Ou seja, você poderá se comunicar com suas classes do mesmo pacote. :slight_smile:

F

public
Estes atributos e métodos são sempre acessíveis em
todos os métodos de todas as classes. Este é o nível
menos rígido de encapsulamento, que equivale a não
encapsular.

private
Estes atributos e métodos são acessíveis somente nos
métodos (todos) da própria classe. Este é o nível mais
rígido de encapsulamento.

protected
Estes atributos e métodos são acessíveis no pacote, nos
métodos da própria classe e suas subclasses, o que será
visto em Herança.

(sem nenhuma definição: private, protected ou public)Visível no pacote e na classe.
L

Só pra constar,

não existe uma palavra chave no Java pra classificar como “Default ou package”. Se vc quer usar esse modificador é só não colocar nada mesmo. Se escrever “default” é pauuuuu! :smiley:

neohacker

Só uma observação, se não me engano o nome deste modificador é friendly-package.
Mas não achei em nenhum lugar aqui pra ver como se escreve. Se alguém conhecer post o nome correto aqui please.

J

http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html

LPJava

o triangulo nao quer dizer erro e sim apenas atenção que o eclipse faz… pq normalmente as variaveis devem ser declaradas como private para uma boa OO… mas seu codigo compila e roda tranquilo… porem se fosse vermelho ele nem compilava…

A

Este link explica tudo.

jPscoralicK

Muito bom mesmo!

[]s

kaabah

Lembrando que a classe que herda métodos protected, nessa classe filha esses métodos tornam-se private. :wink:

:idea:

M

protected
Estes atributos e métodos são acessíveis no pacote, nos
métodos da própria classe e suas subclasses, o que será
visto em Herança.

<default>
(sem nenhuma definição: private, protected ou public)Visível no pacote e na classe.

Mas entre protected e <default> qual seria a diferença?? os atributos e métodos <default> não seriam visíveis nas subclasses??

B

Mak:
protected
Estes atributos e métodos são acessíveis no pacote, nos
métodos da própria classe e suas subclasses, o que será
visto em Herança.

<default>
(sem nenhuma definição: private, protected ou public)Visível no pacote e na classe.

Mas entre protected e <default> qual seria a diferença?? os atributos e métodos <default> não seriam visíveis nas subclasses??

Não, atributos e métodos com modificadores package-private não são vistos pelas subclasses.

Veja a documentação:
http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html

M

Blza … valeu

ECO2004

Bruno Laturner:
Mak:
protected
Estes atributos e métodos são acessíveis no pacote, nos
métodos da própria classe e suas subclasses, o que será
visto em Herança.

<default>
(sem nenhuma definição: private, protected ou public)Visível no pacote e na classe.

Mas entre protected e <default> qual seria a diferença?? os atributos e métodos <default> não seriam visíveis nas subclasses??

Não, atributos e métodos com modificadores package-private não são vistos pelas subclasses.

Veja a documentação:
http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html

Meu amigo, atributos e métodos com modificadores package e são vistos pelas subclasses sim!
Somente tem de respeitar estarem no mesmo pacote e, logicamente, haver herança.
Olha um exemplo:

package pk1;

public class C1 
{
	static int var = 4; // qualificador default, "package"
	
	void f1()
	{
		System.out.println("C1");
	}
}

class C4 extends C1
{
	public static void main(String []args)
	{
		C4 c = new C4();
		System.out.println(var);
		c.f1();
	}
}
ECO2004

kaabah:
Lembrando que a classe que herda métodos protected, nessa classe filha esses métodos tornam-se private. :wink:

:idea:

Eu nunca ouvi isso. Aliás, fui verificar e não procede…

package pk1;

public class C1 
{
	protected void f1()
	{
		System.out.println("C1");
	}
}

class C4 extends C1
{

}

class C5 extends C4
{
	void funcao()
	{
		C4 c = new C4();
		c.f1();
	}
	
	public static void main(String []args)
	{
		C5 c = new C5();
		c.funcao();
	}
}

C4 herda f1() de C1 que é protected. C5 herda de C4 f1(), que ainda é protected. C5 acessa f1() de C4. Sucesso.

Se vc tiver um exemplo da sua afirmativa, ajudaria.

C

ECO2004:
kaabah:
Lembrando que a classe que herda métodos protected, nessa classe filha esses métodos tornam-se private. :wink:

:idea:

Eu nunca ouvi isso. Aliás, fui verificar e não procede…

package pk1;

public class C1 
{
	protected void f1()
	{
		System.out.println("C1");
	}
}

class C4 extends C1
{

}

class C5 extends C4
{
	void funcao()
	{
		C4 c = new C4();
		c.f1();
	}
	
	public static void main(String []args)
	{
		C5 c = new C5();
		c.funcao();
	}
}

C4 herda f1() de C1 que é protected. C5 herda de C4 f1(), que ainda é protected. C5 acessa f1() de C4. Sucesso.

Se vc tiver um exemplo da sua afirmativa, ajudaria.

Eles não se tornam private, o que acontece é que se a classe que herda os métodos ou variáveis de instância protected não estiver no mesmo pacote da classe pai, ela só poderá
acessar esses métodos ou variáveis, através de herança.

R

Galera, fiz o seguinte código:

package pk1;

public class C1 {

  protected void f() {
    System.out.println("C1");

  }
}

Outro pacote.

package pk2;

import pk1.C1;

public class C2 extends C1 {
  public static void main(final String[] args) {
    final C1 c = new C2();
    c.f(); // Erro de visibilidade, não compila  
  }

  
  public void f() {
    System.out.println("C2");
  }
  
}

Segundo a regra de visibilidade (http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html) , não deveria acontecer erro de compilação.
Vocês poderiam me ajudar?

Rodrigo_Sasaki

não, não deveria.

membros marcados com o modificador de acesso protected são visíveis às classes do mesmo pacote, e também às classes filhas. portanto uma classe filha herda os membros protected do pai, que é o que ocorre no seu caso.

R

digaoneves:
não, não deveria.

membros marcados com o modificador de acesso protected são visíveis às classes do mesmo pacote, e também às classes filhas. portanto uma classe filha herda os membros protected do pai, que é o que ocorre no seu caso.

Cara, eu também achava isso, mas olha o erro que dá no console:

[b91f@linux184 src]$ javac pk2/C2.java
pk2/C2.java:8: f() has protected access in pk1.C1
c.f();
^
1 error

Rodrigo_Sasaki

Ah sim, mas isso que você está fazendo realmente não é possível,

você está tentando acessar o atributo de C1 em C2, mas pela variável de referência de C1.

o que você pode fazer é acessar o membro herdado. você invoca ele como se fosse seu próprio. Assim:
public class C2 extends C1{

    public static void main(final String[] args){
        C2 c2 = new C2();
        c2.f();
    }

}
Fez sentido ?
R
digaoneves:
Ah sim, mas isso que você está fazendo realmente não é possível,

você está tentando acessar o atributo de C1 em C2, mas pela variável de referência de C1.

o que você pode fazer é acessar o membro herdado. você invoca ele como se fosse seu próprio. Assim:
public class C2 extends C1{

    public static void main(final String[] args){
        C2 c2 = new C2();
        c2.f();
    }

}
Fez sentido ?

Concordo, inclusive resolvi assim, mas ele funciona se eu colocar tudo no mesmo pacote e, obviamente, funciona se eu colocar em f() como publica em C1.

Rodrigo_Sasaki

Você entende o motivo disso, correto ?

R

Você entende o motivo disso, correto ?

Sim, protected é menos restrivo que default, mas acho estranho eu não poder generalizar fazendo C1 c = new C2(); em outro pacote, já que há herança. Ter que fazer typecast aí me parece forçar a barra, mas tudo bem.

Rodrigo_Sasaki

É, o protected é meio confuso.

quando você herda um membro protected, você tem que ver ele como se fosse um membro private seu, que você acessa diretamente. Pelo menos eu penso assim :slight_smile: E se não me engano no livro da Kathy Sierra e do Bert Bates, eles fazem um comentário parecido com esse.

R

É, o protected é meio confuso.

quando você herda um membro protected, você tem que ver ele como se fosse um membro private seu, que você acessa diretamente. Pelo menos eu penso assim :slight_smile: E se não me engano no livro da Kathy Sierra e do Bert Bates, eles fazem um comentário parecido com esse.

Valeu pela ajuda!
Abraços!

Criado 10 de maio de 2007
Ultima resposta 23 de jul. de 2012
Respostas 25
Participantes 17