Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: rgomez9119 en 31 Octubre 2016, 18:30 pm



Título: Pasar un arreglo desde el main a un metodo en una clase
Publicado por: rgomez9119 en 31 Octubre 2016, 18:30 pm
Hola a todos,

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

Main:

Código:
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:

Código:
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:
Código:
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.


Título: Re: Pasar un arreglo desde el main a un metodo en una clase
Publicado por: ivancea96 en 31 Octubre 2016, 19:19 pm
Código:
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
  1. public class Clase {
  2.  
  3.    public static int numStatic;
  4.  
  5.    public int num;
  6.  
  7. }

Puedes hacer:
Código
  1. Clase objeto = new Clase();
  2.  
  3. objeto.num = 5;
  4.  
  5. // O
  6.  
  7. Clase.numStatic = 10;

NO puedes hacer:
Código
  1. Clase objeto = new Clase();
  2.  
  3. objeto.numStatic = 5;
  4.  
  5. // NI
  6.  
  7. 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
  1. Clase objeto1 = new Clase();
  2. Clase objeto2 = new Clase();
  3.  
  4. objeto1.num = 5;
  5. objeto2.num = 7;
  6.  
  7. Clase.numStatic = 10;

Ahí habrá 3 valores diferentes:
Código:
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.


Citar
4. 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.


Título: Re: Pasar un arreglo desde el main a un metodo en una clase
Publicado por: rgomez9119 en 31 Octubre 2016, 19:26 pm
Gracias por la explicacion. Entiendo mejor.

Acerca de:
Código:
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.


Título: Re: Pasar un arreglo desde el main a un metodo en una clase
Publicado por: ivancea96 en 31 Octubre 2016, 19:33 pm
Gracias por la explicacion. Entiendo mejor.

Acerca de:
Código:
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
  1. Centralita a = new centralita();
  2. 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.


Título: Re: Pasar un arreglo desde el main a un metodo en una clase
Publicado por: rgomez9119 en 31 Octubre 2016, 21:46 pm
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...


Título: Re: Pasar un arreglo desde el main a un metodo en una clase
Publicado por: ivancea96 en 31 Octubre 2016, 23:12 pm
Si haces diferentes ArrayList, tendrás esos ArrayList en cada objeto centralita.

Código
  1. Centralita a = new Centralita();
  2. Centralita b = new Centralita();
  3. a.llamadasProvinciales
  4. b.llamadasProvinciales

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


Título: Re: Pasar un arreglo desde el main a un metodo en una clase
Publicado por: rgomez9119 en 1 Noviembre 2016, 02:23 am
Hola,
una pregunta mas.

En las clases LlamadaProvincial y LlamadaLocal tengo el metodo:

Código:
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
Código:
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:
Código:
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
Código:
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
Código:
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
Código:
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
Código:
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...


Título: Re: Pasar un arreglo desde el main a un metodo en una clase
Publicado por: ivancea96 en 1 Noviembre 2016, 13:24 pm
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
  1. public double calcularPrecio(ArrayList<Llamada> llamadas)
  2. {
  3.  
  4. }

Y luego:

Código
  1. objeto.calcularPrecio(centralita.llamadasLocales);


Título: Re: Pasar un arreglo desde el main a un metodo en una clase
Publicado por: rgomez9119 en 2 Noviembre 2016, 03:00 am
En la clase LLamadaLocal y Provincial no me sale ningun get para poder obtener la duracion.

LlamadaLocal
Código:
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.


Título: Re: Pasar un arreglo desde el main a un metodo en una clase
Publicado por: ivancea96 en 2 Noviembre 2016, 10:30 am
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
  1. Llamada llamada = llamadas.get(2); // Ese 2 lo cambias por el índice que quieras
  2. llamada. etc;


Título: Re: Pasar un arreglo desde el main a un metodo en una clase
Publicado por: rgomez9119 en 2 Noviembre 2016, 17:35 pm
Hola,
no es eso.

En la clase Llamada, tengo numDestino, numOrigen, duracion etc..
Como accedo a esos get en la clase LlamadaProvincial y Local?.


Título: Re: Pasar un arreglo desde el main a un metodo en una clase
Publicado por: ivancea96 en 2 Noviembre 2016, 17:47 pm
Código
  1. private String numOrigen;
  2. private String numDestino;
  3. private int duracion;
Eso tienes en Llamada.
Private implica que solo se puede acceder desde la misma clase. Tú estás accediendo desde una clase hija. Para acceder, necesitarás ponerlo como protected (o hacer una función que te retorne esos objetos)


Título: Re: Pasar un arreglo desde el main a un metodo en una clase
Publicado por: rgomez9119 en 2 Noviembre 2016, 21:19 pm
Hola,
Tampoco logro obtener los get.

En LlamadaLocal, como debo invocar el get?

array.get
centralita.get
llamada.get

estoy confundido, no me sale con ninguna de esas.


Título: Re: Pasar un arreglo desde el main a un metodo en una clase
Publicado por: ivancea96 en 3 Noviembre 2016, 15:59 pm
O pones los miembros public, o creas tú los getters, que no son más que una función que retorna el objeto que quieres. "int getDuracion()"


Título: Re: Pasar un arreglo desde el main a un metodo en una clase
Publicado por: rgomez9119 en 3 Noviembre 2016, 19:49 pm
y como se invoca correctamente el get:

array.get
centralita.get
llamada.get

cual de los tres?.


Título: Re: Pasar un arreglo desde el main a un metodo en una clase
Publicado por: ivancea96 en 4 Noviembre 2016, 15:57 pm
Ninguno. Un getter es un método que creas tú.

Dentro de la clase Llamada:
Código
  1. public String getNumOrigen(){
  2.    return numOrigen;
  3. }

Y lo llamas como cualquier método. llamada.getNumOrigen();

Es un método sin más, pero se le llama "getter". Del mismo modo, un método del estilo:
Código
  1. public void setNumOrigen(String newNumOrigen){
  2.    this.numOrigen = newNumOrigen;
  3. }
Se le llama "setter".