在这种情况下,静态函数和实例如何协同工作?

时间:2015-02-03 11:15:14

标签: java oop static

我正在努力学习java,我试图理解从一个类到另一个类的调用函数是如何工作的。我有两个课程,我将在下面发布。当我在ToDo类中调用H2db.addItems()时,以及在H2db类中调用ToDo.menu()时,我看到“无法从静态上下文引用非静态方法”。谷歌搜索显示它与一个实例(?)有关,但我不确定这意味着什么。

Class ToDo:

package com.company;


import java.io.*;
import java.lang.reflect.Method;
import java.sql.*;
import java.util.ArrayList;
import java.util.Scanner;

public class ToDo {
    //BufferedReader inputread = new BufferedReader(new InputStreamReader(System.in));
    Scanner inputread = new Scanner(System.in);
    ArrayList<String> toDoList = new ArrayList<String>();


    public void menu() {
        clearConsole();
        System.out.println("Welcome to the To-Do program.");
        System.out.println();
        System.out.println();
        System.out.println("Please select an option from the following menu, using the number.:");
        System.out.println("1- View To-Do List");
        System.out.println("2- Add Item To List");
        System.out.println("3- Remove Item From List");
        System.out.println("4- Save List");
        System.out.println("5- Load List");

        int userinput = inputread.nextInt();

        switch (userinput) {
            case 1:
                clearConsole();
                displayList(true);
                menu();
                break;
            case 2:
                clearConsole();
                H2db.addItems();
                break;
            case 3:
                clearConsole();
                deleteItem();
                break;
            case 4:
                clearConsole();
                try {
                    saveList();
                }
                catch(IOException e){
                    return;
                };

            case 5:
                clearConsole();
                try {
                    loadList();
                }
                catch(IOException e){
                    return;
                };

        }
    }

    public void clearConsole() {
        for (int i = 0; i < 25; i++) {
            System.out.println();
        }
    }


    public void addItem() {
        System.out.println("Please type the item to add to the To-Do List");
        //The skip gets over the leftover newline character
        inputread.skip("\n");
        String newItem = inputread.nextLine();
        toDoList.add(newItem);
        System.out.println("Your item has been added! Type any key and press Enter to continue");
        String discardMe = inputread.next();
        menu();
    }

    public void displayList(boolean finish) {

        if (toDoList.isEmpty()) {
            System.out.println("Add an activity.");

        } else {
            for (String listItem: toDoList) {
                System.out.println(listItem);
            }
        }
        if (finish) {
        System.out.println();
        System.out.println("This is your list. Type any key and press Enter to continue");
        String discardMe = inputread.next();
        }

    }

    public void deleteItem() {
        if (toDoList.isEmpty()) {
            System.out.println("For fuck's sake, add an activity.");
        } else {
            System.out.println("Please choose the number of the line you want to delete:");
            displayList(false);
            int userinput = inputread.nextInt();
            int listPos = userinput - 1;
            toDoList.remove(listPos);
            System.out.println("That item has been deleted. Type any key and press Enter to continue.");
            String discardMe = inputread.next();
        }
        menu();
    }

    public void saveList() throws IOException {
        System.out.println("Saving list...");
        PrintWriter writer = new PrintWriter("list.txt", "UTF-8");
        for (String listItem : toDoList) {
            writer.println(listItem);
        }
        writer.close();
        System.out.println("List saved! Type any key and press Enter to continue");
        String discardMe = inputread.next();
        menu();

    }

    public void loadList() throws IOException {
        System.out.println("Loading list...");

        File loadFile = new File("list.txt");
        Scanner scanner = new Scanner(loadFile);
        while (scanner.hasNext()) {
            String item = scanner.nextLine();
            toDoList.add(item);
        }
        System.out.println("List loaded! Type any key and press Enter to continue");
        String discardMe = inputread.next();
        menu();
        scanner.close();
    }
}

Class H2db:

package com.company;

import java.sql.*;
import java.util.ArrayList;
import java.util.Scanner;


public class H2db {
    Scanner inputread = new Scanner(System.in);
    ArrayList<String> toDoList = new ArrayList<String>();

    public void connect(){

        try {
            Class.forName("org.h2.Driver");
            Connection conn = DriverManager.getConnection("jdbc:h2:~/toDo", "user", "");
            Statement stat = conn.createStatement();

            stat.execute("CREATE TABLE IF NOT EXIST 'todo'(id int NOT NULL AUTO_INCREMENT primary key, item varchar(255))");
        }
        catch( Exception e) {
            System.out.println(e.getMessage());
        }

    }

    public void addItems() {
        PreparedStatement addstat;

        try {
            Class.forName("org.h2.Driver");
            Connection conn = DriverManager.getConnection("jdbc:h2:~/toDo", "user", "");

            System.out.println("Please type the item to add to the To-Do List");
            inputread.skip("\n");
            String newItem = inputread.nextLine();
            addstat = conn.prepareStatement("INSERT INTO toDo (item)" +"VALUES (?)");
            addstat.setString(1, newItem);
            addstat.executeUpdate();

            System.out.println("Your item has been added! Type any key and press Enter to continue");
            String discardMe = inputread.next();
            ToDo.menu();
        }
        catch( Exception e) {
            System.out.println(e.getMessage());
        }

    }
}

任何帮助都会很棒,谢谢。我知道这只是知识上的差距,但我无法理解这个概念的所有内容。

3 个答案:

答案 0 :(得分:1)

我认为你缺少面向对象编程的基础。 首先问你自己:ToDo类代表哪个对象?看看你的代码,它是一个GUIManager。

GUIManager正常工作需要另一个能够在名为H2DBManager的数据库(目前为H2db类)中存储数据的对象。 这意味着GUIManager必须在其构造函数中实例化H2DBManager即h2DBManager,并在需要时使用其常规方法(非静态方法)。当类H2DBManager完成一个任务(即已完成在方法addItems中存储某些东西)时,控制流会自动返回到类GUIManager,因此您永远不需要从类H2DBManager中明确地调用GUIManager操作(静态或非静态)。

答案 1 :(得分:0)

看起来您只需要H2db的一个实例。在这种情况下,您可以考虑使用 singleton 模式,但现在只需在适当的位置添加关键字static,您就可以快速完成所有操作:< / p>

    static Scanner inputread = new Scanner(System.in);
    static ArrayList<String> toDoList = new ArrayList<String>();

    public static void connect(){

    public static void addItems() {

答案 2 :(得分:0)

答案很简单。如果要按类名调用H2db.addItems(),则必须将H2db类中的addItems()方法声明为static。或

您可以创建H2db类的实例(对象)。

 H2db myObject = new H2db();
 myObject.addItems();

声明方法或属性静态时。然后它变成类变量/方法。并且可以被称为H2db.addItems()。

如果您没有声明方法/属性静态。然后它变成实例变量/方法。并且可以像上面的代码示例中提到的那样调用。这是通过实例(对象)名称。