Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > problemas al llamar a una instancia

buenas, es la primera vez en utilizar este foro y espero no meter la pata... también soy nuevo en java y utilizo bluej....
la cosa es que tengo dos clases, materia y academia.
lo que quiero es que cada vez que se cree una instancia de la clase materia, automáticamente se añada un valor en un array de la única instancia de la clase academia.
probé varias cosas y ninguna funciono (no lo quiero hacer con un método ya que habría que llamarlo, pensé hacerlo en el constructor)
esto es parte del código de la clase materia:

private Academia academia;
public Materia()
{
academia=new Academia();
academia1.Ingresa_Valor("lo que sea");
}

no me compila por lo de academia1 (que como dije es la única instancia que hay de esta clase), el mensaje que me da bluej es:
"cannot find symbol-variable materia1"
y bueno, que yo sepa esto es todo lo que puedo decir.
gracias de antemano

agosto 17, 2016 | Registered Commenterjosemari75

¿No encuentra materia1 o academia1?
No puede encontrar academia1 porque la variable que has declarado es academia, sin 1
Si lo que no encuentra es materia1... supongo que tendrás un error parecido.

agosto 17, 2016 | Registered Commenterchoces

lo que no encuentra es academia1,que es una instancia ya creada de la clase Academia... entonces ¿como la declaro?
academia1=new Academia();
probé eso y no compilaba, así que cambie también
private Academia academia1;
pero esto realmente crea un campo al cual habría que asociarlo a la instancia en cuestión.
espero aclarar con esto mi explicación... si tuviéramos este método:

public void IngresaAcademia (Academia academia)
{
this.academia=academia;
}
estaríamos haciendo lo que yo deseo hacer en el constructor...
¿me explique?
con este método, ya podría llamar a cualquier método de la instancia que yo hubiera introducido (Academia academia) , pues lo que deseo es tener esa instancia presente en el constructor, es la única que va a existir....
¿me explique?
gracias

agosto 17, 2016 | Registered Commenterjosemari75

otra cosa por curiosidad, donde cambio para que se avise a mi mail cuando alguien conteste mis post?
gracias

agosto 17, 2016 | Registered Commenterjosemari75

Lo que no puedes hacer es usar una propiedad o variable sin declararla antes. El nombre es lo de menos.

Si lo que quieres es crear y usar una instancia de la clase Academia en el constructor de la clase Materia:

private Academia academia;

public Materia()
{
academia=new Academia();
academia.Ingresa_Valor("lo que sea");
}

agosto 17, 2016 | Registered Commenterchoces

no entiendo tu idea, suponiendo que hubiera mas instancias de la clase academia (academia1, academia2, ...), con ese código, ¿a cual de las instancias iría a ingresar "lo que sea"?

agosto 17, 2016 | Registered Commenterjosemari75

Una cosa es qué método de la clase Academia uses para "lo que sea", y otra las variables que declares para asignarles instancias creadas de Academia.
Mi "idea" es explicarte el por qué de ese error de compilación.

Lo que sospecho es que tienes un problema de diseño.
¿Podrías explicar con más detalle lo que quieres lograr?

agosto 17, 2016 | Registered Commenterchoces

perdona por mi despiste, pensé que lo había explicado...

lo que quiero es que cada vez que se cree una instancia de la clase materia, automáticamente se añada un valor en un array de la única instancia de la clase academia.

el método en academia al que llamo es así:

public void .Ingresa_Valor (String valor)
{
valores.add(valor);

}

¿esta bien así?
gracias

agosto 17, 2016 | Registered Commenterjosemari75

No puedes resolverlo creando una instancia nueva de la clase Academia, cada vez que se crea una de la clase Materia.
Cada instancia creada es única, e independiente de las demás... a excepción de propiedades y métodos estáticos de esa clase.
Si declaras ese método como static:

public static void ingresaValor (String valor)
// los métodos en Java deben comenzar en minúscula, y mejor sin guiones
{
valores.add(valor); // valores también debe declararse static
}

Así puedes llamar al método como Academia.ingresaValor("lo que sea");
sin necesidad de crear cada vez una instancia de Academia.
El "problema" es que valores es la misma propiedad (junto con sus contenidos) para todas las instancias de Academia. Es algo a tener en cuenta, sobre todo si usas la concurrencia (multitarea) más adelante.

agosto 17, 2016 | Registered Commenterchoces

tienes razón en todo esto, pero sigo sin ver como resuelvo la llamada....
en síntesis, mi problema se basa en llamar al método de academia1, si lo hago como ya dijimos, siempre sobreescribira lo que ya había, entonces, como hago para referirme a una instancia en concreto en java (en este caso me da igual que sean todas por que solo habrá una)
intente hacerlo mediante un metodo, pero hay que darle valor, y yo quiero que todo eso sea automatico, ose, el metodo que digo seria asi...
Clase Materia:

public void ValorparaAcademia (Academia academia, String valor)
{
academia.Ingresa_Valor(valor);
}
ahora bien, ¿el valor de academia como se establece por defecto?
algo asi como academia=academia1.....
¿me explique?
lo siento si no lo dejo claro, pero no se como explicar mejor mi situacion...
gracias

agosto 18, 2016 | Registered Commenterjosemari75

No hay "valor por defecto" para una instancia de una clase: el valor se le asigna creando la instancia.

Academia academia = new Academia();
Academia academia1 = new Academia();

academia y academia1 son instancias de Academia, pero son objetos diferentes, no son intercambiables.

Utilizando métodos estáticos, como explicaba más arriba, puedes resolverlo así:

public Materia()
{
Academia.ingresaValor("lo que sea");
}

Porque, en este caso, el método ingresaValor, al ser estático, es el mismo para todas las instancias que se creen de Academia. No es necesario crear una instancia de Academia para usarlo; por eso se puede invocar directamente con el nombre de la clase, y no necesariamente con el de una instancia de la misma.

agosto 18, 2016 | Registered Commenterchoces

perdona, pero de veras que no se donde me equivoco....
clase academia:

protected static ArrayList<Materia> materias;
......
public static void Ingresa_Materia(Materia materia)
......

clase materia:
(en el constructor)

academia.Ingresa_Materia(this);//no compila

el fallo que da es
"cannot find symbol-variable academia"
de verdad, ¿que hago mal?
otra cosa que tambien intente, aqui si compila, pero no se añade la materia es

clase materia:

private Academia academia;
.....
public Materia()
{
academia=new Academia();
..........
academia.Ingresa_Materia(this);
}
y bueno, como dije antes, esto no añade la materia a la clase acdemia
en sereio que estoy perdido...
gracias

agosto 18, 2016 | Registered Commenterjosemari75

Para la primera solución:
Academia.Ingresa_Materia(this); //ahora debería compilar y funcionar

Fíjate que uso el nombre de la clase, en Mayúscula y no el de una variable.

Deberías acostumbrarte a usar las convenciones sintácticas de Java, para no enredarte tu mismo, ni a otros que lean tu código:

* Clases empiezan con letra mayúscula
* Propiedades, variables locales y métodos con letra minúscula.

agosto 18, 2016 | Registered Commenterchoces

si compila pero no funciona, no añade las materias....
gracias

agosto 18, 2016 | Registered Commenterjosemari75

¿Lanza alguna excepción?
¿Cuál es el contenido de esta lista: ArrayList<Materia> materias;?
Dicho de otro modo: ¿Cómo detectas que no funciona?.

agosto 18, 2016 | Registered Commenterchoces