Duda con clases

Iniciado por robertito_prado, 27 Julio 2013, 19:22 PM

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

robertito_prado

Hola!

Estoy haciendo un programa en Java y tengo dos clases en el mismo package. Mi duda es si con un objeto de la clase1, puedo llamar a un método de la clase2, porque lo necesito para acabar el programa. Yo probé pero me da fallo:

Clase1 nombre=new Clase1();
nombre.metodoClase2();

Un saludo y gracias de antemano.
Mira a tu alrrededor y llora, dime que cojones se valora

1mpuls0

Para que puedas acceder a un metodo de la ClaseB desde la ClaseA el método de ClaseB debe ser public.

Saludos.

abc

Alien-Z

#2
Ha habido una confusión por parte de Darhius:

Solo podrás acceder a un método de ClaseB mediante un objeto de tipo ClaseB o sus subclases. No hay ninguna forma de crear un objeto de un tipo y usar funciones de otro tipo.

Lo que Darhius quiere decir es que dentro de un método de ClaseA puedes crear un objeto de ClaseB y usar sus funciones desde dicho objeto.

En definitiva: No es posible hacer algo así porque viola los principios de la programación orientada a objetos.

Como alternativa puedes declarar la función como un método de clase utilizando "static":

Código (java) [Seleccionar]
public static void funcion() {
...
}


Esto te permitirá usar la función sin crear ningún objeto:

Código (java) [Seleccionar]
ClaseA.funcion(); //Fíjate que lo que hay antes del punto es el nombre de la clase, no un objeto

Un saludo.

~ Yoya ~

Cita de: Darhius en 28 Julio 2013, 05:13 AM
Para que puedas acceder a un metodo de la ClaseB desde la ClaseA el método de ClaseB debe ser public.

No necesariamente, si la clase se encuentra en el mismo paquete (como es el caso) puedes acceder a los metodos y variables miembros de la clase que no sean privados.

Si la clase1 es una subclase de la clase2, entonces puedes llamar los metodos de la clase2, siempre y cuando el tipo de referencia sea de la clase 2. Pero solo podras acceder a los metodos de la clase1 que sobre-escriban a los metodos de la clase2.

Código (java,1) [Seleccionar]
package ejemplo;


class Clase1 extends Clase2{
    public static void main(String[] args) {
        Clase2 clases = new Clase1();//Creo una variable del tipo Clase2
                                     //Luego un objeto de Clase1 y
                                     //lo asigno a la variable clases
       
        clases.saludo();//Salida: "Clase2.....
        //clase.hola() //Error, ya que solo puedo acceder a los metodos
                       //de la clase 2 a excepcion de los metodos que la Clase1
                       //sobre-escribe
       
       
    }
   
    void hola() {
        System.out.println("Hola mundo:P");
    }
}

class Clase2 {
   
    void saludo() {
        System.out.println("Clase2.....");
    }
   
}


Saludos.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

1mpuls0

#4
Cierto me confundí. Gracias.

Saludos.


abc

robertito_prado

Gracias! lo que hice fue extender una clase de la otra, así es su subclase...

Aunque lo unico que hice fue cambiar de error:  Exception in thread "main" java.lang.StackOverflowError

Saludos!
Mira a tu alrrededor y llora, dime que cojones se valora

Alien-Z

#6
Facilitaría mucho las cosas que pusieras al menos la parte de código que te genera el error, sino resulta imposible.

Lo más que te puedo decir es que la excepcion "java.lang.StackOverflowError" salta por desbordamiento: Intentas acceder al elemento de un array que no existe, reservas memoria infinita, etc.

Saludos.

robertito_prado

Hola!

Pues os voy a dejar el código a ver si me podeis ayudar... El error es de la pila, que se llena, debido a un bucle infinito (creo).
Lo que no se es porque tengo un bucle infinito:

package paquete;

   public class Carta extends Baraja{
      static String numero;
      static String palo;
   
    public Carta(String numero, String palo){
       this.numero=numero;
       this.palo=palo;
      
    }
    public static void main (String[] args){
      
       Carta miCarta = new Carta("Tres","Copas");
       Baraja miBaraja =new Baraja();
       System.out.print("La posicion de mi carta es: "+miCarta.posicionCarta(numero, palo));
    }
   
}


package paquete;

public class Baraja{
       Carta[] paquete;
      public Baraja(){  //Genera todas las cartas
          String caras[] = { "As", "Dos", "Tres", "Cuatro", "Cinco", "Seis",
                          "Siete", "Sota", "Caballo", "Rey"};
          String palos[] = { "Bastos", "Copas", "Oros", "Espadas" };
          paquete = new Carta[40];
          for ( int i = 0; i < paquete.length; i++ ){
                   paquete = new Carta(caras[i%10],palos[i/10]);     --------------> Aqui es donde falla,
                                                                                                                                                   bucle infinito
          }
         
       }
       int posicionCarta(String n, String p){
          int posicion=0;
          for(int i=0; i<40; i++){
             if((paquete.numero==n) && (paquete.palo==p)){
                posicion=i;
             }
          }
          return posicion;
       }   
}
Mira a tu alrrededor y llora, dime que cojones se valora

~ Yoya ~

java.lang.StackOverflowError se lanza normalmente cuando hay métodos recursivos que se llaman infinitamente. Por lo tanto el llega un punto en que el Stack se va llenando y explota.

En la memoria Stack se almacenan las variables locales y llamadas a métodos. Aquí un pequeño ejemplo de como funciona la memoria Stack.

Código (java,3) [Seleccionar]
public static void main(String[] args) {
int x = 5;
saludo();
}

void saludo() {

go()
}



En la linea 2 el stack se puede visualizar asi.

main (metodo) - x (variable local)

Luego linea 3:

saludo() (metodo)
main (Metodo) - x (variable local)

Y asi se va llenando la memoria Stack, cuando el metodo saludo() se complete, entonce el metodo saludo() se remueve del stack y vuelve al metodo main, pero si el metodo saludo llama a otro metodo, este se agrega al Stack, y cuando ese otro metodo termine, se remueve del stack y luego vuelve al metodo saludo, y cuando saludo termine, se remueve del stack y vuelve al metodo main hasta que el metodo main se completa.



Te explico el error lógico que cometes, y por eso sale la excepción.

Las clases:
Código (java) [Seleccionar]

class Carta extends Baraja {}
class Baraja {}


Tomando en cuenta que el loop for se encuentra en el constructor de la clase Baraja.

Tu metodo main:
Código (java,4) [Seleccionar]

    public static void main(String[] args) {

        Carta miCarta = new Carta("Tres", "Copas");
        Baraja miBaraja = new Baraja();
        System.out.print("La posicion de mi carta es: " + miCarta.posicionCarta(numero, palo));
    }


En la linea 4(marcada), se instancia la Clase Baraja y se ejecuta el constructor de Baraja.

Baraja constructor:

Código (java,7) [Seleccionar]

    public Baraja() {  //Genera todas las cartas
        String caras[] = {"As", "Dos", "Tres", "Cuatro", "Cinco", "Seis",
            "Siete", "Sota", "Caballo", "Rey"};
        String palos[] = {"Bastos", "Copas", "Oros", "Espadas"};
        paquete = new Carta[40];
        for (int i = 0; i < paquete.length; i++) {
            paquete[i] = new Carta(caras[i % 10], palos[i / 10]);

        }

    }


El error se encuentra en la linea 7(marcada), la linea 7 Crea una instancia de la Clase Carta y como la clase Carta extiende a la Clase Baraja (Clase padre), entonce java primero llama al Constructor de la clase padre (En este caso Baraja) y lo ejecuta:

Baraja constructor:

Código (java,7) [Seleccionar]

    public Baraja() {  //Genera todas las cartas
        String caras[] = {"As", "Dos", "Tres", "Cuatro", "Cinco", "Seis",
            "Siete", "Sota", "Caballo", "Rey"};
        String palos[] = {"Bastos", "Copas", "Oros", "Espadas"};
        paquete = new Carta[40];
        for (int i = 0; i < paquete.length; i++) {
            paquete[i] = new Carta(caras[i % 10], palos[i / 10]);

        }

    }


Y en la linea 7, de nuevo hace una una instancia de la clase Carta y como esta extiende a la clase Baraja, se llama primero al constructor de la clase Baraja y se ejecuta, y pasa lo mismo que ahora. Entonce como sigue pasando lo mismo y ningun constructor de la clase Baraja se llega a completar sino que se van aumentando, la memoria Stack se va llenando ya que nunca los constructores no se llegan a ejecutar por completo y por lo tanto nunca se llegan a remover de la memoria Stack. Y por eso el código lanza la excepción java.lang.StackOverflowError

Por esa razón, se recomienda solo instanciar variable en constructores y no hacer llamada a métodos.

El bucle for y eso, déjaselo a un método y recuerda no llamar a ningún método desde el constructor....

Saludos.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

robertito_prado

Muchas gracias por la explicación, ahora caigo! Este error viene dado por intentar solventar otro error.. jeje

Esto: "miCarta.posicionCarta(numero, palo)" no me funcionaba y por eso extendi la clase carta de la clase baraja, para que los objetos de Carta pudieran usar los métodos de Baraja...

Saludos!
Mira a tu alrrededor y llora, dime que cojones se valora