Как программа передает значения в метод ранжирования () - PullRequest
0 голосов
/ 19 сентября 2018

Привет всем, Я хотел бы попросить вас помочь разобраться в логике этой программы, особенно в некоторых частях, в которых я, вероятно, сложен.

1.Metod ranking().Он не принимает какой-либо параметр, но возвращает результат из параметров "выиграл" и "связан".ХОРОШО.Но когда мы называем этот метод следующим образом

System.out.println(adelaideCrows.getName()+": result: 
         "+**adelaideCrows.ranking()**);

, как программа знает значения "выиграно" и "связано" для этой команды adealideCrows?Я знаю, что ООП - это передача объектов соответствующим ссылкам на объекты.Так работает ли он так, что когда мы сначала вызываем метод adelaideCrows.matchResult(ohioFotlball, 1,0);, тогда adelaideCrows является ссылкой на метод matchResult, передавая параметры в скобках, а затем они сохраняются в памяти под ссылкой на adelaideCrows?поэтому, когда мы в следующий раз вызовем тот же метод с другой ссылкой melbournSoccer.matchResult(newyorkSoccer,6,4);, тогда параметры "won" и "tied" будут иметь свои собственные значения, переданные в скобках под ссылкой melbournSoccer?Таким образом, после вызова метода rank () со ссылкой, например, программа adelaideCrows узнает, что по этой ссылке уже сохранены значения параметров "выиграно" и "связано", и метод затем возвращает правильные значения.Правильно?

2. И здесь System.out.println(melbournSoccer.compareTo(newyorkSoccer)); Логика та же самая?ссылка melbournSoccer связана в методе public int compareTo(Team<T> team) с this.ranking(), но ссылка newyorkSoccer связана с team.ranking()?Таким образом, вызов this.ranking() вызывает значения, хранящиеся в памяти эталонного melbournSoccer и т. Д.

Спасибо, МНОГО.

Вот код для основного класса:

public class Main
{
    public static void main(String[] args) {
        SoccerPlayer soccerPlayer = new SoccerPlayer("joe");
        BaseballPlayer baseballPlayer = new BaseballPlayer("pat");
        FootballPlayer footballPlayer = new FootballPlayer("backham");


         Team<FootballPlayer> adelaideCrows = new Team<>("Adelaide Crows 
         footbal");
         Team<SoccerPlayer> melbournSoccer = new Team<>("Melbourn soccer");
         Team<BaseballPlayer> jerseeBaseball = new Team<>("Jersee 
         Baseball");


         melbournSoccer.addPlayer(soccerPlayer);
         jerseeBaseball.addPlayer(baseballPlayer);

         adelaideCrows.matchResult(ohioFotlball, 1,0);
         melbournSoccer.matchResult(newyorkSoccer,6,4);

         System.out.println("Ranking...");
         System.out.println(adelaideCrows.getName()+": result: 
         "+adelaideCrows.ranking());
         System.out.println(melbournSoccer.getName()+": result: 
         "+melbournSoccer.ranking());
         System.out.println(jerseeBaseball.getName()+": result: 
         "+jerseeBaseball.ranking());


         System.out.println(melbournSoccer.compareTo(newyorkSoccer)); 
         System.out.println(adelaideCrows.compareTo(ohioFotlball));

Класс игрока, от которого наследуются еще три класса FotballPlayer, SoccerrPlayer и BaseballPlayer.

public abstract class Player{
    private String name;

    public Player(String name){
        this.name = name;
    }

    public String getName(){
        return name;
    }

}

А вот и командный класс.

import java.util.ArrayList;

public class Team<T extends Player> implements Comparable<Team<T>>{
    private String name;
    int played = 0;
    int lost = 0;
    int won = 0;
    int tied = 0;

    private ArrayList<T> members = new ArrayList<>();

    public Team(String name){
        this.name = name;
    }

    public String getName(){
        return name;
    }

    public boolean addPlayer(T player){    
        if(members.contains(player)){
            System.out.println(player.getName()+" is already on this 
   team.");
            return false;
        }else{
            members.add(player);
            System.out.println(player.getName()+" has been added to team 
  "+this.name);
            return true;
        }
    }

    public int numPlayers(){
        return this.members.size();

    }

    public void matchResult(Team<T> oponent, int ourScore, int theirScore){
        if(ourScore > theirScore){
            won++;
        }else if(ourScore == theirScore){
            tied++;
        }else{
            lost++;
        }
        played++;
        if(oponent != null){
            oponent.matchResult(null, theirScore, ourScore);
        }
    }

    public int ranking(){
        return (won * 2) + tied;
    }

    @Override
    public int compareTo(Team<T> team){
       if(this.ranking() > team.ranking()){
           return -1;
       } else if(this.ranking() < team.ranking()){
               return 1;
       }
            else{
                   return 0;
               }

       }



}

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Вот некоторые пояснения к вопросам.

Вопрос 1 :

Метод ranking().Он не принимает какой-либо параметр, но возвращает результат из параметров "выиграл" и "связан".ХОРОШО.Но когда мы называем этот метод следующим образом:

System.out.println(adelaideCrows.getName() + ": result: " + **adelaideCrows.ranking()**);

как программа знает значения "побед" и "ничьих" для этой команды adealideCrows?...

Ответ 1 :

Рассмотрим это утверждение в классе Main: adelaideCrows.matchResult(ohioFotlball, 1, 0);.Когда этот оператор выполняется:

  • Объект adelaideCrows затрагивается.В методе matchResult переменные экземпляра won и tied изменяются на основе входных параметров метода (в данном случае 1 и 0).
  • Когда оператор adelaideCrows.ranking()При выполнении метода ranking() используются переменные экземпляра объекта adelaideCrows won и tied (которые были установлены ранее) для вычисления ранжирования ((won * 2) + tied) и возврата значения.

ПРИМЕЧАНИЯ : См. Эту статью (мой ответ) о StackOverflow, чтобы получить представление о классе Java, объекте, ссылке и атрибутах и ​​поведении класса: Ссылки на объекты в Java .


Вопрос 2 :

А также здесь System.out.println(melbournSoccer.compareTo(newyorkSoccer)); Логика одинакова?melbournSoccer ссылка подключена в методе public int compareTo(Team<T> team) к this.ranking(), но ссылка newyorkSoccer подключена к team.ranking()?Таким образом, вызов this.ranking() вызывает значения, хранящиеся в памяти для справки melbournSoccer и т. Д.?

Ответ 2 :

Рассмотрим утверждение: System.out.println(melbournSoccer.compareTo(newyorkSoccer));

Q).melbournSoccer ссылка подключена в методе public int compareTo(Team<T> team) to this.ranking()
A).Ключевое слово this относится к текущему объекту - здесь оно melbournSoccer.this.ranking метод получает рейтинг для melbournSoccer.

Q).Ссылка newyorkSoccer подключена к team.ranking()?
A).Параметр метода compareTo() принимает Team в качестве входных данных - здесь это newyorkSoccer объект команды.

Q).Таким образом, вызов this.ranking() вызывает значения, хранящиеся в памяти для справки melbournSoccer и так далее?
A).ДА.

ПРИМЕЧАНИЯ : Здесь приведена ссылка на раздел учебников по Java для Oracle Использование ключевого слова this .

0 голосов
/ 19 сентября 2018

Я пытаюсь ответить на ваш первый вопрос: переменные «won» и «tied» являются переменными экземпляра.Это означает, что каждый раз, когда вы создаете объект своего командного класса, объект получает собственную переменную «won» и «tied» для сохранения данных в нем.Вы можете получить к ним доступ по имени уникального объекта (в вашем случае название команды, например, «adelaideCrows.won» без кавычек).Чтобы ответить на вопрос о функции «matchResult»: функция снова связана с вашим объектом, потому что вы не используете «статическое» объявление перед именем метода.Таким образом, без статики каждый экземпляр вашего класса получает свой собственный метод, поэтому, если вы передаете параметры этой функции, они передаются в функцию objects.Если вы хотите сохранить их, вы должны создать переменную класса (которая сделана с использованием «static int» в качестве примера) или переменную экземпляра, чтобы сохранить данные, пока объект существует, в противном случае данные будут переданы вфункция и будет потеряна после завершения выполнения функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...