2016-03-01 9 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, который был назначен. Если я удалю static от public static void welcomeMenu(), он дает мне non-static method welcomeMenu() cannot be referenced from a static context, когда я пытаюсь позвонить welcomeMenu(); в основной.

Другой блок кода (не очень аккуратно, было частью приурочено экзамена):

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); 

    } 

} 

дает мне ту же статическую переменную ошибку как раньше, так как прокомментировал код выше. В этом сценарии, как мне удалось «работать», нужно было удалить static с public static void main(String args[]).

Действительно, чтобы научиться правильному пути Java, любая помощь будет оценена по достоинству. Также я надеюсь, что это встретит MCV.

ответ

1

Для доступа к нестационарным членам класса вам понадобится экземпляр этого класса.

So new Movie("a", "b", "c", "d").getGenre() является законным.

Удаление статического ключевого слова из main не является законным, так как оно является точкой входа вашей программы и, следовательно, оно обязательно существует.

EDIT: В первом источнике, метод 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() _ –