POO-ITBA / 2023_02

0 stars 0 forks source link

Duda acerca de Variables/Métodos de clase #1

Open Jalbertonisalini opened 1 year ago

Jalbertonisalini commented 1 year ago

Buenas! No me queda claro en que momento se inicializan los valores de las variables de clase. Entiendo que pueden ser llamadas sin necesidad que exista un objeto (al igual que los metodos de clase) pero no entiendo algunas cuestiones...

image

Acá, ¿qué tiene format o donde debería yo asignarle el valor a format? Luego, un método de clase podría tener como parametros por ejemplo:

static int compare (Date d1, Date d2)

Pero a este si lo llamo sin crear ningun objeto no debería funcionar ya que no existirían d1 ni d2. ¿Es así?

Perdón si las preguntas son muy "estándar" y sé que se charló en clase pero repasando se me mezclaron las cosas y prefiero cubrirlas antes de que sea tarde jajaj

Saludos y gracias!

fmeola commented 1 year ago

Hola Juan Las variables de clase las podés inicializar vos o sino se inicializarán con un valor por defecto cuando se carga la definición de la clase. Por ejemplo si hacés un main para consultar el valor de format:

System.out.println(Date.format);

y vas a ver que obtenés null. Al igual que las variables de instancia, si es de un tipo de dato built-in (int, char, double, etc) se inicializan en 0 (o en false para boolean) y sino (si es una instancia de una clase como Integer, Date, etc.) se inicializa en null. Acá como es String se inicializa en null. Para asignar el valor de format manteniendo la variable como privada deberías hacer un método de clase setter como:

   public static void setFormat(String format) {
        Date.format = format;
    }

Respecto a lo de compare, no es así. Justamente un método de clase, al no acceder a variables de instancia del objeto receptor del mensaje, puede implementarse accediendo únicamente al estado de los parámetros. En este caso compare puede resolverse invocando únicamente a métodos de d1 y d2. Es verdad que podés invocar a Date.compare(...,...) sin haber llamado al constructor de Date pero para conseguir esos dos parámetros vas a tener que haber instanciado uno o dos objetos de tipo Date más arriba. No hay preguntas "estándar", ustedes pregunten tranquilo que para eso está este GitHub.