Temas:
Al igual que en las variables de instancia, se puede suprimir this
e invocar orden2 simplemente con:
class Robot extends Program {
void orden1(...) {
...
this.orden2(...); // o también orden2(...);
...
}
void orden2(...) { ... }
...
}
El compilador agrega automáticamente el prefijo this.
orden2(...);
¿Cómo distingue Java que Tarea es un programa y que run y ordenar son
procedimientos? ¿No podría interpretar que Tarea es una clase de
objetos y que run y ordenar son los métodos de la clase?
class Tarea extends Program {
void run() {
...
ordenar(...);
...
}
void ordenar(int[] a, int n) {
...
}
...
}
La respuesta es que Java no lo distingue: Java no posee funciones ni procedimientos. En realidad Tarea sí es una clase como cualquier otra, y run y ordenar son métodos de la clase Tarea. Es perfectamente legal invocar:
De hecho, cuando no se pone, el compilador lo agrega automáticamente.
¿Y qué objeto referencia this en este caso? Es un objeto que
es creado por la clase Run. En realidad la forma estándar de invocar
programas en Java es:
this.ordenar(...);
Y no es obligatorio que la clase sea Run. Pero en este curso hemos estado colocando siempre la clase Run en primer lugar. Esta clase se encarga de crear un objeto de la clase que se suministra como argumento. Por ejemplo al invocar:
la clase Run pertenece a la biblioteca del curso. Ejecutará las siguientes instrucciones:
o simplemente new Tarea().run();. Es decir, crea un objeto
de la clase Run y luego invoca el método run.
Tarea tarea= new Tarea();
tarea.run();
Por lo tanto, dado que Java no posee funciones ni procedimientos, se simulan mediante métodos. El lector se preguntará por qué entonces se estudiaron los métodos como funciones y procedimientos cuando en realidad no existen.
Los lenguajes O-O se usan desde hace relativamente poco tiempo. Solo en los 90 se comenzaron a usar a nivel de empresas. En los 70 y 80 se usaban lenguajes tradicionales (no orientados a objetos). Estos lenguajes sólo ofrecen mecanismos para definir funciones, procedimientos y records (pero sin métodos). Por ejemplo Fortran, Pascal, Cobol y C.
En este punto, es importante mencionar la disyuntiva existente en la actualidad con respecto a la enseñanza de Computación utilizando un lenguaje O-O como primer lenguaje. Hay profesores que opinan que es conveniente enseñar métodos y clases desde un comienzo, sin pasar por funciones y procedimientos. Otros profesores, como el autor de este documento, opinan que resulta más sencillo comenzar por programación no orientada a objetos y por ello se han simulado las funciones y procedimientos con los métodos de Java.
Cuando se diseñan los métodos que necesita un clase, inevitablemente
se llega a casos en que no se necesita un objeto de la invocación.
Por ejemplo, podríamos agregar a la clase Tiempo un método horaActual
que entrega la hora del día.
t.sumar(t2);
Para este tipo de caso, Java ofrece los métodos estáticos. Este tipo de métodos no va asociado a ningún objeto. Se invocan colocando al lado izquierdo el nombre de la clase (y no un objeto):
Este tipo de método se define en la clase agregándoles el atributo static:
Tiempo ahora= Tiempo.horaActual();
Al programar métodos estáticos se debe tener mucho cuidado, porque
dado que no van asociados a un objeto, no se puede usar el identificador
this:
class Tiempo extends Program {
...
static Tiempo horaActual() {
... averiguar horas y minutos actuales ...
return new Tiempo(horas, minutos);
}
}
Explicación:
class Ejemplo extends Program {
int vari; // una variable de instancia
static void mets(String s) { // Un método estático
... s ... // se pueden usar argumentos
XXX this.vari XXX // no se puede usar this
XXX vari XXX // tampoco, porque esto equivale a this.vari
XXX meti() XXX // no se pueden invocar métodos normales
}
void meti() { // un método normal
mets("hola"); // se puede invocar Ejemplo.mets(...)
}
}
Si se tiene una referencia de un objeto de la clase Ejemplo en la variable e, entonces sí se puede accesar e.vari.
Si se trata de un método estático de otra clase, siempre hay que
colocar explícitamente el nombre de la clase.
mets(...); // o también Ejemplo.mets(...)
Por lo tanto, en esta parte veremos cuál es la forma estándar de escribir aplicaciones en Java. Es decir, sin recurrir a bibliotecas especiales.
Como se dijo previamente, la forma estándar de ejecutar programas en Java es por medio del comando:
sin especificar Run. En estos casos, el comando java busca algún método estático que se llame main y que reciba como argumento un arreglo de strings y lo invoca. Por ejemplo, un programa que despliega Hola Mundo en la pantalla se escribiría:
Observaciones:
class Jalisco {
static void main(String[] args) {
System.out.println("Hola Mundo");
}
}
Estas funciones son en realidad métodos estáticos de la clase Program. En una clase sólo son visibles cuando esa clase extiende Program.
System.out.println(...);