Capitulos de este wiki
  1. 1 Declaración de intenciones
  2. 2 Presentación
  3. 3 Introducción a java
  4. 4 Origen de JAVA
  5. 5 Características de JAVA
  6. 6 HotJava
  7. 7 JAVA para aplicaciones corporativas
  8. 8 Instalación del jdk
  9. 9 Windows
  10. 10 Solaris
  11. 11 Linux
  12. 12 Compilación sin JDK
  13. 13 Conceptos básicos de java
  14. 14 Programación en JAVA
  15. 15 Control del Flujo
  16. 16 Clases
  17. 17 Variables y Métodos de Instancia
  18. 18 Alcance de Objetos y Reciclado de Memoria
  19. 19 Herencia
  20. 20 Control de Acceso
  21. 21 Variables y Métodos Estaticos
  22. 23 Clases Abstractas
  23. 24 Interfaces
  24. 25 Métodos Nativos
  25. 26 Paquetes
  26. 27 Referencias
  27. 28 Punteros y Referencias C
  28. 29 Referencias en Java
  29. 30 Referencias y Arrays
  30. 31 Referencias y Listas
  31. 32 Punteros C/C++ y Referencias Java
  32. 33 Programas básicos en java
  33. 34 Una mínima aplicación en Java
  34. 35 Compilación y Ejecución de HolaMundo
  35. 36 El visor de Applets de Sun (appletviewer)
  36. 37 Arquitectura de appletviewer
  37. 38 Métodos de appletviewer
  38. 39 Funciones de menú de appletviewer
  39. 40 Un Applet basico en Java
  40. 41 Compilación de un Applet
  41. 42 La marca APPLET de html
  42. 43 Atributos de APPLET
  43. 44 Paso de parametros a Applets
  44. 45 Tokens en parametros de llamada
  45. 46 El parametro ARCHIVE
  46. 47 Depuración general
  47. 48 Ciclo de vida de un Applet
  48. 49 Protección de Applets
  49. 50 Escribir Applets Java
  50. 51 La aplicación Fecha (Aproximación a OOP)
  51. 52 El depurador de java - jdb
  52. 54 La clase Math
  53. 55 La clase Character
  54. 56 La clase Float
  55. 57 La clase Double
  56. 58 La clase Integer
  57. 59 La clase Long
  58. 60 La clase Boolean
  59. 61 La clase String
  60. 62 La clase StringBuffer
  61. 63 Uso de Conversiones
  62. 64 Abstract window toolkit (awt)
  63. 65 Interface de Usuario
  64. 66 Estructura del AWT
  65. 67 Componentes y Contenedores
  66. 68 Tipos de Componentes
  67. 69 BorderLayout
  68. 70 CardLayout
  69. 71 CheckboxGroup
  70. 72 Color
  71. 73 Component
  72. 74 Button - Botones
  73. 75 Canvas
  74. 76 Checkbox
  75. 77 Choice
  76. 78 Container
  77. 79 Label - Etiquetas
  78. 80 List - Listas
  79. 81 Scrollbar - Barras de desplazamiento
  80. 82 TextComponent
  81. 83 Fijar el tamaño preferido
  82. 84 La clase Event
  83. 85 FlowLayout
  84. 86 Cambio de fuente de caracteres
  85. 87 GridLayout
  86. 88 GridBagLayout
  87. 89 Uso de Insets
  88. 90 MenuComponent
  89. 91 LayoutManager
  90. 92 Diseño de Componentes propios
  91. 93 Creación de Aplicaciones con AWT
  92. 94 Crear el Marco de la aplicación (Frame)
  93. 95 Inicializar Fuentes, Colores, Layouts y demas recursos
  94. 96 Crear menús y Barras de Menús
  95. 97 Crear los controles, dialogos, ventanas, etc.
  96. 98 Layouts
  97. 99 FlowLayout
  98. 100 BorderLayout
  99. 101 GridLayout
  100. 102 GridBagLayout
  101. 103 CardLayout
  102. 104 Crear un Layout propio
  103. 105 Control de Eventos
  104. 106 La clase Event
  105. 107 Tipos de Eventos
  106. 108 Generación y Propagación de Eventos
  107. 109 Métodos de Control de Eventos
  108. 110 Action_Event
  109. 111 Mejorar el Diseño de Interfaces
  110. 112 Cambio de Font de Caracteres
  111. 113 Colores de Fondo y Texto
  112. 114 Fijar el Tamaño Preferido
  113. 115 Uso de Insets
  114. 116 Habilitar y Deshabilitar Componentes
  115. 117 Botón Grafico
  116. 118 Gráficos
  117. 119 Métodos para Dibujos
  118. 120 Líneas
  119. 121 Rectangulos
  120. 122 Círculos, Elipses
  121. 123 Excepciones en java
  122. 124 Funciones Graficas
  123. 125 Manejo de Excepciones
  124. 126 Fractales
  125. 127 Generar Excepciones en Java
  126. 128 Líneas Flotantes
  127. 129 Excepciones Predefinidas
  128. 130 Métodos para Imagenes
  129. 131 Crear Excepciones Propias
  130. 132 Doble Buffering de Graficos
  131. 133 Capturar Excepciones
  132. 134 Nuevas Clases para Dibujo
  133. 135 Propagación de Excepciones
  134. 136 La Clase MediaTracker
  135. 137 Threads y multithreading
  136. 138 Sonido en Java
  137. 139 Flujo en Programas
  138. 140 Entrada por Ratón
  139. 141 Creación y Control de Threads
  140. 142 Arrancar y Parar Threads
  141. 143 Suspender y Reanudar Threads
  142. 144 Estados de un Thread
  143. 145 Scheduling
  144. 146 Prioridades, demonios...
  145. 147 Ejemplo de Animación
  146. 148 Comunicación entre Threads
  147. 149 Métodos nativos
  148. 150 Escribir Código Java
  149. 151 Compilar el Código Java
  150. 152 Crear el fichero de Cabecera
  151. 153 Crear el fichero de Stubs
  152. 154 Escribir la función C
  153. 155 Crear la Librería Dinamica
  154. 156 Ejecutar el Programa
  155. 157 Entrada / salida estándar
  156. 158 La clase System
  157. 159 Clases comunes de Entrada/Salida
  158. 160 Ficheros en java
  159. 161 Ficheros
  160. 162 Streams de Entrada
  161. 163 Streams de Salida
  162. 164 Ficheros de Acceso Aleatorio
  163. 165 Comunicaciones en java
  164. 166 Comunicaciones en Unix
  165. 167 Sockets
  166. 168 Diferencias entre Sockets Stream y Datagrama
  167. 169 Uso de Sockets
  168. 170 Dominios de Comunicaciones
  169. 171 Modelo de Comunicaciones con Java
  170. 172 Apertura de Sockets
  171. 173 Creación de Streams
  172. 174 Cierre de Sockets
  173. 175 Mínimo Cliente SMTP
  174. 176 Servidor de Eco
  175. 177 Cliente/Servidor TCP/IP
  176. 178 Servidor Simple de HTTP
  177. 179 Red en Windows '95 (sin conexión)
  178. 180 Clases Útiles en Comunicaciones
  179. 181 Arquitectura mvc en java
  180. 182 La Arquitectura MVC
  181. 183 Observador y Observable
  182. 184 Cómo utilizar Observer y Observable
  183. 185 Ejemplo de aplicación MVC
  184. 186 Aplicaciones en java
  185. 187 Etiqueta
  186. 188 Reloj Digital
  187. 189 Persiana
  188. 190 Solapas
  189. 191 Transparencia
  190. 192 Calculadora
  191. 193 Cuenta-Kilómetros
  192. 194 Cartel
  193. 195 Final y agradecimientos
  194. 196 Java y matlab

Tutorial de Java - Características de JAVA

5 - Características de JAVA

[editar]
Tutorial creado por Agustín Froufe. Extraido de: http://www.publispain.com/supertutoriales/
30 de Noviembre de 1999
Las características principales que nos ofrece Java respecto a cualquier otro lenguaje de programación, son:

Es SIMPLE:

Java ofrece toda la funcionalidad de un lenguaje potente, pero sin las características menos usadas y más confusas de éstos. c++ es un lenguaje que adolece de falta de seguridad, pero C y c++ son lenguajes más difundidos, por ello Java se diseñó para ser parecido a C++ y así facilitar un rápido y fácil aprendizaje.

Java elimina muchas de las características de otros lenguajes como C++, para mantener reducidas las especificaciones del lenguaje y añadir características muy útiles como el garbage collector (reciclador de memoria dinámica). No es necesario preocuparse de liberar memoria, el reciclador se encarga de ello y como es un thread de baja prioridad, cuando entra en acción, permite liberar bloques de memoria muy grandes, lo que reduce la fragmentación de la memoria.

Java reduce en un 50% los errores más comunes de programación con lenguajes como C y C++ al eliminar muchas de las características de éstos, entre las que destacan:

  • aritmética de punteros
  • no existen referencias
  • registros (struct)
  • definición de tipos (typedef)
  • macros (#define)
  • necesidad de liberar memoria (free)

Aunque, en realidad, lo que hace es eliminar las palabras reservadas (struct, typedef), ya que las clases son algo parecido.

Además, el intérprete completo de Java que hay en este momento es muy pequeño, solamente ocupa 215 Kb de RAM.

Es ORIENTADO A OBJETOS:

Java implementa la tecnología básica de c++ con algunas mejoras y elimina algunas cosas para mantener el objetivo de la simplicidad del lenguaje. Java trabaja con sus datos como objetos y con interfaces a esos objetos. Soporta las tres características propias del paradigma de la orientación a objetos: encapsulación, herencia y polimorfismo. Las plantillas de objetos son llamadas, como en C++, clases y sus copias, instancias. Estas instancias, como en C++, necesitan ser construidas y destruidas en espacios de memoria.

Java incorpora funcionalidades inexistentes en C++ como por ejemplo, la resolución dinámica de métodos. Esta característica deriva del lenguaje Objective C, propietario del sistema operativo Next. En c++ se suele trabajar con librerías dinámicas (DLLs) que obligan a recompilar la aplicación cuando se retocan las funciones que se encuentran en su interior. Este inconveniente es resuelto por Java mediante una interfaz específica llamada RTTI (RunTime Type Identification) que define la interacción entre objetos excluyendo variables de instancias o implementación de métodos. Las clases en Java tienen una representación en el runtime que permite a los programadores interrogar por el tipo de clase y enlazar dinámicamente la clase con el resultado de la búsqueda.

Es DISTRIBUIDO:

Java se ha construido con extensas capacidades de interconexión TCP/IP. Existen librerías de rutinas para acceder e interactuar con protocolos como http y ftp. Esto permite a los programadores acceder a la información a través de la red con tanta facilidad como a los ficheros locales.

La verdad es que Java en sí no es distribuido, sino que proporciona las librerías y herramientas para que los programas puedan ser distribuidos, es decir, que se corran en varias máquinas, interactuando.

Es ROBUSTO:

Java realiza verificaciones en busca de problemas tanto en tiempo de compilación como en tiempo de ejecución. La comprobación de tipos en Java ayuda a detectar errores, lo antes posible, en el ciclo de desarrollo. Java obliga a la declaración explícita de métodos, reduciendo así las posibilidades de error. Maneja la memoria para eliminar las preocupaciones por parte del programador de la liberación o corrupción de memoria. También implementa los arrays auténticos, en vez de listas enlazadas de punteros, con comprobación de límites, para evitar la posibilidad de sobreescribir o corromper memoria resultado de punteros que señalan a zonas equivocadas. Estas características reducen drásticamente el tiempo de desarrollo de aplicaciones en Java.

Además, para asegurar el funcionamiento de la aplicación, realiza una verificación de los byte-codes, que son el resultado de la compilación de un programa Java. Es un código de máquina virtual que es interpretado por el intérprete Java. No es el código máquina directamente entendible por el hardware, pero ya ha pasado todas las fases del compilador: análisis de instrucciones, orden de operadores, etc., y ya tiene generada la pila de ejecución de órdenes.

Java proporciona, pues:

  • Comprobación de punteros
  • Comprobación de límites de arrays
  • Excepciones
  • Verificación de byte-codes

Es de ARQUITECTURA NEUTRAL:

Para establecer Java como parte integral de la red, el compilador Java compila su código a un fichero objeto de formato independiente de la arquitectura de la máquina en que se ejecutará. Cualquier máquina que tenga el sistema de ejecución (run-time) puede ejecutar ese código objeto, sin importar en modo alguno la máquina en que ha sido generado. Actualmente existen sistemas run-time para Solaris 2.x, SunOs 4.1.x, Windows 95, Windows NT, Linux, Irix, Aix, Mac, Apple y probablemente haya grupos de desarrollo trabajando en el porting a otras plataformas.
{{}}
El código fuente Java se "compila" a un código de bytes de alto nivel independiente de la máquina. Este código (byte-codes) está diseñado para ejecutarse en una máquina hipotética que es implementada por un sistema run-time, que sí es dependiente de la máquina.

En una representación en que tuviésemos que indicar todos los elementos que forman parte de la arquitectura de Java sobre una plataforma genérica, obtendríamos una figura como la siguiente:
{{}}
En ella podemos ver que lo verdaderamente dependiente del sistema es la Máquina Virtual Java (JVM) y las librerías fundamentales, que también nos permitirían acceder directamente al hardware de la máquina. Además, habrá APIs de Java que también entren en contacto directo con el hardware y serán dependientes de la máquina, como ejemplo de este tipo de APIs podemos citar:

* Java 2D: gráficos 2D y manipulación de imágenes
* Java Media Framework : Elementos críticos en el tiempo: audio, video...
* Java Animation: Animación de objetos en 2D
* Java Telephony: Integración con telefonía
* Java Share: Interacción entre aplicaciones multiusuario
* Java 3D: Gráficos 3D y su manipulación

Es SEGURO:

La seguridad en Java tiene dos facetas. En el lenguaje, características como los punteros o el casting implícito que hacen los compiladores de C y C++ se eliminan para prevenir el acceso ilegal a la memoria. Cuando se usa Java para crear un navegador, se combinan las características del lenguaje con protecciones de sentido común aplicadas al propio navegador.

El lenguaje C, por ejemplo, tiene lagunas de seguridad importantes, como son los errores de alineación. Los programadores de C utilizan punteros en conjunción con operaciones aritméticas. Esto le permite al programador que un puntero referencie a un lugar conocido de la memoria y pueda sumar (o restar) algún valor, para referirse a otro lugar de la memoria. Si otros programadores conocen nuestras estructuras de datos pueden extraer información confidencial de nuestro sistema. Con un lenguaje como C, se pueden tomar números enteros aleatorios y convertirlos en punteros para luego acceder a la memoria:

printf( "Escribe un valor entero: " );
scanf( "%u",&puntero );
printf( "Cadena de memoria: %s\n",puntero );


Otra laguna de seguridad u otro tipo de ataque, es el Caballo de Troya. Se presenta un programa como una utilidad, resultando tener una funcionalidad destructiva. Por ejemplo, en UNIX se visualiza el contenido de un directorio con el comando ls. Si un programador deja un comando destructivo bajo esta referencia, se puede correr el riesgo de ejecutar código malicioso, aunque el comando siga haciendo la funcionalidad que se le supone, después de lanzar su carga destructiva. Por ejemplo, después de que el caballo de Troya haya enviado por correo el /etc/shadow a su creador, ejecuta la funcionalidad de ls persentando el contenido del directorio. Se notará un retardo, pero nada inusual.

El código Java pasa muchos tests antes de ejecutarse en una máquina. El código se pasa a través de un verificador de byte-codes que comprueba el formato de los fragmentos de código y aplica un probador de teoremas para detectar fragmentos de código ilegal -código que falsea punteros, viola derechos de acceso sobre objetos o intenta cambiar el tipo o clase de un objeto-.

Si los byte-codes pasan la verificación sin generar ningún mensaje de error, entonces sabemos que:

* El código no produce desbordamiento de operandos en la pila
* El tipo de los parámetros de todos los códigos de operación son conocidos y correctos
* No ha ocurrido ninguna conversión ilegal de datos, tal como convertir enteros en punteros
* El acceso a los campos de un objeto se sabe que es legal: public, private, protected
* No hay ningún intento de violar las reglas de acceso y seguridad establecidas

El Cargador de Clases también ayuda a Java a mantener su seguridad, separando el espacio de nombres del sistema de ficheros local, del de los recursos procedentes de la red. Esto limita cualquier aplicación del tipo Caballo de Troya, ya que las clases se buscan primero entre las locales y luego entre las procedentes del exterior.

Las clases importadas de la red se almacenan en un espacio de nombres privado, asociado con el origen. Cuando una clase del espacio de nombres privado accede a otra clase, primero se busca en las clases predefinidas (del sistema local) y luego en el espacio de nombres de la clase que hace la referencia. Esto imposibilita que una clase suplante a una predefinida.

En resumen, las aplicaciones de Java resultan extremadamente seguras, ya que no acceden a zonas delicadas de memoria o de sistema, con lo cual evitan la interacción de ciertos virus. Java no posee una semántica específica para modificar la pila de programa, la memoria libre o utilizar objetos y métodos de un programa sin los privilegios del kernel del sistema operativo. Además, para evitar modificaciones por parte de los crackers de la red, implementa un método ultraseguro de autentificación por clave pública. El Cargador de Clases puede verificar una firma digital antes de realizar una instancia de un objeto. Por tanto, ningún objeto se crea y almacena en memoria, sin que se validen los privilegios de acceso. Es decir, la seguridad se integra en el momento de compilación, con el nivel de detalle y de privilegio que sea necesario.

Dada, pues la concepción del lenguaje y si todos los elementos se mantienen dentro del estándar marcado por Sun, no hay peligro. Java imposibilita, también, abrir ningún fichero de la máquina local (siempre que se realizan operaciones con archivos, éstas trabajan sobre el disco duro de la máquina de donde partió el applet), no permite ejecutar ninguna aplicación nativa de una plataforma e impide que se utilicen otros ordenadores como puente, es decir, nadie puede utilizar nuestra máquina para hacer peticiones o realizar operaciones con otra. Además, los intérpretes que incorporan los navegadores de la Web son aún más restrictivos. Bajo estas condiciones (y dentro de la filosofía de que el único ordenador seguro es el que está apagado, desenchufado, dentro de una cámara acorazada en un bunker y rodeado por mil soldados de los cuerpos especiales del ejército), se puede considerar que Java es un lenguaje seguro y que los applets están libres de virus.

Respecto a la seguridad del código fuente, no ya del lenguaje, JDK proporciona un desemsamblador de byte-code, que permite que cualquier programa pueda ser convertido a código fuente, lo que para el programador significa una vulnerabilidad total a su código. Utilizando javap no se obtiene el código fuente original, pero sí desmonta el programa mostrando el algoritmo que se utiliza, que es lo realmente interesante. La protección de los programadores ante esto es utilizar llamadas a programas nativos, externos (incluso en C o C++) de forma que no sea descompilable todo el código; aunque así se pierda portabilidad. Esta es otra de las cuestiones que Java tiene pendientes.

Es PORTABLE:

Más allá de la portabilidad básica por ser de arquitectura independiente, Java implementa otros estándares de portabilidad para facilitar el desarrollo. Los enteros son siempre enteros y además, enteros de 32 bits en complemento a 2. Además, Java construye sus interfaces de usuario a través de un sistema abstracto de ventanas de forma que las ventanas puedan ser implantadas en entornos Unix, Pc o Mac.

Es INTERPRETADO:

El intérprete Java (sistema run-time) puede ejecutar directamente el código objeto. Enlazar (linkar) un programa, normalmente, consume menos recursos que compilarlo, por lo que los desarrolladores con Java pasarán más tiempo desarrollando y menos esperando por el ordenador. No obstante, el compilador actual del JDK es bastante lento. Por ahora, que todavía no hay compiladores específicos de Java para las diversas plataformas, Java es más lento que otros lenguajes de programación, como C++, ya que debe ser interpretado y no ejecutado como sucede en cualquier programa tradicional.

Se dice que Java es de 10 a 30 veces más lento que C, y que tampoco existen en Java proyectos de gran envergadura como en otros lenguajes. La verdad es que ya hay comparaciones ventajosas entre Java y el resto de los lenguajes de programación, y una ingente cantidad de folletos electrónicos que supuran fanatismo en favor y en contra de los distintos lenguajes contendientes con Java. Lo que se suele dejar de lado en todo esto, es que primero habría que decidir hasta que punto Java, un lenguaje en pleno desarrollo y todavía sin definición definitiva, está maduro como lenguaje de programación para ser comparado con otros; como por ejemplo con Smalltalk, que lleva más de 20 años en cancha.

La verdad es que Java para conseguir ser un lenguaje independiente del sistema operativo y del procesador que incorpore la máquina utilizada, es tanto interpretado como compilado. Y esto no es ningún contrasentido, me explico, el código fuente escrito con cualquier editor se compila generando el byte-code. Este código intermedio es de muy bajo nivel, pero sin alcanzar las instrucciones máquina propias de cada plataforma y no tiene nada que ver con el p-code de Visual Basic. El byte-code corresponde al 80% de las instrucciones de la aplicación. Ese mismo código es el que se puede ejecutar sobre cualquier plataforma. Para ello hace falta el run-time, que sí es completamente dependiente de la máquina y del sistema operativo, que interpreta dinámicamente el byte-code y añade el 20% de instrucciones que faltaban para su ejecución. Con este sistema es fácil crear aplicaciones multiplataforma, pero para ejecutarlas es necesario que exista el run-time correspondiente al sistema operativo utilizado.

Es MULTITHREADED:

Al ser multithreaded (multihilvanado, en mala traducción), Java permite muchas actividades simultáneas en un programa. Los threads (a veces llamados, procesos ligeros), son básicamente pequeños procesos o piezas independientes de un gran proceso. Al estar los threads contruidos en el lenguaje, son más fáciles de usar y más robustos que sus homólogos en C o C++.

El beneficio de ser miltithreaded consiste en un mejor rendimiento interactivo y mejor comportamiento en tiempo real. Aunque el comportamiento en tiempo real está limitado a las capacidades del sistema operativo subyacente (Unix, Windows, etc.), aún supera a los entornos de flujo único de programa (single-threaded) tanto en facilidad de desarrollo como en rendimiento.

Cualquiera que haya utilizado la tecnología de navegación concurrente, sabe lo frustrante que puede ser esperar por una gran imagen que se está trayendo. En Java, las imágenes se pueden ir trayendo en un thread independiente, permitiendo que el usuario pueda acceder a la información en la página sin tener que esperar por el navegador.

Es DINÁMICO:

Java se beneficia todo lo posible de la tecnología orientada a objetos. Java no intenta conectar todos los módulos que comprenden una aplicación hasta el tiempo de ejecución. Las librería nuevas o actualizadas no paralizarán las aplicaciones actuales (siempre que mantengan el API anterior).
{{}}
Java también simplifica el uso de protocolos nuevos o actualizados. Si su sistema ejecuta una aplicación Java sobre la red y encuentra una pieza de la aplicación que no sabe manejar, tal como se ha explicado en párrafos anteriores, Java es capaz de traer automáticamente cualquiera de esas piezas que el sistema necesita para funcionar.
{{}}
Java, para evitar que los módulos de byte-codes o los objetos o nuevas clases, haya que estar trayéndolos de la red cada vez que se necesiten, implementa las opciones de persistencia, para que no se eliminen cuando de limpie la caché de la máquina.
[editar]

172 opiniones

grafos

hola?? alguien puede darme info de aplicación de grafos en el mapeo de una red wan?? o alguna página donde pueda encontrar algo de esto?
choice

espesificar mas a fondo los ejercicios y lo que significa
diferencias entre main() y init()

holas.. no se si me pueden ayudar sobre diferencias entre init y main
no solo c

tambien puede invocara codigo asm
historias

iiiiiiiiiiel david no sabe besar y es gay junto con el carlos
1 2 3 4 5 6 7 ... 35 | siguiente >

Tutoriales relacionados con 'Tutorial de Java'

PHP se ha convertido en el lenguaje de facto de Internet y no es difícil... Más »
Este es el diario de Peter Class sobre sus dias aprendizaje de una disciplina de... Más »
Entiendase que AJAX no se refiere a usar el objeto XMLHttpRequest de manera indispensable porque... Más »
ASP (Active Server Pages) es la tecnología para la creación de páginas dinámicas del lado... Más »
Este documento contiene información acerca del establecimiento de servicios WWW bajo Linux (tanto servidor como... Más »

Autor y licencia de 'Tutorial de Java'


Tutorial de Agustín Froufe. Extraido de: http://www.publispain.com/supertutoriales/ CopyLeft
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.