【问题标题】:Why does we need access modifier "static" for some methods like the following one?为什么我们需要像下面这样的一些方法访问修饰符“静态”?
【发布时间】:2020-04-09 00:44:14
【问题描述】:

这是我从 Herbert Schildt 第 239、240 页的“Java:完整参考”一书中获得的 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)”的错误。

提前致谢。

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

【问题讨论】:

    标签: java class oop


    【解决方案1】:

    可以,但如果没有static,则需要AskMe 的实例才能在main 中调用answer。喜欢,

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

    【讨论】:

    • 谢谢@Elliott,但你能告诉我在这种情况下使用static 还是使用AskMe 的实例更好?为什么?
    • @HoangNguyen 他们大致相当。考虑一下,您可以将Question 传递给AskMe 构造函数,然后让answer 直接调用ask。但这是一个微不足道的例子;真正的代码很少如此清晰。
    • @HoangNguyen 现实世界的主要问题是静态变量(关于静态方法有很多观点);常量 (static final) 可以,但要避免使用静态变量,因为它们会在程序的不同部分之间创建隐藏链接。
    • @HoangNguyen 不客气。我注意到你还没有接受免费(即免费)tour,你应该这样做。
    • 让我看看,我是新人!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 2012-05-05
    • 1970-01-01
    • 2019-10-28
    • 2011-04-12
    相关资源
    最近更新 更多