Temas:
A continuación se entrega en forma resumida los cambios que hay que hacer a los programas para poder trabajar sin la biblioteca del curso.
java MiClase arg0 arg1 ...
El método main debe ser static y debe recibir como parámetros un arreglo
de strings. El comando java invoca este método estático pasándole
como parámetro un arreglo con los argumentos arg0, arg1, etc.
public class MiClase {
...
public static void main(String[] args) {
...
}
...
}
Por ejemplo el siguiente programa despliega los argumentos que se especifica al invocar el programa:
Observaciones:
public class Echo {
public static void main(String[] args) {
for (int i= 0; i<args.length; i++)
System.out.println(args[i]);
}
}
a.length= 10; // error de sintaxis
El programa anterior no puede usar la función println que hemos usado en los programas del curso porque esta función es en realidad un método estático heredado de la clase Program.
Esto falla porque para invocar un método no estático se necesita un
objeto de la invocación, pero este objeto no existe en el caso de un método
estático. Del mismo modo, un método estático tampoco puede accesar variables de
instancia. El problema se puede resolver ya sea declarando que
run es también estático:
public class MiClase {
public static void main(String[] args) {
...
run();
}
void run() {
...
}
}
Pero en tal caso, run no puede invocar métodos que no sean estáticos, ni
accesar variables de instancia. Otra forma entonces de resolver el
problema (si tiene sentido) es crear un objeto de la clase e invocar
el método run con este objeto:
static void run() {
...
}
De esta forma, el objeto creado es el objeto de la invocación.
public static void main(...) {
...
new MiClase().run();
}
| con la biblioteca de CC10A | con la biblioteca estándar | Significado |
|---|---|---|
| println(...); | System.out.println(...); | despliega en pantalla |
| Tipo x= readTipo(); | No hay equivalente simple | Lectura de la pantalla |
| max(..., ...) | Math.max(..., ...) | Calcula el valor máximo |
| min(..., ...) | Math.min(..., ...) | Calcula el valor mínimo |
| abs(...) | Math.abs(...) | Calcula el valor absoluto |
| otros(...) | Math.otros(...) | Idem para otras funciones matemáticas como sin, cos, log, etc. |
| length(s) | s.length() | calcula el largo de un string |
| substring(s, ini, len) | s.substring(ini, ini+len) | entrega un substring de s |
| compare(r, s) | r.compareTo(s) | compara strings |
| compare(r, s)==0 | r.equals(s) | determina si r y s son iguales |
| otros(s, ...) | s.otros(...) | Idem para otras funciones con strings |
| parseInt(...) | Integer.parseInt(...) | convierte de string a entero |
| parseDouble(...) | new Double(...).doubleValue() | convierte de string a real |
| fatalError("..."); | throw new Error("...") | termina el programa con un mensaje de error |
Las clases que aparecen mencionadas son parte del paquete java.lang. No es necesario hacer un import de este paquete porque el compilador lo agrega automáticamente. Para usar clases que se encuentren en cualquiera de los demás paquetes es necesario hacer explícitamente el import.
La API de la versión 1.1 se encuentra disponible localmente en http://sunsite.dcc.uchile.cl/SunSITE/java/docs/jdk1.1/docs/api/packages.html y la versión 1.2 en http://sunsite.dcc.uchile.cl/SunSITE/java/docs/jdk1.2/docs/api/overview-summary.html.
La biblioteca se organiza en paquetes. Los nombres de estos paquetes tienen la forma ``java.nombre'' porque ésta es la forma de distinguir los paquetes estándares de los que no son estándares.
En la documentación cada paquete aparece como un link. Si Ud. sigue el link asociado a java.lang aparecerán todas las clases de el paquete java.lang. Por ejempl aparecerán las clases Math y String. Si Ud. sigue estos links aparecerán el conjunto de constructores, métodos y otra información asociada a estas clases.
Cuando se programa en Java es imprescindible tener a mano esta documentación puesto que se requiere frecuentemente para consultar acerca de los métodos que ofrece una clase, o su clase base, etc. Consulte el rincón de Java para obtener esta documentación. La misma documentación se puede obtener directamente de Sun en http://java.sun.com/.
Lamentablemente el objeto in no posee métodos readInt o readDouble para leer
enteros reales de la consola. Ud. debe descomponer las líneas
en tokens por medio de la clase StringTokenizer (en java.util).
Esta última clase es similar a la clase FieldParser que se
usó en el curso (pero no equivalente). El resultado son strings
que debe convertir a números usando los métodos Integer.parseInt()
o new Double(...).doubleValue().
public static void main(String[] args) throws IOException {
BufferedReader in=
new BufferedReader(new InputStreamReader(System.in), 1);
for(;;) {
String lin= in.readLine();
if (lin==null)
break;
... // procesar la línea
}
in.close();
}
Observe que el método main necesita una cláusula throws IOException porque de otra forma se producirá un error en la compilación del programa. Esto se debe a que Java requiere que los programas capturen las excepciones. Las excepciones son condiciones de borde que ocurren rara vez pero que los programas deben considerar para evitar errores indeseados durante la ejecución.
La información más completa acerca de como programar en el lenguaje Java es el tutorial oficial de Java auspiciado por Sun (en Inglés). Este tutorial se encuentra en: http://sunsite.dcc.uchile.cl/SunSITE/java/docs/tut-java12-sun/ Yo aprendí Java de este tutorial y nunca he terminado de leerlo. Cuando Ud. desee saber como se hace en Java para ..., entonces le recomiendo visitar este tutorial, porque es altamente probable que ahí sale como hacerlo.