Java cuatro permisos de control de acceso

1. Antecedentes:

        Comprender los permisos de control de acceso de los miembros de la clase en Java

2.Java tiene cuatro permisos de control de acceso:

        privado, protegido, público, predeterminado

¿Cuáles son sus derechos de acceso específicos? Analicémoslo con un ejemplo:

Hay varios escenarios aquí: acceso interno, relación de herencia, mismo paquete, diferentes paquetes ;

(1) Primero necesitamos crear dos paquetes:

com.test.accessrights.pk1 y com.test.accessrights.pk2 se utilizan para probar las diferencias en los derechos de acceso entre diferentes paquetes.

Luego cree una clase padre como clase padre, colóquela en el paquete pk1 y luego cree los siguientes cuatro atributos:

public class Father {
    private String param1 ="这是private";
    protected String param2 ="这是protected";
    public String param3 = "这是public";
    String param4 ="这是default";
}

Luego pruebe si se puede acceder a las cuatro propiedades dentro de la clase Padre:

public class Father {

private String param1 ="这是private";
protected String param2 ="这是protected";
public String param3 = "这是public";
String param4 ="这是default";

public static void main(String[] args) {
    Father father = new Father();
        System.out.println("father 实例访问:"+father.param1);
        System.out.println("father 实例访问:"+father.param2);
        System.out.println("father 实例访问:"+father.param3);
        System.out.println("father 实例访问:"+father.param4);}
}

No hay errores de compilación en el código, se puede ver que los cuatro tipos admiten acceso dentro de la clase .

A continuación, cree una clase secundaria en el paquete pk1, herede la clase principal y acceda a las propiedades a través del objeto principal y el objeto secundario respectivamente.

public class Child extends Father{

public static void main(String[] args) {

Father father = new Father();
System.out.println(father.param2);
System.out.println(father.param3);
System.out.println(father.param4);

Child child = new Child();
System.out.println(child.param2);
System.out.println(child.param3);
System.out.println(child.param4);

}

}

Se puede ver que en el mismo paquete, las subclases pueden acceder a atributos y métodos de tipos distintos de los tipos privados de la clase principal .

(2) Entonces, si no están en el mismo paquete , ¿los derechos de acceso de la subclase siguen siendo los mismos que en el ejemplo anterior?

Creamos una clase Child2 en el paquete pk2, heredamos de la clase Father, creamos un objeto Father, accedemos a sus propiedades y descubrimos que solo se puede acceder a param3, que es el tipo público, y no se puede acceder a otros tipos.

 

Luego creo un objeto de la clase Child2 y accedo a los atributos de la clase principal a través de la subclase para ver cómo va. Encuentro que puede acceder a param2 y param3, que son tipos protegidos y públicos.

 

De esto se puede ver que paraprivado , solo se puede acceder dentro de la clase . Para protegido , actualmente, además del acceso interno , también se puede acceder a través de subclases , incluso en diferentes paquetes . Por defecto , además del acceso interno , las subclases deben cumplir las condiciones del mismo paquete si se accede a ellas . Para público , actualmente no hay restricciones .

(3) Entonces, ¿hay otras situaciones? Probemos a qué clases del mismo paquete que no están en una relación de herencia pueden acceder.

En el paquete pk1, cree una clase Stranger, cree objetos Father, Child, Child2 y vea cómo acceder a las propiedades.

public class Stranger {

public static void main(String[] args) {

Father father=new Father();
System.out.println("father对象访问:"+father.param2);
System.out.println("father对象访问:"+father.param3);
System.out.println("father对象访问:"+father.param4);

Child child = new Child();
System.out.println("child对象访问:"+child.param2);
System.out.println("child对象访问:"+child.param3);
System.out.println("child对象访问:"+child.param4);

Child2 child2 =new Child2();
System.out.println("child2对象访问:"+child2.param2);
System.out.println("child2对象访问:"+child2.param3);}
}

Tanto el objeto padre como el objeto hijo pueden acceder a otros atributos además de param1, lo que muestra que protegido en el mismo paquete satisface el acceso que no es de subclase en el mismo paquete, y el valor predeterminado también satisface el acceso que no es de subclase en el mismo paquete .

Child2 no es una clase en el mismo paquete para Stranger, por lo que Stranger solo puede acceder a los atributos param2 y param3 de Child2. ¿Qué significa esto?

Luego creamos una clase Stranger2 en pk2 y la usamos para acceder a las propiedades correspondientes a Father, Child y Child2.

public class Stranger2 {

public static void main(String[] args) {

Father father=new Father();
System.out.println("father 实例访问:"+father.param3);
Child child = new Child();

System.out.println("child 实例访问:"+child.param3);

Child2 child2 = new Child2();
System.out.println("child2 实例访问:"+child2.param3);}
}

Finalmente, descubrí que solo se puede acceder a param3, que es público. Hasta ahora, podemos saber que al menos público no tiene restricciones, mientras que privado tiene la mayor cantidad de restricciones . Entonces, ¿cuáles son las reglas para los otros dos, protegido y predeterminado? .

Como se puede ver en el ejemplo anterior, en el mismo paquete, las subclases pueden acceder al atributo protegido de la clase Padre, y también pueden acceder otras clases en el mismo paquete. En otros paquetes, el atributo protegido solo puede ser se accede en subclases a través de subclases. No se puede acceder al acceso a objetos a través del objeto padre y no se puede acceder en otras clases . En el mismo paquete, las subclases pueden acceder al atributo predeterminado de la clase Padre y también pueden acceder otras clases en el mismo paquete De Stranger2 La conclusión de los ejemplos en la clase es que otras clases en diferentes paquetes no pueden acceder al valor predeterminado, pero no se puede acceder a este atributo a través de child2 en la clase Stranger, y a través del ejemplo de la clase Child2, Se puede ver que tampoco se puede acceder al objeto child2. Acceder al atributo predeterminado de la clase Padre significa que las subclases de otros paquetes no pueden acceder al valor predeterminado, por lo que las clases de otros paquetes no pueden acceder al valor predeterminado, ya sea una subclase o no.

[Utilice una tabla para resumir]

Permisos de control de acceso (sí significa que puedes acceder)
privado por defecto protegido público
misma categoria
clases en el mismo paquete
Subclase
Clases en otros paquetes

Supongo que te gusta

Origin blog.csdn.net/u013302168/article/details/132483164
Recomendado
Clasificación