Pasar un arreglo desde el main a un metodo en una clase

Iniciado por rgomez9119, 31 Octubre 2016, 18:30 PM

0 Miembros y 7 Visitantes están viendo este tema.

rgomez9119

Hola a todos,

Estoy aprendiendo JAVA en ECLIPSE NEON y tengo una duda para poder resolver un ejercicio.

Main:

public class Main {

public static void main(String[] args) {

Centralita callcenter = new Centralita();

LlamadaProvincial p1 = new LlamadaProvincial ("8299333777", "8095551111", 43, 1);
Centralita.registrarLlamada(p1);
}

}


clase Centralita:

import java.util.ArrayList;

public class Centralita {

public static ArrayList<Llamada> llamadas = new ArrayList<Llamada>();
private int cont; // TotalLlamadas
private int acum; // TotalFacturado

public int getTotalLlamadas()
{
return cont;
}

public double getTotalFacturado()
{
return acum;
}

public static void registrarLlamada(Llamada llamadas)
{
cont++;
acum++;
}

}


1. En el Main:
LlamadaProvincial p1 = new LlamadaProvincial ("8299333777", "8095551111", 43, 1);
Centralita.registrarLlamada(p1);

estoy tratando de pasar "p1" al metodo registrarLlamada() que esta en la clase Centralita. Pero me sale error.

2. En el metodo:
public static void registrarLlamada(Llamada llamadas)
estoy pasandole el arreglo correctamente?.
Llamada = tipo de dato (otra clase que tengo)
llamadas =  nombre del arreglo

3. Cual es la forma correcta de pasarle datos a un metodo en otra clase?. Que estoy haciendo mal?

4. El uso de public y static es obligatorio para que el metodo y el arreglo sean visibles en el main?.

Espero puedan ayudarme, a lo mejor son dudas fáciles para ustedes pero, para mi es un dolor de cabeza.
Saludos.

ivancea96

#1
public class Main {

public static void main(String[] args) {

Centralita callcenter = new Centralita();

LlamadaProvincial p1 = new LlamadaProvincial ("8299333777", "8095551111", 43, 1);
Centralita.registrarLlamada(p1);
}

}


Si quieres registrar llamadas dentro de la centralita callcenter, entonces deberás poner:
callcenter.registrarLlamada(p1);

Bien, eso no te funcionará, porque registrarLlamada es static. Tendrías que quitarle el static. Probablemente, no quieras ningún static en esa clase ("llamadas" tampoco debería ser static)

Un miembro static "pertenece a la clase, no al objeto".

Por ejemplo:

Código (java) [Seleccionar]
public class Clase {

   public static int numStatic;

   public int num;

}


Puedes hacer:
Código (java) [Seleccionar]
Clase objeto = new Clase();

objeto.num = 5;

// O

Clase.numStatic = 10;


NO puedes hacer:
Código (java) [Seleccionar]
Clase objeto = new Clase();

objeto.numStatic = 5;

// NI

Clase.num = 10;


¿Razón?
objeto.numStatic: Como dijimos, un miembro static pertenece a la clase en sí. Por tanto, no al objeto.
Clase.num: Por otra parte, un miembro no-static existe en cada objeto, pero no existe en la clase.

Código (java) [Seleccionar]
Clase objeto1 = new Clase();
Clase objeto2 = new Clase();

objeto1.num = 5;
objeto2.num = 7;

Clase.numStatic = 10;


Ahí habrá 3 valores diferentes:
objeto1.num == 5
objeto2.num == 7
Clase.numStatic == 10




Las funciones son más de lo mismo.
Un método static se invoca con "Clase.metodo()". Dentro de la función static, tendrás acceso a los miembros static (numStatic, por ejemplo).
Un método no-static se invoca con "objeto.metodo()". Dentro de la función no-static, tendrás acceso a los miembros no-static (los del objeto). Además, puedes acceder a los miembros static como lo harías normalmente ("Clase.miembro").

Si algo no te quedó claro, pregúnta de nuevo, especificando el qué.
Haciendo esos cambios, debería funcionarte correctamente. Si no lo hace, coloca aquí el código, el error y la línea del error.


Citar4. El uso de public y static es obligatorio para que el metodo y el arreglo sean visibles en el main?.
Si es public, podrás llamar o utilizar objetos desde fuera de la clase. Si es private, solo desde dentro. Si es protected, desde dentro y desde las clases que hereden de ella.

rgomez9119

Gracias por la explicacion. Entiendo mejor.

Acerca de:
public static ArrayList<Llamada> llamadas = new ArrayList<Llamada>();

Debo remover el static tambien?, como se manejan los array con static, estoy confundido, cuando debo usar static en un arreglo y cuando no.

ivancea96

Cita de: rgomez9119 en 31 Octubre 2016, 19:26 PM
Gracias por la explicacion. Entiendo mejor.

Acerca de:
public static ArrayList<Llamada> llamadas = new ArrayList<Llamada>();

Debo remover el static tambien?, como se manejan los array con static, estoy confundido, cuando debo usar static en un arreglo y cuando no.

Arreglo o no arreglo, tipo nativo u objeto, no importa. Las reglas son las mismas.

Código (java) [Seleccionar]
Centralita a = new centralita();
Centralita b = new Centralita();


¿Quieres que cada centralita tenga sus propias llamadas?
Si lo haces no-static, cada centralita tendrá su array de llamadas.
Si lo haces static, solo habrá 1 array de llamadas global.

Si la respuesta es sí, quita el static.

rgomez9119

A ver si entendi bien:

public static ArrayList<Llamada> llamadas = new ArrayList<Llamada>();

solo existira este arreglo de forma permanente para todo el programa y para Centralita.

Si hago:

public ArrayList<Llamada> llamadas = new ArrayList<Llamada>();

Puedo crear cuantos arraylist sean necesarios, por ejemplo puedo crear:

public ArrayList<Llamada> llamadasProvinciales = new ArrayList<Llamada>();

public ArrayList<Llamada> llamadasLocales = new ArrayList<Llamada>();

y poder trabajar con ambos, enviandolos a los metodos de la clase Centralita, etc..

??

El ejercicio es pedir la hora de llamada, dependiendo de la hora, las LlamadasProvinciales tienen diferente precio, o sea, debo preguntar por un "int" y guardarlos en el array.

Las LlamadasLocales no necesitan, o sea, no debo pedir por un "int", para esto pense hacer otro arreglo para tener ambas cosas separadas y poder contabilizas las llamadas y sumar el costo total mas facilmente.

No se si es la mejor forma, aun sigo aprendiendo esto de clases, etc...

ivancea96

Si haces diferentes ArrayList, tendrás esos ArrayList en cada objeto centralita.

Código (java) [Seleccionar]
Centralita a = new Centralita();
Centralita b = new Centralita();
a.llamadasProvinciales
b.llamadasProvinciales


Sería correcto. Cada centralita tendría sus propias llamadas, independientes de las otras.

rgomez9119

#6
Hola,
una pregunta mas.

En las clases LlamadaProvincial y LlamadaLocal tengo el metodo:

public double calcularPrecio()
{

}


Como puedo hacer para enviar el arreglo a ese metodo, en ambas clases, determinar si la llamada es Provincial o Local para hacer el calculo del costo de la llamada, cada clase tiene su precio.

Ejemplo:

Main

public class Main {

public static void main(String[] args) {

Centralita callcenter = new Centralita();

LlamadaProvincial llamadaEntranteProvincial1 = new LlamadaProvincial ("8299333777", "8095551111", 43, 1);
callcenter.registrarLlamada(llamadaEntranteProvincial1);

LlamadaLocal llamadaEntranteLocal1 = new LlamadaLocal ("8299333777", "8093330000", 13);
callcenter.registrarLlamada(llamadaEntranteLocal1);
}

}


Como envio eso a los metodos, juntos o separados para hacer el calculo.
Estoy perdido, manejarse entre clases es un poco problemático al inicio del aprendizaje.

Te muestro el codigo que tengo hasta ahora.

Main:
import java.util.ArrayList;

public class Centralita {

private ArrayList<Llamada> llamadasProvinciales = new ArrayList<Llamada>();
private ArrayList<Llamada> llamadasLocales = new ArrayList<Llamada>();
private int cont; // TotalLlamadas
private int acum; // TotalFacturado

public int getTotalLlamadas()
{
return cont;
}

public double getTotalFacturado()
{
return acum;
}

public void registrarLlamada(LlamadaProvincial llamadaEntranteProvincial)
{
cont++;

llamadasProvinciales.add(llamadaEntranteProvincial);
}

public void registrarLlamada(LlamadaLocal llamadaEntranteLocal)
{
cont++;

llamadasLocales.add(llamadaEntranteLocal);
}

}


Centralita
import java.util.ArrayList;

public class Centralita {

private ArrayList<Llamada> llamadasProvinciales = new ArrayList<Llamada>();
private ArrayList<Llamada> llamadasLocales = new ArrayList<Llamada>();
private int cont; // TotalLlamadas
private int acum; // TotalFacturado

public int getTotalLlamadas()
{
return cont;
}

public double getTotalFacturado()
{
return acum;
}

public void registrarLlamada(LlamadaProvincial llamadaEntranteProvincial)
{
cont++;

llamadasProvinciales.add(llamadaEntranteProvincial);
}

public void registrarLlamada(LlamadaLocal llamadaEntranteLocal)
{
cont++;

llamadasLocales.add(llamadaEntranteLocal);
}

}


LlamadaLocal

public class LlamadaLocal extends Llamada {

private final double precio = 0.15;

public LlamadaLocal(String numOrigen, String numDestino, int duracion) {
super(numOrigen, numDestino, duracion);
}


public double calcularPrecio()
{

}

public String toString()
{

}

}


LlamadaProvincial

public class LlamadaProvincial extends Llamada {

private final double precio1 = 0.20;
private final double precio2 = 0.25;
private final double precio3 = 0.30;
private int franja;

public LlamadaProvincial(String numOrigen, String numDestino, int duracion, int franja) {
super(numOrigen, numDestino, duracion);
this.franja = franja;
}

public int getFranja() {
return franja;
}

public void setFranja(int franja) {
this.franja = franja;
}

public double calcularPrecio()
{

}

public String toString()
{

}

}


Llamada

public class Llamada {

private String numOrigen;
private String numDestino;
private int duracion;

public Llamada(String numOrigen, String numDestino, int duracion) {
super();
this.numOrigen = numOrigen;
this.numDestino = numDestino;
this.duracion = duracion;
}

public String getNumOrigen() {
return numOrigen;
}

public String getNumDestino() {
return numDestino;
}

public int getDuracion() {
return duracion;
}

}


Me siento perdido, espero puedas ayudarme y no sea mucha molestia. Estoy aprendiendo. Todo es mas facil en C o C++ :(, esto de clases me parte el caco...

ivancea96

En C++ también hay clases. Incluso diría que es más complejo su manejo jaja

No estoy seguro de qué quieres hacer, pero a la pregunta "Cómo enviar un ArrayList como parámetro", es exactamente igual que pasar cualquier otro objeto:
Código (java) [Seleccionar]
public double calcularPrecio(ArrayList<Llamada> llamadas)
{

}


Y luego:

Código (java) [Seleccionar]
objeto.calcularPrecio(centralita.llamadasLocales);

rgomez9119

En la clase LLamadaLocal y Provincial no me sale ningun get para poder obtener la duracion.

LlamadaLocal
import java.util.ArrayList;

public class LlamadaLocal extends Llamada {

private final double precio = 0.15;

public LlamadaLocal(String numOrigen, String numDestino, int duracion) {
super(numOrigen, numDestino, duracion);
}


public double calcularPrecio(ArrayList<Llamada> llamadasLocales)
{
acum += llamadasLocales[b].NADA![/b]
}

public String toString()
{

}

}


Que tengo mal?, por qué los get no me salen visibles?. Los get estan en la clase Llamada. Arriba te puse el codigo.

Espero que me ayudes.

ivancea96

llamadas es un Arraylist. Tendrás que acceder primero a los métodos de ArrayList para obtener la llamada que quieras. O hacer un for por cada llamada.
Código (java) [Seleccionar]
Llamada llamada = llamadas.get(2); // Ese 2 lo cambias por el índice que quieras
llamada. etc;