web-dev-qa-db-ja.com

非静的メソッドは、メソッドと変数を含む静的コンテキストから参照できません

Book、Tape、およびCDクラスを使用してオブジェクトを作成するBookStoreApplicationを記述します。アプリケーションクラスは未完成ですが、Book、Tape、CDである新しいBookStoreItemを作成する必要があります。それらはBookStoreItemsクラスから継承します。このアプリケーションクラスでは、エラーが発生し続けます。

error: non-static method printMenu() cannot be referenced from a static context
error: non-static method getUserChoice() cannot be referenced from a static context
error: non-static variable input cannot be referenced from a static context

静的に変更してから静的に変更しませんでしたが、引き続きこのエラーが発生します...

import Java.util.Scanner;

public class BookStoreApp2 {

    //constants for options
    static final int ADD_BOOK = 0;
    static final int ADD_TAPE = 1;
    static final int ADD_CD = 2;
    static final int QUIT = -1;

    Scanner input = new Scanner (System.in);

    public static void main(String[] args) {


        BookStoreItem[] item;//declaring array

        item = new BookStoreItem[10];//initializing array

        int itemType = -1;

        printMenu();
        getUserChoice();

        for (int i = 0; i < item.length; i++){
            System.out.print("\n" + i + "\tEnter 0 for Book, 1 for Tape, 2 for CD: ");
            itemType = input.nextInt();

            switch (itemType) {
                case 0:
                    item[i] = new Book();
                    break;
                case 1:
                    item[i] = new Tape();
                    break;
                case 2:
                    item[i] = new CD();
                    break;
                default: 
                    System.out.println("\nInvalid choice.");
            }//end of switch statement

        }//end of for loop

        for (int i = 0; i < item.length; i++) {
            System.out.println("\nAnimal #" + i + ": ");

            System.out.println("\n\tTitle: " + item[i].getTitle()); //polymorphic because they can operate on separate objects
            System.out.println("\n\tAuthor: " + item[i].getAuthor());
        }//end of for


    }//end of main method


//PRINT MENU----------------------------------------------------------  
    public void printMenu(){
        System.out.println("\nPress:");
        System.out.println("\t" + ADD_BOOK + "\tTo add a book to the book store.\n");
        System.out.println("\t" + ADD_TAPE + "\tTo add a tape to the book store.\n");
        System.out.println("\t" + ADD_CD + "\tTo add a CD to the book store.\n");
        System.out.println("\t" + QUIT + "\tTo exit\n");
    }
//---------------------------------------------------------------------
//GET USER CHOICE------------------------------------------------------ 
     public int getUserChoice() {
        int choice;     
        System.out.print("Please enter your choice: ");
        choice = input.nextInt();

        return choice;
    }//end of getUserChoice
//----------------------------------------------------------------------

}//end class
6
user1368970

printMenu()getUserChoice()staticの両方のメソッドを作成する必要があります。これは、_static main_メソッドからインスタンスを作成せずに直接呼び出すためです。クラス、それらのメソッドが定義されています。また、それらが定義されているクラスのインスタンスへの参照がないと、_non-static_メソッドを呼び出すことはできません。

または、メソッド呼び出し部分を次のように変更できます。

_BookStoreApp2 bookStoreApp = new BookStoreApp2();
bookStoreApp.printMenu();
bookStoreApp.getUserChoice();
_
17
Rohit Jain

単にプログラムを機能させるためだけに、main()メソッドの内容を取り、コンストラクターに入れます。

public BookStoreApp2()
{
   // Put contents of main method here
}

次に、main()メソッドで。これを行う:

public void main( String[] args )
{
  new BookStoreApp2();
}
5
mightyrick

あなたはどちらか

1)printMenu()getUserchoice()を宣言し、staticとして入力します

OR

2)より適切に設計したい場合は、ロジックをmainから別のインスタンスメソッドに移動します。次に、mainからクラスの新しいインスタンスを作成し、インスタンスメソッドを呼び出します。

2
Rohit

外部で入力オブジェクトを作成するのではなく、Scanner input = new Scanner (System.in);をmainメソッドに配置する必要があります。

1
jerryg311