Software Guru Conference & Expo 2014

problema con la clase main

hola a todos , soy nuevo en la programacion en java , usando el como programar en java 7 me tope con lo siguiente:

public class Main {

/**
* @param args the command line arguments
*/
public class Libro
{
public void mostrarMensaje()
{
System.out.println("Bienvenido al Libro de Calificaciones !");
}
}
// public static void main(String[] args) {
}
}

si ejecuto me sale un error por que no encuentra el metodo MAIN;

como soluciono este problema, como declaro una clase separada que contenga un metodo MAIN,; o coloco un metodo main en la clase LIBRO (en que parte del cuerpo de la clase)

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de OscarRyz

Que tal Junior. Lo puedes

Que tal Junior.

Lo puedes poner directamente debajo de "mostrarMensaje"

Sería así:

public class Libro { 
    public void mostrarMensaje()  { 
         System.out.println("Bienvenido al Libro de Caificaciones");
    }
    // Aqui
    public static void main( String [] args ) { 
    }
}

Aunque, no va a hacer nada, por que el método main, no tiene ninguna instruccion, para que hiciera algo tendrías que crear una "instancia" de la clase libro e invocar el método "mostrarMensaje".

...
   public static void main( String [] args ) { 
       Libro unLibro = new Libro();
       unLibro.mostrarMensaje();
    }
...

Espero que te sea de ayuda.

Imagen de fcodiaz

Comentario

El error que te marca al correr es por que tienes un comentario que no debería serlo; un comentario es cualquier texto que el programador puede colocar dentro del código para explicar y documentar el código, estos comentarios no son interpretados por el compilador, para definir un comentario se usa las siguientes formas


// comentarios de una sola linea

/*
Comentario 
Comentario
Comentario
Comentarios de mas de una linea
*/

/**
* Comentario para javaDoc
**/

el problema en tu código es que tienes como comentario la linea donde defines el main, ademas que el programa no haría nada por que no hay nada de código en el main, solo compilaría correctamente y no haría nada mas

public class Main {
   /**
   * @param args the command line arguments
   */
   public class Libro{
       public void mostrarMensaje(){
          System.out.println("Bienvenido al Libro de Calificaciones !");
       }
   }
  // public static void main(String[] args) {
  }
}

llamando al metodo mostrar mensaje

gracias por la respuesta, otra duda

Respecto al codigo anterior , al crear una instancia de la clase libro , me aparece lo siguiente:

Libro unLibro = new Libro(); // esto me sale subrayado en rojo;
non-static variable this cannot be referenced from a static context

Al querer llamar al metodo mostrarMensaje() desde OTRO PROYECTO , no puedo hacerlo,
aunque cree una instancia de la clase libro asi:

package pruebalibro
// EL OBJETIVO DEL PROGRAMA ES USAR AL METODO mostrarMensaje de la clase Libro,, llamandolo a este nuevo proyecto por medio de una instancia de esa clase:

public class Main {
public class pruebalibro
{

}

public static void main(String[] args) {
Libro miLibro = new Libro(); aqui me sale error ///// quiero hacer referencia a la clase Libro para poder usar el metodo mostrarMensaje;
Libro.mostrarMensaje();

Como lo puedo solucionar , de antemano muchas gracias.

hacer referencia a un metodo desde otra clase

gracias por la respuesta, otra duda

Respecto al codigo anterior , al crear una instancia de la clase libro , me aparece lo siguiente:

Libro unLibro = new Libro(); // esto me sale subrayado en rojo;
non-static variable this cannot be referenced from a static context

Al querer llamar al metodo mostrarMensaje() desde OTRO PROYECTO , no puedo hacerlo,
aunque cree una instancia de la clase libro asi:

package pruebalibro
// EL OBJETIVO DEL PROGRAMA ES USAR AL METODO mostrarMensaje de la clase Libro,, llamandolo a este nuevo proyecto por medio de una instancia de esa clase:

public class Main {
public class pruebalibro
{

}

public static void main(String[] args) {
Libro miLibro = new Libro(); aqui me sale error ///// quiero hacer referencia a la clase Libro para poder usar el metodo mostrarMensaje;
Libro.mostrarMensaje();

Como lo puedo solucionar , de antemano muchas gracias.

Imagen de bferro

Clases inner, internas o interiores

Debes entender la diferencia entre métodos de instancia (instance methods) y métodos de clases (class methods). Java hace uso de la palabra static para denotar que un método es de clase, lo que quiere decir que no es una funcionalidad de los objetos que son instancias de la clase.

En términos más cercanos a lo que internamente sucede, se dice que un método estático no recibe como argumento el apuntador this (de forma implícita aunque no aparezca declarado en la lista de argumentos). Si ese es el caso, no puedes hacer referencia a "cosa" alguna de instancia de la clase que contiene ese método estático. Por supuesto que podrías crear dentro de tu función estática un objeto de tu clase Main, y aplicar sobre ese objeto cualquiera de sus métodos, tener acceso a cualquiera de sus atributos, etc.

Una vez que entiendes bien ese concepto, pasas a estudiar entonces lo referente a las clases interiores o clases internas o en el término original en inglés, inner classes.

Java y algunos otros lenguajes, dan la posibilidad de que una clase, incluya como componente de ella, la definición de otra clase. Lo que se quiere resolver con eso son varias cosas. Una de esas cosas es lograr mayor colaboración entre esas clases.

Cuando una clase de define dentro de otra, hay dos opciones, dependiendo de lo que se quiera lograr.

La primera opción es la que tienes en tu código, cuando defines la clase pruebaLibro. Ese es el caso de una clase interior o inner que establece que sus instancias pueden existir "exclusivamente" en el contexto de un objeto de la clase outer.

Aunque eso suene un poco extraño, es fácil de entender, porque es el mismo concepto que se aplica para los atributos y métodos de instancia. Si, por ejemplo defines una clase Circulo con atributos x, y, radio, donde las coordenadas x, y representan el centro de cada círculo y radio es el radio, ninguno de estos valores existen por si solo; ellos existen como propiedades de los círculos que creas.

Igual sucede con las clases interiores; sus objetos existen en el contexto de los objetos de la clase outer.

La otra opción de clase interior, que yo prefiero llamarle clase anidada (aunque en el caso antes descrito, la clase interior también está anidada en la clase exterior) es cuando defines la clase prefijándola con la palabra static. En los libros, tutoriales y otros escritos vas a encontrar diferentes nombres: static inner class, static nested class, etc.

En esta segunda opción, el comportamiento es "similar" a los casos de atributos estáticos y métodos estáticos. Los objetos de la clase anidada estática son "independientes" de los objetos de la clase exterior, lo que quiere decir por ejemplo que podrías crear un objeto de esa clase en cualquier contexto estático (un método estático, una inicialización estática o un bloque estático).

Tú código puede arreglarse de varias formas, pero lo importante es que desde un principio pienses en lo que quieres resolver. Debes hacerte preguntas cómo las siguientes:

¿Para que definir la clase Libro dentro de la clase Main?
¿Necesito realmente una clase interior, sea ésta de instancia o static?
¿Necesito que la clase Libro esté en el mismo paquete de la clase Main?
¿Conviene definir la clase Main y la clase Libro en el mismo archivo fuente, aunque sin anidar una dentro de otra?

Y otras muchas cosas, que te van a ayudar a poco a poco hacer las cosas bien desde un principio.

Veamos tu código

package borrame;

public class Main {

  public  class Libro {
    public void mostrarMensaje(){
          System.out.println("Bienvenido al Libro de Calificaciones !");
       }
  }

  public static void main(String[] args) {
    Libro miLibro = new Libro();

    miLibro.mostrarMensaje();
  }
}

La sentencia

Libro miLibro = new Libro() 

provoca un error de compilación. Estás creando un objeto de una clase inner, en un contexto estático, lo que no es posible por lo explicado con anterioridad. Recuerda que los objetos de clase Libro en este ejemplo pueden ser creados en el contexto de un objeto de clase Main.

Modifiquemos el ejemplo de la siguiente manera:

package borrame;

public class Main {

  public  class Libro {
    public void mostrarMensaje(){
          System.out.println("Bienvenido al Libro de Calificaciones !");
       }
  }

  public static void main(String[] args) {
    Libro miLibro = new Main().new Libro();

    miLibro.mostrarMensaje();
  }
}

Como puedes observar, he cambiado la línea

Libro miLibro = new Libro()

por la línea

Libro miLibro = new Main().new Libro(); 

y ya no hay error, pues has creado un objeto de clase Libro en el contexto de un objeto de la clase Main exterior.

Hacemos ahora el ejemplo con la clase Libro anidada y estática, regresando al caso original con

Libro miLibro = new Libro()

Observa que no hay error en el siguiente código:

package borrame;

public class Main {

  public  static class Libro {
    public void mostrarMensaje(){
          System.out.println("Bienvenido al Libro de Calificaciones !");
       }
  }

  public static void main(String[] args) {
    Libro miLibro = new Libro();

    miLibro.mostrarMensaje();
  }
}

Ya lo tienes solucionado de esta forma pero deberías preguntarte si realmente lo requieres usando clases anidadas, inner o interiores como quieras llamarle. Lo siguiente también funciona, definiendo las dos clases dentro del mismo archivo fuente Main.java

package borrame;

public class Main {

  public static void main(String[] args) {
    Libro miLibro = new Libro();
    miLibro.mostrarMensaje();
  }
}

class Libro {

  public void mostrarMensaje() {
    System.out.println("Bienvenido al Libro de Calificaciones !");
  }
}

Sólo que ahora la clase Libro es "vista" solamente por las clases que están en el paquete borrame. Si deseas que la clase Libro sea "vista" fuera del paquete, tendrías que escribirla en un archivo Libro.java y declararla public.

Espero te sirva de algo.

hacer referencia a un metodo desde otro proyecto

package borrame;
me parece que no explique bien lo que queria, era lo siguiente:

yo tengo dos proyectos:

el primero se llama Libro ( crea un metodo llamaddo mostrarMensaje)

y el SEGUNDO llamado PruebaLibro (dentro de este proyecto quiero hacer referencia al metodo mostrarMensaje del anterior proyecto usando el siguiente codigo:

ppackage pruebalibro;

public class Main {
public class pruebalibro
{

public static void main(String[] args) { ----- AQUI ME SALE ERROR PORQUE LA CLASE INNER NO PUEDE TENER DECLARACIONES STATIC
Libro miLibro = new Main().new Libro();
Libro.mostrarMensaje();

}

}

¿alguien me puede ayudar?
GRACIAS.

classes internas

//Espero que te ayude :) saludos.

public class Main3{
//Regular inner class
public class PruebaLibro{
public void mostrarLibro(){
Libro miLibro=new Libro();
miLibro.mostrarMensaje();
}
}
//Regular inner class
public class Libro{
public void mostrarMensaje(){
System.out.println("Bienvenido al libro de calificaciones!");
}
}

public static void main(String... args){
Main3.PruebaLibro m=new Main3().new PruebaLibro();
m.mostrarLibro();
}
}