Las clases, campos, métodos, constructores y objetos son los componentes básicos de las aplicaciones Java basadas en objetos. Este tutorial de Java le enseña cómo declarar clases, describir atributos mediante campos, describir comportamientos mediante métodos, inicializar objetos mediante constructores y crear instancias de objetos a partir de clases y acceder a sus miembros. También aprenderá sobre definidores y captadores, sobrecarga de métodos y configuración de niveles de acceso para campos, constructores y métodos.
Lo que aprenderá en este tutorial de Java
- Cómo declarar una clase
- Usar campos para describir atributos
- Usar métodos para describir comportamientos.
- Usar constructores para inicializar objetos
- Cómo trabajar con objetos Java
Descargue el código fuente de aplicaciones de ejemplo en este tutorial. Creado por Jeff Friesen para JavaWorld.
Cómo declarar una clase
A clase es una plantilla para fabricar objetos. Usted declara una clase especificando el class
palabra clave seguida de un identificador no reservado que la nombra. Un par de caracteres de llave de apertura y cierre coincidentes ({
y }
) siguen y delimitan el cuerpo de la clase. Esta sintaxis aparece a continuación:
class identifier { // class body }
Por convención, la primera letra del nombre de una clase está en mayúscula y los caracteres siguientes están en minúsculas (por ejemplo, Employee
). Si un nombre consta de varias palabras, la primera letra de cada palabra está en mayúscula (como SavingsAccount
). Esta convención de nomenclatura se llama CamelCasing.
El siguiente ejemplo declara una clase llamada Book
:
class Book { // class body }
El cuerpo de una clase está lleno de campos, métodos y constructores. La combinación de estas características del lenguaje en clases se conoce como encapsulación. Esta capacidad nos permite programar en un nivel más alto de abstracción (clases y objetos) en lugar de centrarnos por separado en las estructuras de datos y la funcionalidad.
Clases de utilidad
Se puede diseñar una clase para que no tenga nada que ver con la fabricación de objetos. En cambio, existe como un marcador de posición para campos de clase y/o métodos de clase. Esta clase se conoce como clase de utilidad. Un ejemplo de una clase de utilidad es la biblioteca de clases estándar de Java. Math
clase.
Aplicaciones multiclase y main()
Una aplicación Java se implementa mediante una o más clases. Las aplicaciones pequeñas se pueden acomodar en una sola clase, pero las aplicaciones más grandes a menudo requieren varias clases. En ese caso, una de las clases se designa como la clase principal y contiene el main()
método del punto de entrada. Por ejemplo, el Listado 1 presenta una aplicación creada utilizando tres clases: A
, B
y C
; C
es la clase principal.
Listado 1. Una aplicación Java con múltiples clases
class A { } class B { } class C { public static void main(String[] args) { System.out.println("Application C entry point"); } }
Podrías declarar estas tres clases en un único archivo fuente, como por ejemplo D.java
. Luego compilaría este archivo fuente de la siguiente manera:
javac D.java
El compilador genera tres archivos de clase: A.class
, B.class
y C.class
. Ejecute esta aplicación mediante el siguiente comando:
java C
Debe observar el siguiente resultado:
Application C entry point
Alternativamente, puedes declarar cada clase en su propio archivo fuente. Por convención, el nombre del archivo fuente coincide con el nombre de la clase. tu declararias A
en A.java
, por ejemplo. Luego podrías compilar estos archivos fuente por separado:
javac A.java javac B.java javac C.java
Para ahorrar tiempo, puede compilar los tres archivos fuente a la vez reemplazando el nombre del archivo con un asterisco (pero mantenga el .java
extensión de archivo):
javac *.java
De cualquier manera, ejecutaría la aplicación mediante el siguiente comando:
java C
Al diseñar aplicaciones de clases múltiples, designará una de estas clases como la clase principal y ubicará la main()
método en él. Sin embargo, nada le impide declarar main()
métodos en las otras clases, tal vez con fines de prueba. Esta técnica se muestra en el Listado 2.
Listado 2. Declarar más de uno main()
método
class A { public static void main(String[] args) { System.out.println("Testing class A"); } } class B { public static void main(String[] args) { System.out.println("Testing class B"); } } class C { public static void main(String[] args) { System.out.println("Application C entry point"); } }
Después de compilar el código fuente, ejecutará los siguientes comandos para probar las clases auxiliares A
y B
y para ejecutar la clase de aplicación C
:
java A java B java C
Luego observará las siguientes líneas de salida, una línea por java
dominio:
Testing class A Testing class B Application C entry point
Usar campos para describir atributos
Una clase modela una entidad del mundo real en términos de estado (atributos). Por ejemplo, un vehículo tiene un color y una cuenta corriente tiene saldo. Una clase también puede incluir un estado que no sea una entidad. Independientemente, el estado se almacena en variables que se conocen como campos. Una declaración de campo tiene la siguiente sintaxis:
[static] type identifier [ = expression ] ;
Opcionalmente, una declaración de campo comienza con una palabra clave. static
(para un atributo que no es de entidad) y continúa con un type
eso es seguido por un no reservado identifier
que nombra el campo. El campo se puede inicializar explícitamente especificando =
seguido por un expression
con un tipo compatible. Un punto y coma finaliza la declaración.
El siguiente ejemplo declara un par de campos en Book
:
class Book { String title; int pubYear; // publication year }
El title
y pubYear
Las declaraciones de campo son idénticas a las declaraciones de variables que presenté en Java 101: características elementales del lenguaje Java. Estos campos se conocen como campos de instancia porque cada objeto contiene su propia copia de ellos.
El title
y pubYear
Los campos almacenan valores para un libro específico. Sin embargo, es posible que desee almacenar un estado que sea independiente de cualquier libro en particular. Por ejemplo, es posible que desee registrar el número total de Book
objetos creados. Así es como lo harías:
class Book { // ... static int count; }
Este ejemplo declara una count
campo entero que almacena el número de Book
objetos creados. La declaración comienza con la static
palabra clave para indicar que sólo hay una copia de este campo en la memoria. Cada Book
El objeto puede acceder a esta copia y ningún objeto tiene su propia copia. Por esta razón, count
es conocido como un campo de clase.
Inicialización
A los campos anteriores no se les asignaron valores. Cuando no inicializas explícitamente un campo, se inicializa implícitamente con todos sus bits establecidos en cero. Este valor predeterminado se interpreta como false
(para boolean
), '\u0000'
(para char
), 0
(para int
), 0L
(para long
), 0.0F
(para float
), 0.0
(para double
), o null
(para un tipo de referencia).
Sin embargo, también es posible inicializar explícitamente un campo cuando se declara el campo. Por ejemplo, podría especificar static int count = 0;
(lo cual no es necesario porque count
por defecto es 0), String logfile = "log.txt";
, static int ID = 1;
o incluso double sinPIDiv2 = Math.sin(Math.PI / 2);
.
Aunque puedes inicializar un campo de instancia mediante asignación directa, es más común realizar esta inicialización en un constructor, lo cual demostraré más adelante. Por el contrario, un campo de clase (especialmente una constante de clase) normalmente se inicializa mediante la asignación directa de una expresión al campo.
Vida útil y alcance
Un campo de instancia nace cuando se crea su objeto y muere cuando el objeto se crea. basura recolectada. Un campo de clase nace cuando se carga la clase y muere cuando se descarga la clase o cuando finaliza la aplicación. Esta propiedad se conoce como toda la vida.
Se puede acceder a los campos de instancia y clase desde sus declaraciones hasta el final de sus clases declarantes. Además, son accesibles para código externo solo en un contexto de objeto (por ejemplo, campos) o en contextos de objeto y clase (para campos de clase) cuando se les otorgan niveles de acceso adecuados. Esta propiedad se conoce como alcance.
Hasta la próxima: Usar métodos para describir comportamientos.