Foro sobre Java SE > problemas al llamar a una instancia
public class Lanzador {
public static void main(String[] args) {
Materia materia1 = new Materia();
Materia materia2 = new Materia();
Materia materia3 = new Materia();
Materia materia4 = new Materia();
Materia materia5 = new Materia();
Materia materia6 = new Materia();
Materia materia7 = new Materia();
Materia materia8 = new Materia();
Materia materia9 = new Materia();
Materia materia10 = new Materia();
Academia.listarMaterias();
}
}
public class Materia {
public Materia() {
Academia.ingresaMateria(Materia.this);
}
}
public class Academia {
private static List<Materia> materias = new ArrayList<>();
public static void ingresaMateria(Materia materia) {
if (materias.contains(materia)) {
System.out.println("la materia ya existe en esta lista por lo que no se añade");
System.out.println("____________________________");
} else {
materias.add(materia);
System.out.println("Materia añadida a la academia");
System.out.println("____________________________");
}
}
public static void listarMaterias() {
System.out.println("Materias:");
System.out.println("Cantidad de materias en la lista: " + materias.size());
}
}
gracias, sigue sin ingresar nada en la lista de la clase academia....
System.out.println("Cantidad de materias en la lista: " + materias.size());
esto da 0....
Siempre compruebo el código que publico.
No sé qué código estás ejecutando, pero en mi sistema, si ejecuto el código que he publicado, tal cual está, la salida por consola es la que sigue:
Materia añadida a la academia
____________________________
Materia añadida a la academia
____________________________
Materia añadida a la academia
____________________________
Materia añadida a la academia
____________________________
Materia añadida a la academia
____________________________
Materia añadida a la academia
____________________________
Materia añadida a la academia
____________________________
Materia añadida a la academia
____________________________
Materia añadida a la academia
____________________________
Materia añadida a la academia
____________________________
Materias:
Cantidad de materias en la lista: 10
Es evidente que tu código es diferente en algo.
Te sugiero que ejecutes mi código, y que lo leas atentamente, porque creo que sigues sin comprender las invocaciones estáticas, y la diferencia con la creación y uso de instancias de clase.
Es normal, siendo nuevo en Java como dices. Lleva algún tiempo acostumbrarse a las peculiaridades del lenguaje.
https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
gracias, perdon, si funciona...
lo probé aparte y funciona, así que ahora buscare que tengo en mi código que impide su funcionamiento....
lo que si me di cuenta es que en la clase academia y materia tengo un campo declarado para sus nombres como private, mi pregunta es
¿estos pasan también a ser statics?
y si, este tipo de cosas "estaicas" no las manejo todavía bien....
No necesariamente. La declaración static quiere decir que la propiedad o el método pertenecen a la clase en sí, y no a las instancias: todas las instancias de esa clase comparten las mismas declaraciones static, junto con sus valores.
uffff!!!!
estoy teniendo problemas en todo el proyecto!!!!
en cada sitio que llamaba a academia1 ahora da problemas...
voy declarar todos los métodos y campos en academia como statics a br que pasa
bueno, la cosa mejoro bastante... ahora ocurre algo peculiar...comento:
en la clase academia, aparte de materia, también se agregaban profesores y grupos (que son otras clases) así que si lo ya expuesto funcionaba con materia, debería funcionar con las otras dos clases, ¿verdad? pues lo probé, y si funciona, pero cuando añado la clase grupo (esta crea un objeto materia y otro profesor) me añade de nuevo una materia y un profesor (o por lo menos da el mensaje de añadido)
¿me explico?
¿que puede estar pasando?
gracias
En el constructor de Materia tienes esto: Academia.ingresaMateria(Materia.this);
luego cada vez que se crea una instancia de Materia, se ejecuta el método que añade.
Creo que deberías asignarle un nombre a Materia, antes de ejecutar esa línea, y verificar en el método ingresaMateria si existe una instancia en la lista con ese nombre.
bueno, en un principio pense que eso no seria importante, esto es lo que hay en total en el constructor de materia
public Materia()
{
NombreMateria="";
Academia.Ingresa_Materia(Materia.this);
cuota=0;
piano2=false;
visuales2=false;
grupos=new ArrayList <Grupo>();
contador=0;
}
el nombre se le asigna antes de llamar a esa instruccion, siempre que se crea una instancia tendra un nombre ""....
en la clase main Lanzador, creo la materia y luego cambio sus valores:
Materia materia1=new Materia ();
materia1.setNombreMateria("violin");
materia1.setCuotaMateria(20);
materia1.setNecesitaPiano(false);
materia1.setNecesitaAudiovisuales(true);
con lo cual, en el metodo de añadir materia no podria filtrar el nombre"" porque sera su primer nombre....
entonces, lo que no se es por que cuando añado grupo, se añade una nueva materia, cierto es que en la clase grupo se crea una instancia a materia, pero esto no deberia afectar ¿no? lo que añado en el array de academia son referencias a estas instancias, verdad?
espero haberme explicado bien, gracias por las sugerencias
bueno, algo que estoy probando (en la clase materia me funciono, miro en las demás) es poner la instrucción Academia.Ingresa_Materia(Materia.this); dentro de un método
public void AgregaenMateria()
{
Academia.Ingresa_Materia(Materia.this);
}
con lo cual, no se agrega solo al iniciarla, luego en el main añado una llamada a este método después de agregar los datos....
¿me explico?
esto también me serviría...
de esta forma, tal que se cree la instancia al llamar a grupo no se agregaran "materias duplicadas"
"... cierto es que en la clase grupo se crea una instancia a materia, pero esto no deberia afectar ¿no?"
Sí afecta: siempre que se crea una nueva instancia de una clase, se ejecuta su constructor, luego...
Usar un método parece más flexible, puesto que añades la instancia cuando te conviene, y no en la construcción, que es siempre más "delicado" de manejar, como ya has comprobado.
bueno, gracias por toda tu ayuda, ya termine mi proyecto, y siguiendo tus consejos, esta funcionando bastante bien.
gracias
no lanza ninguna acepción, la lista es un arraylist y se que no funciona por que llamo al método para que presente en pantalla la lista de materias en academia y no sale ni una, modifique el método para que presentara el tamaño de la lista y era 0.
tengo una clase main, en la cual creo las instancias de la materia y de la academia...
la cosa es que podría ingresar esas materias desde la clase lanzador en la clase academia, pero no lo quiero hacer así.
dejo parte de los códigos para que veas lo que tengo....
Clase Materia:
public class Materia
{
private Academia academia;
......
public Materia()
{
academia=new Academia();
......
Academia.Ingresa_Materia(this);
}
Clase Academia:
import java.util.ArrayList;
public class Academia
{
protected static ArrayList<Materia> materias;
.....
public Academia ()
{
materias=new ArrayList <Materia>();
.....
}
public static void Ingresa_Materia(Materia materia)
{
boolean existe=false;
for (Materia mat:materias)
{
if (mat.equals(materia))
{
existe=true;
break; //nos salimos del bucle for
}
}
if (existe)// si existe, se avisa y no se hace nada
{
System.out.println("la materia ya existe en esta lista por lo que no se añade");
System.out.println("____________________________");
}
else// si no existe la añadimos
{
materias.add(materia);
System.out.println("Materia añadida a la academia");
System.out.println("____________________________");
}
}
public void ListarMaterias()// este es el metodo que llamo desde el main
{
.....
System.out.println("Materias:");
System.out.println("Cantidad de materias en la lista: "+materias.size());
for (int i = 0; i <= materias.size() - 1; i++)
{....}
}
Clase Main:
public class Lanzador
{
static public void main(String [] arg)
{
.....
Materia materia1=new Materia ();
Materia materia2=new Materia ();
Materia materia3=new Materia ();
Materia materia4=new Materia ();
Materia materia5=new Materia ();
Materia materia6=new Materia ();
Materia materia7=new Materia ();
Materia materia8=new Materia ();
Materia materia9=new Materia ();
Materia materia10=new Materia ();
......
Academia academia1=new Academia ();
......
/**
*@agregamos datos a los atributos restantes de cada materia
*/
.....
/**
*@agregamos datos a los atributos restantes de la academia
*/
.....
academia1.ListarMaterias();
......
}
eso creo que puede llegar a ser lo mas pertinente a este asunto....
gracias