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)
- Inicie sesión o regístrese para enviar comentarios
Que tal Junior. Lo puedes
Que tal Junior.
Lo puedes poner directamente debajo de "mostrarMensaje"
Sería así:
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".
Espero que te sea de ayuda.
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
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
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.
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
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:
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:
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
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();
}
}