没有修饰符(默认)的 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
.
我只是在 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
.