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.
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:
public class Clase {
public static int numStatic;
public int num;
}
Puedes hacer:
Clase objeto = new Clase();
objeto.num = 5;
// O
Clase.numStatic = 10;
NO puedes hacer:
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.
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.
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.
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.
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.
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...
Si haces diferentes ArrayList, tendrás esos ArrayList en cada objeto centralita.
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.
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...
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:
public double calcularPrecio(ArrayList<Llamada> llamadas)
{
}
Y luego:
objeto.calcularPrecio(centralita.llamadasLocales);
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.
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.
Llamada llamada = llamadas.get(2); // Ese 2 lo cambias por el índice que quieras
llamada. etc;
Hola,
no es eso.
En la clase Llamada, tengo numDestino, numOrigen, duracion etc..
Como accedo a esos get en la clase LlamadaProvincial y Local?.
private String numOrigen;
private String numDestino;
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)
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.
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()"
y como se invoca correctamente el get:
array.get
centralita.get
llamada.get
cual de los tres?.
Ninguno. Un getter es un método que creas tú.
Dentro de la clase Llamada:
public String getNumOrigen(){
return numOrigen;
}
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:
public void setNumOrigen(String newNumOrigen){
this.numOrigen = newNumOrigen;
}
Se le llama "setter".