首页 > 解决方案 > 如何修复不可访问的方法

问题描述

当我创建类的对象时Championship,它显示没有可访问的方法。

public class Championship 
            {
                private ListOfDrivers driversList;
                private ListOfVenues venuesList;
                private RNG rand;

                public static void main(String[] args) {
                    Championship sim = new Championship();
                    sim.startgame();
                }


                private void startgame() 
                {
                    this.driversList = new ListOfDrivers();
                    this.venuesList = new ListOfVenues();
                    this.rand = new RNG();
                    System.out.println("List of venues:");
                    venuesList.printVenues();

                    System.out.println("And  starts....");
                    for(Venue venue : venuesList.getVenues()) {
                        System.out.println("------------------------------------------------------------");
                        System.out.println("Welcome one and all to " + venue.getVenueName() + "!");

                        // Give race penalties at the start of the race
                        for(Driver driver: driversList.getDrivers()) {
                            switch(driver.getRanking()) {
                                case 1: driver.setTime(0); break;
                                case 2: driver.setTime(3); break;
                                case 3: driver.setTime(5); break;
                                case 4: driver.setTime(7); break;
                                default: driver.setTime(10);
                            }
                        }
                        System.out.println("Drivers list!");
                        driversList.printDrivers();

                        System.out.println("Race starts!!");
                        for(int lap = 1; lap<=venue.getNoOfLaps(); lap++) {
                            System.out.println("In Lap " + lap + " now..");
                            for(Driver driver: driversList.getDrivers()) {
                                if(driver.getEligibleToRace())
                                {
                                    int faultRand = rand.faultRNG();
                                    if(faultRand == 1) 
                                    {
                                        System.out.println(driver.getName() + " just had an unrecoverable mechanical fault!!");
                                        System.out.println(driver.getName() + " is out of the race..");
                                        driver.setEligibleToRace(false);
                                        driver.setTime(99999);
                                        continue;
                                    } 
                                    else if(faultRand <=3) 
                                    {
                                        System.out.println(driver.getName() + " just had a major mechanical fault!!");
                                        driver.increaseTime(120);
                                    }
                                    else if(faultRand <=5)
                                    {
                                        System.out.println(driver.getName() + " just had a minor mechanical fault!!");
                                        driver.increaseTime(20);
                                    }

                                    driver.increaseTime(venue.getAverageLapTime());

                                    if(driver.getSkill().equals("Overtaking")) 
                                    {
                                        if(lap%3 == 1) {
                                            int reduc = rand.timeReductionRNG(10, 20);
                                            driver.decreaseTime(reduc);
                                            System.out.println(driver.getName() + " reduced time of " + reduc + " seconds");
                                        }
                                    } else
                                    {
                                        int reduc = rand.timeReductionRNG(1, 8);
                                        driver.decreaseTime(reduc);
                                        System.out.println(driver.getName() + " reduced time of " + reduc + " seconds");
                                    }
                                }
                            }
                            Driver currentRaceLeader = driversList.lowestTime();
                            System.out.println("Lap " + lap + " statistics:");
                            System.out.println("Leader: " + currentRaceLeader.getName() + "\tTotal Time: " + 
                                currentRaceLeader.getTime() + " seconds");
                        }

                        System.out.println("The championship race at " + venue.getVenueName() + " has concluded!");
                        driversList.allocateScores();
                        System.out.println("Results are: ");
                        String format = "%20s | %8s | %10s | %8s ";
                        System.out.println(String.format(format, "Name", "Ranking", "Race Time", "Score"));
                        for(Driver driver : driversList.getDrivers()) {
                            if(driversList.getDrivers().get(4) == driver) 
                                break;
                            System.out.println(String.format(format, driver.getName(), driver.getRanking(),
                                    driver.getTime(), driver.getScore()));
                        }
                    }
                    System.out.println("------------------------------");
                    System.out.println("Championship has concluded and the champion is:");
                    Driver winner = driversList.highestScore();
                    System.out.println(winner.getName() + " with a total of " + winner.getScore() + " points!!");
                    System.out.println("------------------------------");
                }
            }

当我单击该对象时,它显示没有可访问的方法,因此我无法开始模拟。有什么我想念的吗?代码编译得很好,没有任何错误消息。当我创建班级冠军的新对象时,它仍然不允许我模拟。

标签: javascriptjavamethodsbluej

解决方案


是的,除了Championship对象的默认构造函数之外的所有方法都被标记为私有的,因此只能在类实现本身内部访问。

一旦您实例化Championship对象的实例,startgame()就会自动调用该方法。

public static void main(String[] args) {
  Championship sim = new Championship();
  sim.startgame();
}

如果您希望能够在Championship不立即调用该startgame()方法的情况下创建实例,或者startgame()在实例化之外调用该方法 - 从构造函数中标记startgame() public和/或删除sim.startgame()

方法原型应该匹配

public void startgame() {
  ...
}

推荐阅读