java - example - private public protected c#
¿El acceso de los miembros "paquete privado" no es sinónimo del acceso predeterminado(sin modificación)? (7)
''Paquete privado'' y el acceso predeterminado son los mismos. En las primeras versiones del compilador alrededor de 1.1.2 / 3, ''paquete'' era un modificador permitido, pero ignorado, lo que significa lo mismo que ningún modificador, es decir, ''paquete privado''. Poco después, hubo una moda efímera para poner /*package*/
(como comentario) en tales situaciones. Del mismo modo, en ese momento podría declarar cosas como clases sincronizadas, aunque nuevamente no hubo un efecto semántico real.
Ninguno de ellos es lo mismo que ''protected'', que se extiende a las clases derivadas en otros paquetes.
Estoy un poco confundido sobre el término "paquete privado" que usa parte de la documentación, junto con el uso del "acceso predeterminado". ¿El paquete no es privado y el acceso predeterminado también está protegido?
Desde Java Language Spec
- 6.6.5 Ejemplo: campos de acceso predeterminado, métodos y constructores Si no se especifica ninguno de los modificadores de acceso public, protected o private, se puede acceder a un miembro de la clase o un constructor en todo el paquete que contiene la declaración de la clase en la que miembro es declarado, pero el miembro de la clase o el constructor no es accesible en ningún otro paquete.
Si una clase pública tiene un método o constructor con acceso predeterminado, este método o constructor no es accesible o no se hereda por una subclase declarada fuera de este paquete
El acceso predeterminado para las clases es de paquete privado, sin embargo, el acceso predeterminado para los miembros de la interfaz es público.
p.ej
public interface I {
int A = 1;
// same as
public static final int A = 1;
void method();
// same as
public abstract void method();
class C { }
// same as
public static class C { }
}
Las reglas de acceso predeterminadas para las interfaces no son las mismas que para las clases.
El modificador de acceso "predeterminado" (aquel en el que ninguno de ellos se da explícitamente) es "paquete-privado", lo que significa que solo las cosas en el mismo paquete pueden acceder a ellos. Sin embargo, estar en el mismo paquete no implica nada sobre la relación de herencia entre las clases, es puramente una convención de nomenclatura.
"Protegido" significa que no solo las clases del mismo paquete, sino también las subclases (independientemente del paquete en el que estén dichas subclases) podrán acceder a ellas.
El paquete privado y el acceso predeterminado son sinónimos. Un objeto también puede acceder al miembro protegido de los objetos cuyas clases están en el mismo paquete. Un objeto también puede acceder al miembro protegido de sus superclases sin una condición sobre su paquete. Como un ejemplo concreto:
package ab;
class A {
protected void foo() {}
void dd(){}
}
class C {
void aa(){
A a = new A();
a.foo(); //legal
a.dd(); //legal
}
}
package sub;
class D extends A{
void ac(){
foo(); //legal ..
dd(); //illegal.. because dd has default access..
}
class E {
void ee(){
A a = new A();
a.foo(); //illegal
a.dd(); //illegal
}
Sí, es casi lo mismo. El modificador protegido especifica que solo se puede acceder al miembro dentro de su propio paquete (como con package-private) y, además , mediante una subclase de su clase en otro paquete.
el valor predeterminado y el paquete privado son los mismos, lo que significa que ambos pueden ser utilizados por cualquier clase hasta que estén en el mismo paquete.
El término paquete privado , en realidad, se denomina significado del modificador privado ya que privado significa que está disponible solo en la misma clase y que ninguna otra clase o subclases puede acceder a él dentro del mismo paquete o sin él.
Por lo tanto, el paquete privado significa lo mismo que el predeterminado .