El concepto de encapsulación de Java no está claro

Esta es una pregunta básica, pero aún no entiendo el concepto de encapsulación. No entendí cómo podemos cambiar las propiedades de la clase de otra clase. Porque cada vez que intentamos establecer el valor de la instancia pública de la clase, tenemos que crear el objeto de esa clase y luego establecer el valor. Y cada objeto se refiere a la memoria diferente .so incluso si cambiamos el valor de la instancia, esto no afectará a ningún otro objeto.

Incluso trato de cambiar utilizando el valor de instancia pública estática, y tampoco puedo cambiar el valor de la propiedad de la clase.

El ejemplo se da a continuación

// Employee class public class Employee { public static int empid; public static String empname; public static void main(String[] args) { System.out.println("print employe details:"+empid+" "+empname); } // EmployeeTest class public class EmployeeTest { public static void main(String[] args) { Employee e = new Employee(); e.empid=20; e.empname="jerry"; Employee.empid=10; Employee.empname="tom"; } } } 

Cada vez que ejecuto clase de Employee obtengo el mismo valor

print employe details:0 null

Aunque no sigo el concepto de encapsulación y no puedo cambiar el valor de instancia pública de la clase de empleado. Por favor, ayúdame a entender el concepto de que me estoy equivocando.

Sí, esto puede ser un poco confuso a veces. Vamos paso a paso: primero, debes entender

  • ¿Qué es la encapsulación y por qué se usa?

La encapsulación es uno de los cuatro conceptos fundamentales de POO. La encapsulación es la técnica para hacer que los campos de una clase sean privados y proporcionar acceso a los campos a través de métodos públicos. Si un campo se declara privado, nadie podrá acceder a él fuera de la clase, ocultando así los campos dentro de la clase. Por esta razón, la encapsulación también se denomina ocultación de datos.

La encapsulación puede describirse como una barrera protectora que impide que el código y los datos sean accedidos aleatoriamente por otro código definido fuera de la clase. El acceso a los datos y el código está estrechamente controlado por una interfaz.

El principal beneficio de la encapsulación es la capacidad de modificar nuestro código implementado sin romper el código de otros que usan nuestro código. Con esta característica, la encapsulación brinda facilidad de mantenimiento, flexibilidad y extensibilidad a nuestro código.

Tome un pequeño ejemplo:

 public class EncapTest{ private String name; private String idNum; private int age; public int getAge(){ return age; } public String getName(){ return name; } public String getIdNum(){ return idNum; } public void setAge( int newAge){ age = newAge; } public void setName(String newName){ name = newName; } public void setIdNum( String newId){ idNum = newId; } } 

Los métodos anteriores se llaman Accessors (también conocidos como getters y setters). Ahora puedes preguntar,

  • ¿Por qué deberías usar accesorios? En realidad, hay muchas buenas razones para considerar el uso de accesadores en lugar de exponer directamente los campos de una clase. Los Setters y Setters hacen que las API sean más estables.

Por ejemplo, considere un campo público en una clase a la que acceden otras clases . Ahora más adelante, desea agregar cualquier lógica adicional mientras obtiene y configura la variable. Esto afectará al cliente existente que usa la API. Por lo tanto, cualquier cambio en este campo público requerirá un cambio en cada clase que lo remita. Por el contrario, con los métodos de acceso, uno puede agregar fácilmente algo de lógica, como almacenar algunos datos en la memoria caché, e inicializarlo con pereza más adelante. Además, se puede disparar un evento de propiedad cambiado si el nuevo valor es diferente del valor anterior. Todo esto será perfecto para la clase que obtiene valor utilizando el método de acceso.

Hay tantos tutoriales y explicaciones sobre cómo y qué son. Google ellos.

En cuanto a su, problema actual:

  1. Tienes dos clases diferentes, cada una con una principal. Eso está mal. Ellos tendrán diferentes propiedades.
  2. El cambio de código sugerido por @Subhrajyoti Majumder es el correcto. Verifique la respuesta para resolver el problema.

Mientras tanto, lee en

  • Encapsulación
  • Accesorios

para una mejor comprensión de los conceptos. Espero eso ayude. 🙂

Parece que está ejecutando dos clases diferentes por separado y asumiendo que los cambios realizados a los atributos cuando ejecuta EmployeeTest se reflejarán en la ejecución del Employee . Tenga en cuenta que los cambios se reflejarán en la misma instancia de JRE. Discúlpeme en caso de que haya entendido mal su problema.

EDITAR: según la entrada del usuario. Aquí está el código de cómo puede acceder y actualizar los valores de miembros estáticos:

 class Employee { public static int empid; public static String empname; public static void main(String[] args) { System.out.println("print employe details:" + empid + " " + empname); } } // EmployeeTest class public class EmployeeTest { public static void main(String[] args) { Employee e = new Employee(); e.empid = 20; e.empname = "jerry"; Employee.empid = 10; Employee.empname = "tom"; Employee.main(null); } } 

public static campos public static están asociados con la clase no con el objeto, rompe la regla de encapsulación de Object.

Clase de Employee con dos campos encapsulados empid & empname .

 public class Employee { private int empid; private String empname; public int getEmpid(){ return this.empid; } public void setEmpid(int empid){ this.empid = empid; } ... } public class EmployeeTest { public static void main(String[] args) { Employee e = new Employee(); e.setempId(1); Employee e1 = new Employee(); e1.setempId(2); } } 

Documentación para una mejor comprensión de la encapsulación

El concepto de encapsulación es una técnica de diseño que se relaciona con la ocultación de información. El principio subyacente es proporcionar acceso protegido a los atributos de clase, a través de una interfaz bien diseñada. El objective de la encapsulación es hacer cumplir las invariantes de la clase.

Para seguir con tu ejemplo, considera la interfaz de esta clase:

 class Employee private final String firstName; private final String lastName; public Employee(final firstName, final lastName) { this.firstName = firstName; this.lastName = lastName; } public String getName() { return firstName + " " + lastName; } } 

Tenga en cuenta que al declarar los atributos como privados, esta clase restringe a los clientes el acceso directo al estado de las instancias de los objetos de los empleados. La única forma para que los clientes accedan a ellos es a través del método getName (). Esto significa que esos atributos están encapsulados por la clase. También tenga en cuenta que al declarar los atributos como finales e inicializarlos en el constructor creamos una clase efectivamente inmutable, es decir, uno cuyo estado no puede modificarse después de la construcción.

Una implementación alternativa sería la siguiente:

 class Employee private String firstName; private String lastName; public Employee(firstName, lastName) { this.firstName = firstName; this.lastName = lastName; } public String getName() { return firstName + " " + lastName; } public String setName(String firstName, String lastName) { if (firstName == null) { throw new IllegalArgumentException("First name cannot be null"); } if (lastName == null) { throw new IllegalArgumentException("Last name cannot be null"); } this.firstName = firstName; this.lastName = lastName; } } 

En este ejemplo, el objeto no es inmutable, pero su estado está encapsulado ya que el acceso a él se realiza solo a través de los descriptores de acceso y modificadores. Tenga en cuenta aquí cómo la encapsulación puede ayudarlo a proteger las invariantes del estado del objeto. Al restringir las modificaciones a través de un método, obtiene un mejor control de cómo se modifica el estado del objeto, agregando validaciones para asegurarse de que cualquier modificación sea consistente con la especificación de la clase.

 Encapsulation means combining data and code together(class). The main purpose of encapsulation is you would have full control on data by using the code. class Encap{ private int amount; public void setAmount(int amount) { this.amount = amount; } Here, you can set the amount using the setAmount method, but value should be more than 100. So, i have the control on it. public void setAmount(int amount) { if(amount>100) this.amount = amount; } 

encapsulation = VARIABLES (permite private a, b, c) + METHODS (setA & getA, setB & getB ….) podemos encapsular usando el modificador privado. Consideremos su variable pública creada y una variable privada en su clase … en caso de que tenga que dar esas variables a otra clase para solo lectura (solo ellos pueden ver y usar no pueden modificar) no hay posibilidad con variables o métodos públicos, pero podemos hacerlo en privado al proporcionar el método get. entonces tus variables o métodos privados de clase están bajo tu control. pero en público no hay posibilidad … creo que se puede entender.

La encapsulación puede describirse como una barrera protectora que impide que el código y los datos sean accedidos aleatoriamente por otro código definido fuera de la clase. El acceso a los datos y el código está estrechamente controlado por una interfaz.

La encapsulación en Java es la técnica para hacer que los campos de una clase sean privados y proporcionar acceso a los campos a través de métodos públicos.

Si un campo se declara privado, nadie podrá acceder a él fuera de la clase, ocultando así los campos dentro de la clase. Por esta razón, la encapsulación también se denomina ocultación de datos .

Ejemplo en tiempo real: autos y propietarios. Todas las funciones de los automóviles están encapsuladas con los propietarios. Por lo tanto, nadie más puede acceder a él ..

El siguiente es el código para este ejemplo.

 public class Main { public static void main(String[] args) { Owner o1=new Car("SONY","Google Maps"); o1.activate_Sunroof(); o1.getNavigationSystem(); o1.getRadioSytem(); } } //Interface designed for exposing car functionalities that an owner can use. public interface Owner { void getNavigationSystem(); void getRadioSytem(); void activate_Sunroof(); } /* Car class protects the code and data access from outside world access by implementing Owner interface(ie, exposing Cars functionalities) and restricting data access via private access modifier. */ public class Car implements Owner { private String radioSystem; private String gps; public Car(String radioSystem, String gps) { super(); this.radioSystem = radioSystem; this.gps = gps; } public String getRadioSystem() { return radioSystem; } public void setRadioSystem(String radioSystem) { this.radioSystem = radioSystem; } public String getGps() { return gps; } public void setGps(String gps) { this.gps = gps; } @Override public void getNavigationSystem() { System.out.println("GPS system " + getGps() + " is in use..."); } @Override public void getRadioSytem() { System.out.println("Radio system " + getRadioSystem() + " activated"); } @Override public void activate_Sunroof() { System.out.println("Sunroof activated"); } } 

por supuesto, el cambio en un objeto no afectará a otro. supongamos que tiene un alumno de la clase y todos los niños de su escuela son sus objetos. si uno deja la escuela, esto no significa que todos los demás estudiantes (objeto de la clase de estudiantes) también deberían abandonar la escuela.

La encapsulación es el concepto de tener sus variables de clase como privadas , para que nadie pueda jugar directamente con sus miembros de datos del mundo exterior. pero usted proporciona el método público , para permitir que el mundo exterior juegue con su miembro de datos, de la manera que usted lo desea. el simpático ejemplo de encoding de la encapsulación está dado anteriormente por Subhrajyoti Majumder.

(los miembros estáticos son los mismos para todos los objetos de la clase, p. ej .: variable de conteo estático, para contar el número de objetos de la clase del alumno (número de estudiantes en la escuela)).

Edite como lo pidió:

Ejemplo:

 public class student{ public String name; public student() {} } 

y en su función principal, el mundo exterior puede jugar con los atributos de su clase como:

 student s = new student(); s.name = "xyz"; 

supongamos, no desea permitir que el mundo exterior cambie su atributo de nombre de objeto. entonces debe hacer que el nombre ‘nombre’ sea privado, y proporcionar un método público para ver solo el nombre (obtener).

Ejemplo:

 public class student{ private String name; public student() {} public String getName(){ return this.name; } } 

y ahora en su método principal, solo puede obtener el objeto de nombre, y no puede establecerlo en un nuevo valor, como podría hacer en el primer ejemplo.

 student s = new student(); String sname = s.getName(); 

y si lo intentas:

 s.name = "newname"; 

el comstackdor no te permitirá eso. ya que no tienes permiso para acceder a los miembros privados.

La razón por la que obtiene el resultado “print employe details: 0 null” cuando se ejecuta la clase Employee es porque esas variables no se inicializan. Es decir, no les asigna ningún valor dentro de la clase Empleado.

Todo lo que haga dentro de la clase EmployeeTest no afectará los valores de las variables en Employee la próxima vez que se ejecute. Considere cada ejecución de un progtwig Java como una “borrón y cuenta nueva”.

En el punto de encapsulación, realmente no debería estar usando la palabra clave static . Si va a encapsularse, revise la otra respuesta a esta pregunta, tiene una buena muestra de código para que la use.

La encapsulación es un concepto de OOP. La clase se considera como una cápsula que contiene datos + comportamiento. Los datos deben ser privados y se debe acceder solo mediante métodos públicos llamados getters y setters. Puede consultar este tutorial de encapsulamiento para obtener más información sobre este concepto.

ENCAPSULATION es un mecanismo de ajuste de métodos y variables en una sola unidad. por ejemplo, cápsula, es decir, mezcla de varios medicamentos.

las variables de una clase se ocultarán de otras clases, ya que se declarará privada y solo se podrá acceder a ellas a través de los métodos de su clase actual

Para lograr la encapsulación en Java – * Declara las variables de una clase como privadas. * Proporcionar métodos públicos setter y getter para modificar y ver los valores de las variables. * La clase Java Bean es el ejemplo de una clase completamente encapsulada.

¿Quiere decir que el valor de empid debe ser 10 y poner nombre a tom en lugar de 0 y nulo, si es así, entonces-?

1) memoria a las variables se asigna en tiempo de ejecución, y también desasignado después de que el progtwig se termina.

2) Por lo tanto, si crees que una vez si le das 10 a empid siempre debe ser 10, no es así, porque empid es solo una referencia a una memoria que está almacenando “10”.

3) Así que por desasignación, quiero decir que empid ya no apunta al área de memoria que almacena 10, después de que el progtwig termina

4) cada vez que ejecuta un nuevo progtwig, el empid ahora apunta a otra área de memoria, y esa memoria tiene asignado el valor predeterminado según el tipo de datos respectivo, en el caso de una variable estática. por lo tanto siempre 0 y nulo.

    Intereting Posts