jueves, 10 de noviembre de 2016

Capítulo 82. Creando figuras en Java


Diario de un programador. Día 184

Creando figuras en Java.

Al igual que en su tiempo hicimos esto en Small Basic y luego en Python. Llegó el momento de ver estas operaciones en Java. En esta ocasión, lo primero que se hará será crear un círculo y un cuadrado.
Para crear un crear un círculo, se utiliza el método drawOval y para crear un cuadrado se utiliza el método drawRect. Ambos métodos requieren de cuatro argumentos, siendo los dos primeros los que indiquen la posición desde donde se empezará a dibujar la figura y los otros dos sirven para dimensionar la figura en su ancho y alto.
Como ambos métodos son muy parecidos en su forma de programarse, vamos a mostrarlos al mismo tiempo.
Al igual que en el tutorial pasado, vamos a utilizar dos clases. La clase principal se llamará Inicio y la otra se llamará Ventana. Estas clases contendrán los mismos elementos que fueron utilizados  en el tutorial anterior exceptuando los que son utilizados para crear las líneas ya que en esta ocasión no las utilizaremos (nos centraremos solamente en los círculos y cuadrados por el momento). La clase Inicio, se mantendrá igual, sin cambios, pero de todas formas la voy a escribir a continuación.

import javax.swing.JFrame;
public class Inicio{
  public static void main(String []args){
   
    Ventana panel = new Ventana();
    JFrame marco = new JFrame();
   
    marco.add(panel);
    marco.setSize(250,250);
    marco.setVisible(true);
    marco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}

En la clase ventana voy a poner los métodos correspondientes para crear un cuadrado y un círculo.

import javax.swing.JPanel;
import java.awt.Graphics;

public class Ventana extends JPanel{
  public void paintComponent(Graphics g){
   super.paintComponent(g);
  
   g.drawRect(10,10,150,150);
   g.drawOval(10,10,150,150);
  }
}

Esto creará un cuadrado y un círculo con las mismas coordenadas. Al ejecutar el programa, esto se vería así:

Entonces, para variar la forma y ubicación de las figuras, solamente habría que modificar sus atributos.
Hay muchas más figuras que se pueden crear, pero eso lo dejaremos para otro tutorial. Antes de seguir avanzando quiero mencionar un tema que se mencionó hace algún tiempo y que quedé con la deuda de explicar con un poco más de detalle. Me refiero a los métodos static.

METODOS STATIC

Un método static, también conocido como método de clase, es un método que no depende del contenido de un objeto, sino más bien, es un método que depende de su clase. Esto quiere decir que no hay que crear objetos para estos métodos para poder usarlos, como cuando creamos un objeto con la palabra new.  Por lo general, los métodos static se utilizan para realizar tareas comunes que representan a sus clases. Al declarar un método como static en una clase, se permite acceder de una forma "casi" directa a ese método, pero solamente para realizar la función que tiene ese método y no para manipular  sus atributos (variables). Esta es una de las diferencias que tienen los métodos static de los no static.
Un método static sólo puede llamar directamente a otros métodos static de la misma clase
(es decir, usando el nombre del método por sí solo
). Para acceder a los miembros no static de la clase, un método static debe usar una referencia a un objeto de esa clase. Los métodos no static se asocian con una instancia específica de la clase y pueden manipular las variables de instancia de ese objeto. Java no permite que un método static acceda directamente a los miembros no static de la misma clase.
Para utilizar o llamar a un método static, hay que escribir el nombre de la clase seguido de un punto y el nombre del método. De esta forma:
nombreClase.nombreMetodo();
Por ejemplo, la clase Math, posee muchos métodos static y para utilizarlos no es necesario crear un objeto como dijimos antes, a diferencia de la clase Scanner en la cual tenemos que crear un objeto con la palabra new. Volviendo a la clase Math, el método Math.pow() permite calcular la potencia de un número, o el método Math.sqrt(), permite calcular la raíz cuadrada. Por cierto, la clase Math, es parte del paquete java.lang que se importa de manera implícita (o automática), lo que significa que no hay necesidad de importarla para utilizar sus métodos.
En el siguiente ejemplo, se implementó un método static que calcula una potencia sin utilizar el método Math, esto se logró con un método recursivo (que se llama a sí mismo). En este caso el método al encontrarse en la misma clase, no es necesario (aunque es posible) escribirlo mediante el nombre de la clase seguido de un punto. Simplemente se llama por el nombre del método.

import java.util.Scanner;
public class Ejercicios{
  public static void main(String []args){
    Scanner ingreso = new Scanner(System.in);
    int a,b;
        System.out.print("Base: ");
        a = ingreso.nextInt();
        System.out.print("Exponente: ");
        b = ingreso.nextInt();
//método potencia(a,b) se llamo sin el nombre de su clase por encontrase
//dentro de la misma. Ejercicios.potencia(a,b) produce el mismo resultado
        System.out.println("Resultado: "+ potencia(a,b));
    }//fin main
    //Metodo static se implementa fuera del método main
    public static int potencia(int base, int exp){
      if (exp == 0)
         return 1;
      else
         return base * potencia(base,exp - 1);
  }//fin metodo
}//fin class

Si implementamos este mismo ejemplo en una clase distinta, entonces en esa ocasión sí que hay que llamar al método por el nombre de su clase seguido de un punto y el nombre del método.
Ejemplo de esa situación a continuación:

//clase main
public class Ejercicios{
  public static void main(String []args){
    Scanner ingreso = new Scanner(System.in);
    int a,b;
        System.out.print("Base: ");
        a = ingreso.nextInt();
        System.out.print("Exponente: ");
        b = ingreso.nextInt();
//Se llama al método static mediante el nombre de su clase seguido de un punto
//y luego el nombre del método
        System.out.println("Resultado: "+ Metodos.potencia(a,b));
    }//fin main
}//fin class


//Clase creada en un archivo diferente

public class Metodos{
  public static int potencia(int base, int exp){
    if (exp == 0)
      return 1;
    else
      return base * potencia(base,exp - 1);
  }//fin metodo
}//fin class




Como se mencionó antes, la clase Math, proporciona varios métodos static, entre los cuales podemos destacar los siguientes:

abs( x ) valor absoluto de x
ceil( x ) redondea x al entero más pequeño que no sea menor de x
cos( x ) coseno trigonométrico de
exp( x ) método exponencial e
floor( x ) redondea x al entero más grande que no sea mayor de x
log( x ) logaritmo natural de x
max( x, y ) el valor más grande de x y
min( x, y ) el valor más pequeño de x y
pow( x, y ) x elevado a la potencia
sin( x ) seno trigonométrico de x
sqrt( x ) raíz cuadrada de x
tan( x ) tangente trigonométrica de x

Lo siguiente es un extracto que saqué textual de la web.
¿Por qué el método main se declara como static?
Al declarar a main como static, la Máquina Virtual de Java (JVM) puede invocar a main sin tener que crear una instancia de la clase.

Esto es todo por ahora. Saludos

Gustavo J. Cerda Nilo
Septiembre 2016, Octubre 2016



No hay comentarios:

Publicar un comentario

C++ El apuntador This

El apuntador This En C++, cada objeto tiene acceso a su propia dirección a través de un puntero o apuntador denominado This. Lo...