java - 为什么像下面这样的一些方法需要访问修饰符 "static"?

标签 java class oop

这是我从 Herbert Schildt 所著的《Java:完整引用》一书中第 239、240 页获取的 PDF 代码。我研究过“静态”,但在这种情况下,我想知道为什么必须使用静态。

import java.util.Random;

interface SharedConstants {
    int NO = 0;
    int YES = 1;
    int LATER = 3;
    int SOON = 4;
    int NEVER = 5;
}

class Question implements SharedConstants {
    Random rand = new Random();

    int ask() {
        int prob = (int) (100 * rand.nextDouble());
        if(prob < 30) return NO;
        else if(prob < 60) return YES;
        else if(prob < 75) return LATER;
        else if(prob < 98) return SOON;
        else return NEVER;
    }
}

public class AskMe implements SharedConstants {
    static void answer(int result) {
        switch(result) {
            case NO:
                System.out.println("No");
                break;
            case YES:
                System.out.println("Yes");
                break;
            case LATER:
                System.out.println("Later");
                break;
            case SOON:
                System.out.println("Soon");
                break;
            case NEVER:
                System.out.println("Never");
                break;
        }
    }

    public static void main(String[] args) {
        Question q = new Question();
        answer(q.ask());
        answer(q.ask());
        answer(q.ask());
        answer(q.ask());
    }
}

我想知道在 AskMe 类中创建 answer 方法的行。为什么我们需要“静态”访问控制?如果不是,编译器将给出类似“错误:无法从静态上下文引用非静态方法answer(int)”的错误。

提前致谢。

(第一次提问,如有错误请告诉我)

最佳答案

可以,但没有static您需要一个 AskMe 的实例调用answermain 。就像,

void answer(int result) {
    switch(result) {
        case NO:
            System.out.println("No");
            break;
        case YES:
            System.out.println("Yes");
            break;
        case LATER:
            System.out.println("Later");
            break;
        case SOON:
            System.out.println("Soon");
            break;
        case NEVER:
            System.out.println("Never");
            break;
    }
}

public static void main(String[] args) {
    Question q = new Question();
    AskMe askMe = new AskMe();
    askMe.answer(q.ask());
    askMe.answer(q.ask());
    askMe.answer(q.ask());
    askMe.answer(q.ask());
}

关于java - 为什么像下面这样的一些方法需要访问修饰符 "static"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61112238/

相关文章:

java - 我的目标是创建一个使用 getter 和 setter 方法来加或减 2 个数字的应用程序,但我遇到了困难

android - 如何使用 Kotlin 修复 Null 不能成为 Android 迷宫游戏中非空类型的值

c++ - 如何归还或护理项目 list 基于几个类别

java - 在绘图应用程序中分离模型和 View / Controller

java - Linux 命令提示符读取日期并将其传递给 java -D 选项

java - 使用ASM访问第n条指令

java - 最常用的 Java 类的频率列表是否可用?

php - OOP PHP 用户类 (usercake) 不添加到数据库

java - 接口(interface)函数: Utility to span hierarchies?

java - 如何在 spring-mvc 中向 webflux 端点添加日志记录?