2016-03-01 108 views
0

首先,我想说我对Java很陌生,来自C++背景。我永远无法接触到我的老师,所以我想尝试在这里发表这个问题,我一直在想(我希望我能正确地说出它):Java静态方法+类

如何创建方法而不使用static?我知道我可能需要为它做一个课,但我该怎么做呢?只是一个没有变量和功能的类?除了以.java文件命名的类之外,我还要做第二类吗?例如:

package musiclibrary; 
import java.util.Scanner; 

/** 
* This class implements a user to create a playlist from a selection of artists and songs 
* @author ahb5190 
*/ 
public class MusicLibrary { 
static String divider = "*****************************************************"; 
//Scanner class 
static Scanner input = new Scanner(System.in); 

/** 
* Welcome menu 
*/ 
public static void welcomeMenu() 
{ 
    System.out.println(divider); 
    System.out.println(); 
    System.out.println("Welcome to Art's personal music library!"); 
    System.out.println(); 
    System.out.println("Choose an option:"); 
    System.out.println("1) Create Playlist"); 
    System.out.println("2) Delete Playlist"); 
    System.out.println("3) Add Selection to Playlist"); 
    System.out.println("4) Remove Selection from Playlist"); 
    System.out.println("5) Quit"); 
    System.out.println(); 
    System.out.print("Your choice?: "); 
} 

/** 
* 
* @param min error check low bound 
* @param max error check high bound 
* @return 
*/ 
public static int getData(int min, int max) 
{ 
    boolean goodInput = false; 
    int choice = 1; //Will be overwritten 
    while(!goodInput) 
    {  
     choice = input.nextInt(); 
     if(choice < min || choice > max) 
     { 
      System.out.print(choice + " is not a valid choice. Please enter a number between " + min + " and " + max + ": "); 
      goodInput = false; 
     } 
     else 
     { 
      goodInput = true; 
     } 
    } 

    return choice; 
} 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) 
{ 
    //Variables 
    int getDataMin = 1; 
    int getDataMax = 5; 
    boolean quit = false; 
    int userInput; 

    do { 
     welcomeMenu(); 
     userInput = getData(getDataMin, getDataMax); 
     if (userInput == 1) 
     { 
      quit = false; 
     } 
     else if (userInput == 2) 
     { 
      quit = false; 
     } 
     else if (userInput == 3) 
     { 
      quit = false; 
     } 
     else if (userInput == 4) 
     { 
      quit = false; 
     } 
     else if (userInput == 5) 
     { 
      quit = true; 
     } 
    } while(!quit); 

} 

}

是被分配了java程序的开始。如果我从public static void welcomeMenu()删除static,那么当我尝试呼叫welcomeMenu();时,它会给我non-static method welcomeMenu() cannot be referenced from a static context

的代码的另一种块(未很整齐,是一个定时考试的一部分):

package lalala; 

/** 
* 
* @author ahb5190 
*/ 
public class Lalala { 


    public class Movie 
    { 
     private String title; 
     private String genre; 
     private String director; 
     private String star; 

     public Movie (String t, String g, String d, String s) 
     { 
      title = t; 
      genre = g; 
      director = d; 
      star = s; 
     } 
     public String gettitle() 
     { 
      return title; 
     } 
     public String getGenre() 
     { 
      return genre; 
     } 
     public String getDirector() 
     { 
      return director; 
     } 
     public String getStar() 
     { 
      return star; 
     } 
     public void setTitle(String x) 
     { 
      title = x; 
     } 
     public void setGenre(String x) 
     { 
      genre = x; 
     } 
     public void setDirector(String x) 
     { 
      director = x; 
     } 
     public void setsStar(String x) 
     { 
      star = x; 
     } 
     public boolean equals(Movie otherMovie) 
     { 
      if(otherMovie == null) 
      { 
       return false; 
      } 
      else 
      { 
       return title.equals(otherMovie.title) && genre.equals(otherMovie.genre) && director.equals(otherMovie.director) && star.equals(otherMovie.star); 
      } 
     } 
     @Override 
     public String toString() 
     { 
      return(title + " " + genre + " " + director + " " + star); 
     } 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]) 
    { 
     Movie a; 
     a = new Movie("Star Trek into Darkness", "Sci-fi", "J.J. Abrams", "Chris Pine"); //error: non-static variables this cannot be referenced from a static context 
     Movie b = new Movie("Star Trek", "Sci-Fi", "J.J. Abrams", "Chris Pine"); //error: non-static variables this cannot be referenced from a static context 
     Movie c = new Movie("Independence Day", "Action", "Roland Emmerich", "Will Smith"); //error: non-static variables this cannot be referenced from a static context 

     System.out.println("Movies"); 

     System.out.println("Title: " + a.title); 
     System.out.println("Genre: " + a.genre); 
     System.out.println("Director: " + a.director); 
     System.out.println("Star: " + a.star); 
     System.out.println(); 
     System.out.println("Title: " + b.title); 
     System.out.println("Genre: " + b.genre); 
     System.out.println("Director: " + b.director); 
     System.out.println("Star: " + b.star); 
     System.out.println(); 
     System.out.println("Title: " + c.title); 
     System.out.println("Genre: " + c.genre); 
     System.out.println("Director: " + c.director); 
     System.out.println("Star: " + c.star); 
     System.out.println(); 

     a.equals(b); 

    } 

} 

给我相同的静态变量误差之前,在代码注释的上方。在那种情况下,我如何才能“工作”是从public static void main(String args[])中删除static

真的想学习正确的方式到Java,任何帮助将不胜感激。我也希望这符合MCV。

回答

1

要访问类的非静态成员,您需要该类的一个实例。因此new Movie("a", "b", "c", "d").getGenre()是合法的。

从main删除static关键字是不合法的,因为它是程序的入口点,因此它是强制存在的。

编辑: 在第一个来源,main()方法不会产生MusicLibrary的任何实例,这就是为什么你需要在所有成员都使用静态的。

添加MusicLibrary lib = new MusicLibrary();然后调用lib.welcomeMenu();您可以摆脱静态关键字。

+0

当我把静态回来时,仍然给了我同样的错误。我只是将静态写出来用于笔试,以便我可以测试其余代码中的任何语法错误,我知道静态必须在那里:) – bankey

+0

我已经编辑答案是更具体的你的情况。 – Xvolks

+0

啊!非常感谢!我知道这是小事:)我真的很感激它! – bankey

0

的所有非静态方法首先只能通过类的实例来调用,

link也许会有帮助,了解它bit.And这种类型的问题是已经在这里找到答案:this

+0

对于问题的另一部分,将类_Movie_放置在类_lalala_之外,由于其与_static void main()_ –