没有修饰符的类默认不能访问声明为public的子类? Java

如何解决没有修饰符的类默认不能访问声明为public的子类? Java

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

此外,是的,我知道访问修饰符对它们可以访问类的范围的限制,但是对于默认类如何无法访问公共类的方法,这对我来说没有任何意义。我假设这可能是我在实现一个导致问题的父类?这是我在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

如果有兴趣,请链接到练习题以供参考: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);
        }
    }
}

解决方法

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

如果源文件中没有公共类,则main方法可以 放在任何类中,我们可以给源文件起任何名字。

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

由于@Andy Turner的话,我对其进行了进一步测试,实际上您可以在其他类(公共类除外)中使用main方法。这一切都取决于您如何称呼它:

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,因为这是公共类,但是您可以调用两个主要方法:

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

从解决方案中删除主要方法后,您仍然可以调用sample.Problem。

,

虽然这违反了“习俗”,但您可以尝试做。但是main()类中存在Solution方法,因此您必须运行该方法。

在命令行中,您可以轻松地做到这一点:

javac Checker.java
java Solution

Solution.class将会正确生成。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?