没有修饰符(默认)的 class 无法访问声明为 public 的子 class? Java

A class with no modifier (default) cannot access a subclass declared as public? Java

我只是在 Hackerrank 上练习,因为我对 Java 还是很陌生(我只对 C 和 C++ 有经验,很少 Python/Matlab/C#)。基本上我们只需从头开始编写下面的“Checker class”。但是,我注意到当我将 public 添加到 Checker class 时,它会导致运行时错误。有谁知道为什么?我在网上找不到任何答案。

此外,是的,我知道访问修饰符限制了它们可以访问 classes 范围的程度,但是默认 class 不能访问的范围对我来说没有意义访问 public class 的方法。我假设可能是我正在实施导致问题的 parent class ?这是我在 Hackerrank 上收到的 RE 消息:

Error: Main method not found in class Checker, please define the main method as:
   public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application

如有兴趣,link给练习题参考:https://www.hackerrank.com/challenges/java-comparator/problem

import java.util.*;

// Write your Checker class here
class Checker implements Comparator<Player>{  //If I add "public" in front I get RE
    @Override
    public int compare(Player A, Player B){
        if(A.score == B.score)
            return A.name.compareTo(B.name);
        else
            return B.score - A.score;
        // return A.compareTo(B);
    }
    
}

class Player{
    String name;
    int score;
    
    Player(String name, int score){
        this.name = name;
        this.score = score;
    }
}

class Solution {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();

        Player[] player = new Player[n];
        Checker checker = new Checker();
        
        for(int i = 0; i < n; i++){
            player[i] = new Player(scan.next(), scan.nextInt());
        }
        scan.close();

        Arrays.sort(player, checker);
        for(int i = 0; i < player.length; i++){
            System.out.printf("%s %s\n", player[i].name, player[i].score);
        }
    }
}

有趣的问题,但我在整个职业生涯中从未使用过它。

If there is no public class in the source file then main method can lie in any class and we can give any name to the source file.

来源:https://dzone.com/articles/why-single-java-source-file-can-not-have-more-than

由于@Andy Turner 的评论,我对其进行了进一步测试,确实您可以在其他 classes 中使用 main 方法(public 除外)。这完全取决于您如何称呼它:

package sample;

class Problem  {
    public static void main(String[] args) {
        System.out.println("main of Problem");
    }

}

public class Solution {
    public static void main(String[] args) {
        System.out.println("main of Solution");
    }
}

源文件名必须是 Solution.java 因为这是 public class 但你可以调用两个主要方法:

  > java sample.Solution  
  main of Solution
 
  > java sample.Problem
  main of Problem

从 Solution 中删除 main 方法后,您仍然可以调用 sample.Problem。

虽然这违反“习俗”,但您可以按照您的尝试进行操作。但是,main() 方法存在于 Solution class 中,因此您必须 运行.

从命令行你可以很容易地做到这一点:

javac Checker.java
java Solution

as Solution.class 将正确生成。

但是,如果您使用您不太熟悉的 IDE,您可能会在尝试告诉他们 运行 与 .class 不同的 .class 文件时遇到困难=15=] 他们刚刚编译。简而言之:将文件命名为 Solution.java.