Menu

Clases en Java: definir campos, métodos y objetos

Qué es una clase en Java, cómo definir campos y métodos, crear objetos con new, el papel de this y por qué el estado de instancia vive en el objeto.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

Una clase es un plano

Hasta ahora tu código ha vivido en métodos que pasan valores simples de un lado a otro. Una clase te permite agrupar datos relacionados y el comportamiento que opera sobre ellos en un único tipo con nombre. La clase es el plano; las cosas reales con las que trabajas son los objetos creados a partir de ella.

Una clase declara dos tipos de miembros: campos (los datos que guarda cada objeto) y métodos (lo que cada objeto puede hacer).

new Dog() construye un objeto en memoria y te entrega una referencia a él. d.name y d.bark() acceden a ese objeto concreto.

Cada objeto tiene su propio estado

El sentido de una clase es que puedes producir muchos objetos independientes, cada uno con sus propios valores de campo. Cambiar uno nunca afecta a otro.

rex y bella son dos objetos distintos. Cada uno tiene su propio name, por lo que cada bark() imprime un valor diferente. Estos datos por objeto se llaman estado de instancia.

Los campos y los métodos trabajan juntos

Los métodos dentro de una clase pueden leer y actualizar directamente los campos propios de ese objeto, sin necesidad de pasarlos como parámetros. El método ya "vive en" el objeto cuyos datos toca.

Fíjate en que increment() no recibe argumentos. Opera sobre el campo que pertenece al Counter sobre el que lo llamaste. Esta es la diferencia entre un método de clase y un método estático suelto: el método tiene un objeto implícito sobre el que actuar.

La palabra clave this

Dentro de un método, this es una referencia al objeto sobre el que se llamó al método. Normalmente no lo necesitas: escribir count ya significa this.count. Pero this se vuelve imprescindible cuando el nombre de un parámetro choca con el de un campo, lo cual ocurre constantemente en los setters y constructores.

Un error habitual de principiante es escribir x = x; dentro de move. Eso solo asigna el parámetro a sí mismo y deja el campo intacto: el compilador no te avisará y tu objeto conservará en silencio sus valores antiguos. this.x = x; es lo que realmente actualiza el campo.

Valores por defecto de los campos y referencias null

Cuando creas un objeto, sus campos no quedan con basura: Java los inicializa con valores por defecto: 0 para los números, false para boolean y null para las referencias a objetos como String. Ese valor por defecto null es el origen de un fallo clásico.

u.name es null porque nadie lo asignó, así que llamar a .length() sobre él lanza una NullPointerException. Asigna siempre valores con sentido a un objeto antes de usar sus campos, que es precisamente el problema que resuelven los constructores.

Organizar el código en torno a clases

Los programas reales modelan su dominio como clases que mantienen juntos los datos y las operaciones sobre ellos. Aquí, una sola clase BankAccount guarda un saldo y controla cómo cambia:

Los datos (balance) y las reglas para modificarlos (deposit, withdraw) viven en un mismo lugar. El código de otras partes pide a la cuenta que haga cosas en lugar de manipular sus números directamente: la base de un diseño limpio y fácil de mantener.

Siguiente: constructores

Asignar cada campo a mano después de new es tedioso y fácil de olvidar, y, como acabas de ver, un campo olvidado deja un null esperando para provocar un fallo. Un constructor te permite exigir e inicializar los campos de un objeto en el momento mismo de su creación, de modo que un BankAccount nunca pueda existir sin un propietario. De eso trata la siguiente página.

Preguntas frecuentes

¿Qué es una clase en Java?

Una clase es un plano que define los datos (campos) y el comportamiento (métodos) que tendrá un tipo de objeto. La clase en sí es solo la plantilla: creas objetos reales a partir de ella con new. Por ejemplo, una clase Dog describe que todo perro tiene un name y puede hacer bark(), mientras que cada new Dog() es un perro distinto con su propio nombre.

¿Cuál es la diferencia entre una clase y un objeto en Java?

Una clase es la definición; un objeto es una instancia concreta construida a partir de esa definición con new. Una sola clase Person puede producir muchos objetos Person, cada uno con sus propios valores de campo. Piensa en la clase como el molde de galletas y en los objetos como las galletas individuales: cambiar los campos de un objeto nunca afecta a los de otro.

¿Qué hace la palabra clave this en una clase de Java?

this hace referencia al objeto actual, la instancia concreta cuyo método se está ejecutando. La usas para acceder a los propios campos de un objeto, sobre todo cuando un parámetro tiene el mismo nombre que un campo (this.name = name;). Sin this, la asignación solo asignaría el parámetro a sí mismo y el campo quedaría sin cambios.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR