Public, private, protected, e qual o outro?

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…

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.

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:

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.

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:

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.

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

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…

Este link explica tudo.

Muito bom mesmo!

[]s

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

:idea:

[quote]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.[/quote]

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

[quote=Mak][quote]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.[/quote]

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

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

Blza … valeu

[quote=Bruno Laturner][quote=Mak][quote]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.[/quote]

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

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[/quote]

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();
	}
}

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

:idea: [/quote]

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.

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

:idea: [/quote]

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. [/quote]

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.

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?

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.

[quote=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.[/quote]

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