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

标签 java oop static

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

类待办事项:

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

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

    }
}

任何帮助都会很棒,谢谢。我知道这只是知识上的差距,但我似乎无法理解这个概念叫什么。

最佳答案

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

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

关于java - 在这种情况下,静态函数和实例如何协同工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28297550/

相关文章:

java - java中非静态方法如何访问静态成员?

Java 反射 : Code runs fine in Debugger but not in "normal" running mode

java - SOAP getBody 方法与 writeTo

JavaScript 面向对象 : Implementation of Logging

java - 在状态设计模式中使用组合和实现

oop - 何时使用方法和对象

typescript - TypeScript-为什么在编译时不知道设置为已定义对象的静态属性要定义?

java - 如何使用 jQuery 将 JSON 数据发布到 Struts2 Action 类

java - 无法实例化服务 > java.lang.NullPointerException

java - 使用浏览器访问文件系统文件