Curso Java. Volumen V : Argumentos, constructores y operadores

Escrito por Adrián Crespo
Java

En este volumen os voy a explicar qué son los argumentos en Java y cómo se usan, también hablaremos de los constructores y de los principales operadores que nos podemos encontrar en Java.

Este artículo será más práctico que los anteriores que tenía sólo teoría, debemos ir poco a poco ya que sino programaremos sin saber qué es cada cosa, y al principio podremos “sobrevivir” pero cuando luego las cosas no salen…ahí está el problema.

Este va a ser de los últimos artículos de teoría pura y dura (necesitaremos uno más para hablar de los bucles) y a partir de aquí estaremos con ejemplos y con ejercicios diversos usando todo lo que hemos aprendido.

Argumentos

Representan un dato de un tipo determinado, declarado dentro de los paréntesis en el encabezamiento de un método, y alojado en la memoria.

  •  Contiene un valor.
  •  Se representa por un nombre.

Ejemplo de declaración de argumentos

public tipo_retornado nombreDelMetodo1 (tipo1 nombre1,
tipo2 nombre2)
{

}

Ejemplo de programa con datos

Cálculo de la media de tres notas.

La clase tendrá:

  •  Tres atributos enteros (las tres notas)
  •  Método para cambiar las notas: – Tres parámetros enteros (nuevos valores de las notas). – No retorna nada
  •  Método para hallar la media entera: retorna la media
  •  Método para hallar la media real: retorna la media

Este es el diagrama de clases que podría estar asociado a los requerimientos de el problema que se plantea:

Implementación

public class Notas
 {

//Atributos de la clase
 private int nota1, nota2, nota3;

/** Pone los valores de las tres notas */
 public void ponNotas (int n1, int n2, int n3)
 {
 nota1=n1;
 nota2=n2;
 nota3=n3;
 }

/** Calcula la media real */
 public double media()
 {
 return (nota1+nota2+nota3)/3.0;
 }

/** Calcula la media entera */
 public int mediaEntera()
 {
 return (nota1+nota2+nota3)/3;
 }
 }

Comentarios sobre el ejemplo:

  •  Argumentos de un método: datos que el método necesita.
  •  Valor de retorno de un método: respuesta.
  •  Operador de asignación : “=”.
  •  Operador de suma: “+”.
  •  Uso de paréntesis.
  •  Expresiones reales y enteras: conversiones automáticas.

¡Probad el cálculo como (nota1+nota2+nota3)*(1/3)!

Uso de un constructor

El ejemplo pone de manifiesto la necesidad de dar valor a los atributos

  •  Hemos creado ponNotas para ello
  •  Es una necesidad frecuente

El constructor:

  •  Es un método especial, usado al crear el objeto (con new) para dar valor a los atributos
  •  Sintaxis: método de nombre igual a la clase y en el que no se pone lo que retorna:
  •  Ventaja: al crear el objeto, el constructor nos obliga a poner las notas.

Operadores y expresiones

Las expresiones permiten transformar datos para obtener un resultado. Se construyen con operadores y operandos.

Operandos:

  •  Constantes literales.
  •  Datos simples (atributos, variables, o argumentos de tipos simples).
  •  Funciones (métodos que retornan un valor de un tipo simple).

Operadores más usuales:

Indican la operación a realizar en una expresión

  •  Dependen del tipo de dato
  •  Tienen unas reglas de precedencia
  •  El paréntesis altera la precedencia

Operadores aritméticos: operan con números, y dan como resultado números del mismo tipo.

Operadores relacionales: comparan dos números o caracteres y dan un resultado lógico.

Operadores lógicos: operan con valores lógicos y dan otro valor lógico.

Operador de asignación simple: copia un valor en una variable (=)

Otros operadores de asignación: opera con los operandos izquierdo y derecho y copia el resultado en el izquierdo.

Operador de concatenación: retorna la concatenación del operando izquierdo (String) con la conversión a String del operando derecho (+).

Ejemplo de uso de Operadores

Cálculo de valores resistivos en paralelo.

Diseño de la clase:

  • Atributos: las resistencias
  • Constructor que les da valor inicial
  • Un método que devuelve la resistencia equivalente

public class Resistencias
 {
 private double r1, r2, r3; //Kohms

/** Constructor*/
 public Resistencias(double res1, double res2, double res3)
 {
 r1=res1;
 r2=res2;
 r3=res3;
 }

/** Calcula la resistencia equivalente a 3 resistencias en paralelo */
 public double calculaResEquiv()
 { // Kohms
 return 1/((1/r1)+(1/r2)+(1/r3));
 }
 }

Ejemplo: uso desde un programa principal (main).

Ahora podemos hacer una clase que usa un objeto de la clase anterior, para poder usar su operación:

public class ResistenciasEnParalelo
 {
 public static void main(String[] args)
 {
 double r1=3.5; // Kohms
 double r2=5.6; // Kohms
 double r3=8.3; // Kohms
 double reff; // Kohms
 Resistencias res=new Resistencias(r1,r2,r3);

// alternativamente se podría hacer
 // Resistencias res= new Resistencias(3.5,5.6,8.3);

reff=res.calculaResEquiv();
 System.out.println
 ("Resist. en paralelo: "+r1+","+r2+","+r3);

System.out.println("Resistencia efectiva = "+reff);
 }
 }

Observaciones del ejemplo

  •  Creación de un objeto de la clase Resistencias: declaración+new.
  •  Creación de variables locales.
  •  Diferencias entre crear una variable y un objeto.
  •  Uso de un método.
  •  Concatenación.

Conversión de tipos

Compatibilidad de tipos: Java es un lenguaje con tipificación estricta..

  •  Los números son compatibles hacia “arriba” (promoción automática de tipos): es decir, el tipo destino tiene mayor cabida que el origen
  •  No son compatibles cosas de distinta naturaleza (p.e., números con char o boolean)
  •  También hay conversión automática al almacenar un literal en un byte o short (pero no en expresiones no literales).

Conversiones explicitas de tipos (cast)

Sintaxis

(tipo) exp

Hay que usarlas con precaución, porque hay truncamiento de la parte fraccionaria, y/o operación módulo. Por ejemplo:

int i;
 double d=3.4;
 i= (int) d; // valor=3
 byte b;
 int j=1000;
 b=(byte) j; // valor=-24

Hasta aquí finalizamos por hoy, el próximo artículo tratará sobre los distintos tipos de bucles en Java y luego nos pondremos a hacer ejercicios que es donde más se aprende.


Continúa leyendo
  • Nova6K0

    Impresionante, sinceramente. 😉

    Salu2

    • yyeeaahh

      Estoy con Nova6K0.
      Impresionante…

  • Royal_Krow

    Hola =D no acabo de entender que conversion hace o que pasa en esta parte =P me pueden explicar un poquito??

    byte b;
    int j=1000;
    b=(byte) j; // valor=-24

    Gracias!!

    • un byte solo coge los 8 bits de un numero, incluido el que le otorga el signo, nosotros tenemos el numero 1000, que en binario es 1111101000. Si contamos tenemos que los 8 bits que usaria el byte son: 11101000. El octavo es un uno, por lo tanto es un signo negativo. Si fuese cero seria positivo. Con los 7 bits restantes, los pasamos a complemento a-2 y obtenemos 0011000 que en binario es 24 y con el signo 100011000 obtenemos el -24.

      Es un poco engorro, ya que es operar en binario

      un saludo

  • javier

    Hola Adrian.Estoy dando mis primeros pasos en este maravilloso Lenguaje y toda la informacion me parece poca para aprender tal es asi que al leer el libro “Aprenda Java como si estuviera en primero ” y mas precisamente el tema operadores que vemos en este volumen, clasifica los operadores de la siguiente manera:
    1 Operadores aritmeticos
    2 ” de asignacion
    3 ” unarios
    4 ” instanceof
    5 ” condicional
    6 ” incrementales
    7 ” relacionales
    8 ” logicos
    9 ” de concatenacion de cadenas de caracteres (+)
    10 ” que actuan a nivel de bits.
    mi pregunta es si esta bien leer dicho libro que se basa en la version JAVA 2 y nos muestra esta clasificacion de operadores distinta a la que vemos en este volumen o es que son los mismos y aca vemos solo los mas importantes

    • seguramente en el libro te aparezcan los mismos operadores que en cualquier otro, lo que cambia es la forma de distribuirlos en grupos, hay unos que ponen mas tipos y otros menos. Los tipos que yo he puesto los he cogido basandome en “La Biblia de Java”, que es un buen libro pero no para estar empezando en el lenguaje porque viene todo explicado como si ya llevases 1 año dando java.
      Lo de los tipos es dependiendo de cada libro. Si te fijas, yo los incrementales, les meto en el grupo de los aritmeticos. Los que he metido en las tablas del volumen, son los que vamos a utilizar ahora y cuando ya seamos unos gurus de java xD

  • lorena

    a buen libro haci k buscare informacion es este gracias

  • Carlos

    hola adrian
    dentro de paquete1, cree el ejercicio de notas el primero, lo hice ral cual pero cuando lo compilo me dice

    class “paquete1.notas” does not have a main method. ————–> que puede ser, ?..

    • eso te pasa porque tienes una clase con código pero no tienes el método main para ejecutarlo.

      Pásame el código a mi dirección de correo: adrian.crespo[at]redeszone.net y lo miro y te comento

  • Carlos

    si tienes correo de Gmail y mantienes conectado me lo escribes porfavor para agregarte listo si puedes

  • pepin

    Hola, en el constructor del ejemplo de las resistencias donde pone

    /** Constructor*/
    public Resistencias(double res1, double res2, double res3)
    {
    r1=res1;
    r2=res2;
    r3=res3;
    }

    No debería ser:

    /** Constructor*/
    public void resistencias(double res1, double res2, double res3)
    {
    r1=res1;
    r2=res2;
    r3=res3;
    }

    No debería llevar void?

    • El contructor nunca devuelve nada. Aunque no devuelve nada no se pone void siemprr es public + el nombre de la clase pero nunca con void

      • Luis

        Al retirar el void la línea es macada como con error

  • Eider

    Hola,
    Tengo el mismo problema que Carlos. Al ejecutar el programa, me dice que la clase Nota no tiene método main

    • por favor mándame en un zip el proyecto que tengas de netbeans y lo miro y te lo mando corregido

  • Santiago

    Hols que tal, tengo el mismo problema del main method… me podrias ayudar

    • con el de las notas? Has probado a seleccionar el método main que quieres ejecutar cuando le das a Run en el netbeans?

      • Javier

        Hola, estoy empezando con java y no consigo hacer funcionar el primer ejercicio.He probado varias formas sin resultado.Aparece el mismo mensaje de main method cada vez que lo ejecuto.

        • Qué te pone exactamente? seguramente te diga que tienes que poner método main, selecciona la única opción que te sale de clase.

          • Javier

            Pongo una imagen adjunta

          • AdrianCrespo

            Te falta otra clase con el método main para crear objetos de la clase notas y así poder utilizar sus métodos. ese es el fallo que te indica Netbeans

            public class prueba
            {
            public static void main(String[]args)
            {
            Notas n= new Notas();
            n.ponNotas(4,5,6);

            System.out.println(n.mediaEntera());
            }
            }

            por ejemplo 🙂

          • Javier

            Muchas gracias, ahora ya lo he podido hacer funcionar XD

          • Garoulic

            hola, Adrian. perdona las molestias:

            ¿siempre ha de haber un metodo main (como en los ejemplos)? he seguido (y tecleado a mano) los ejemplos) y en muchos de ellos simplemente se indica la creacion de una clase pero al ir a correrlo siempre pide un main method.

            En cuanto a los constructores ¿el programa debería pedirte que introdujeses algún dato?¿debería mostrarte algo o como creo falta algo del tipo Sout con las variables para hacerlo?

          • jorgea989

            Toda aplicacion Java require de un metodo main, es a partir de este que se inicia la creacion y llamado a los objetos, en cuanto al constructor, cuando se crea el objeto es este el que es llamado, por ende si en el constructor se piden cierta cantidad de parametros, al crearlo se deben suministrar dicha cantidad de parametros, de lo contrario la aplicacion no correra y netbeans dira que existe un error, intenta usar control + espacio para que veas los parametros que se requieren al crear el objeto en el metodo main Algo algo = new Algo()

          • Luis

            ¿Y como “sabe” que el constructor es “PonNotas” y no otro? Que hace que uno sea “el constructor”?

          • Luis

            Pese a que seguí tu ejemplo, sale un error. Aquí mi código:

            public class Proyecto01_HolaMundo {

            public static void main(String[] args) {

            Notas xpromedio;

            xpromedio = new Notas(); /* <— aqui error */

            xpromedio.ponNotas(12,13,15);
            double x1;
            x1 = xpromedio.media();

            System.out.println(xpromedio);
            System.out.println(x1);
            }
            public class Notas
            {

            private int nota1, nota2, nota3;

            public void ponNotas (int n1, int n2, int n3)
            {
            nota1=n1;
            nota2=n2;
            nota3=n3;
            }

            /** Calcula la media real */
            public double media()
            {
            return (nota1+nota2+nota3)/3.0;
            }

            /** Calcula la media entera */
            public int mediaEntera()
            {
            return (nota1+nota2+nota3)/3;
            }
            }
            }

  • Javier

    Hola, soy nuevo en esto de Java y estoy empezando a usar este tutorial pero me aparece la ventana de main method cuando le doy a run.He intentado mil cosas pero siempre me aparece esta ventana.

  • john orjuela

    muy buenas tardes adrian la verdad que quiero comenzar a programar en java, hasta aca hiba lo mas de bn pero tengo problemas para compilar el codigo

    public class Notas ////////////////////////// he creado una clase llamada Notas
    {

    //Atributos de la clase
    private int nota1, nota2, nota3;

    /** Pone los valores de las tres notas */
    public void ponNotas (int n1, int n2, int n3) //////////////////////////aca me bota error que hago
    {
    nota1=n1;
    nota2=n2;
    nota3=n3;
    }

    /** Calcula la media real */
    public double media()
    {
    return (nota1+nota2+nota3)/3.0;
    }

    /** Calcula la media entera */
    public int mediaEntera()
    {
    return (nota1+nota2+nota3)/3;
    }
    }

    serias tan amable de ayudarme y decir que hago.

    • y qué error te da a la hora de compilar? porque yo he copiado el código que tu has puesto y me compila sin problemas