Duvida sobre array

tenho o seguinte código

[code]package capitulo_7;
import java.util.Random;

public class DeckOfCards {
private Card[] deck;
private int currentCard;
private static final int NumberOfCards = 52;
private static final Random randomGenerator = new Random();

public DeckOfCards (){
    String faces[] = {"Ás","Dois","Tres","Quatro","Cinco","Seis","Sete",
    "Oito","Nove","Dez","Valete","Rainha","Rei"};
    
    String suits[] = {"Coração","Ouro","Paus","Espadas"};
    
    deck = new Card[NumberOfCards];
    currentCard = 0;
    
    for(int count = 0; count < deck.length; count++){
        deck[count] = new Card( faces[count % 13], suits[count / 13]);
    }
}
public void shuffle(){
    currentCard = 0;
    
    for(int first = 0; first < deck.length; first++){
        int second = randomGenerator.nextInt(NumberOfCards);
        
        Card temp = deck[first];
        deck[first] = deck[second];
        deck[second] = temp;
    }
}
public Card dealCard(){
    if(currentCard < deck.length)
        return deck[currentCard++];
    else
        return null;
}

}
[/code]

[code]package capitulo_7;

public class Card {
private String face, suit;

public Card(String cardFace, String cardSuit){
    face = cardFace; suit = cardSuit;
}
public String toString(){
    return face + " de " + suit;
}

}[/code]

[code]package capitulo_7;

public class DeckOfCardTest {
public static void main(String[] args){
DeckOfCards application = new DeckOfCards();
application.shuffle();

    for(int i = 1; i<=52; i++){
        System.out.printf("%-19s", application.dealCard());
        
        if(i % 4 == 0)
            System.out.println();
    }
}

}
[/code]

Estou ficando com muita raiva desse livro " Java como programar 8° edição", repete muito as mesmas coisas e não explica direito… pelomenos não esse código.
Estou com dificuldades para entender como o array deck da classe DeckOfCards manipula a classe Card

1° O que examente o programa cria com a instrução, private Card[] deck;
um array deck do tipo Card, como seria representado isso?, afinal na Classe Card só tem um construtor e um método de retorno.

2° Em momento algum eu vi o método toString de Card ser chamado, então como o programa chamou ele? foi no método dealCard?
3° Na instrução deck = new Card[NumberOfCards];
da classe DeckOfCards, essa instrução cria 52 elementos do tipo Card, então seria 52x as instruções da classe Card?, deck referencia um array da classe Card certo?

4° Se eu estiver certo na 3° pergunta, Na instrução for da classe DeckOfCards, o programa adiciona uma face e um naipe ao array deck conforme count vai subindo, e então o face e o naipe são usados no construtor da classe Card para inicilizar as variaveis de instancia, mais aquele método de retorno como fica?
só quero tirar algumas duvidas antes de continuar,o livro não explicou bem isso.

onde estou o proxy bloquei o acesso ao site onde vc hospedou a imagem, se vc puder colocar o codigo eu posso te ajudar.

Com relação a primeira pergunta veja esse texto escrito por Dayvid Lima:

Arrays são objetos que armazenam diversas variáveis do mesmo tipo. Eles podem conter variáveis de referência primitivas ou de objeto, mas o array propriamente dito sempre será um objeto da pilha, mesmo se for declarado para armazenar elementos primitivos. Em outras palavras, não existe algo como um array primitivo, mas você pode criar um array de elementos primitivos.

1° O que examente o programa cria com a instrução?
Resposta: O progama não cria nada apenas declara uma variável do tipo array de Card.

2° Em momento algum eu vi o método toString de Card ser chamado, então como o programa chamou ele? foi no método dealCard?

System.out.printf("%-19s", application.dealCard());

public Card dealCard(){
if(currentCard < deck.length)
return deck[currentCard++];
else
return null;
}

Como poder ver será retornado o elemento Card que está contido em deck, ou seja cada Card tem um metodo toString() sobrescrito, e como está sendo chamado
dentro de um System.out.printf, seu metodo toString será chamado. Se você abrir o codigo fonte do metodo printf, vai verificar que depois de fazer la um monte de coisa vai chamar algo parecido com isso aqui:

void print(Object arg, Locale l) throws IOException;
String toString();
}

Ou seja quando voce passa um objeto para o metodo System.out… o metodo toString() do objeto é chamado.

mais aquele método de retorno como fica?

essa pergunta eu não entendi, qual metodo?

[quote]1° O que examente o programa cria com a instrução,
view plaincopy to clipboardprint?

[code]private Card[] deck; [/code] 

um array deck do tipo Card, como seria representado isso?, afinal na Classe Card só tem um construtor e um método de retorno.
[/quote]

a classe Card tem 2 propriedades privadas

 private String face, suit;

então a instrução a que vc se refere, declara um array de Card com nome deck, mas não o inicializa, isso é feito na linha:

deck = new Card[NumberOfCards];  

no construtor da classe DeckOfCards

[quote]2° Em momento algum eu vi o método toString de Card ser chamado, então como o programa chamou ele? foi no método dealCard?
o toString é chamado nesta linha:

System.out.printf("%-19s", application.dealCard());

[/quote]
o método dealCard retorna um item Card, então o printf chama o método toString da classe Card

não, essa instrução cria/inicializa o deck com um array de tamanho 52, anteriormente ele foi só declarado, mas não foi criado (era null), agora ele existe, e tem capacidade para 52 objetos do tipo Card

[quote]4° Se eu estiver certo na 3° pergunta, Na instrução for da classe DeckOfCards, o programa adiciona uma face e um naipe ao array deck conforme count vai subindo, e então o face e o naipe são usados no construtor da classe Card para inicilizar as variaveis de instancia, mais aquele método de retorno como fica?
só quero tirar algumas duvidas antes de continuar,o livro não explicou bem isso. [/quote]

acho que está falando deste for, certo ?

for(int count = 0; count < deck.length; count++){ deck[count] = new Card( faces[count % 13], suits[count / 13]);

para cada uma das 52 posições do array deck, ele cria uma nova Card com número e nipe e atribuí a nova Card criada a uma posição em deck

não sei qual método de retorno é esse que você está falando, pode dizer qual é ?

primeira questão:

private Card[] deck;

cria um array de Card no qual o seu construtor exige dois parametros que são um nipe, definidos no array suits
e um numero definido no array face.

esta linha define que o array dek do tipo Cards terá 52 posições

deck = new Card[NumberOfCards]; //NumberOfCards esta definido como constante de valor 52

a instrução a seguir diz que cada carta(deck) recebe um numero(face) e um nipe(suits)

        for(int count = 0; count < deck.length; count++){  //tamanho de deck é 52
            deck[count] = new Card( faces[count % 13], suits[count / 13]);  // para cada deck um numero e um nipe
        }

os proximos metodos fazem o embaralhamento destas cartas após o preenchimento

segunda questão:

bom vc criou a classe Card a qual tem seus metodos e funcinalidades
este é o paradigma da OO, poder criar novos objetos apartir de modelos definidos
e fazer com que eles assumam suas propriedades e funcionalidades.
exemplos seriam:

Card deck = new Cards; //onde deck é um simples objeto de Card e tem suas mesmas propriedades e funcionalidades
Card[] deck = new Cards[int x]; //segue a mesma primissa, porém definido como um array, para cada deck um Crad
Card deck[] = new Card[int x]; //outra forma de definição de um array de objetos do tipo Card

terceira questão:

sim, a impressão é definida pelo retorno do metodo dealCard.

quarta questão:

o metodo toString é chamado implicitamente e ñ formalmente, como assim?
toda classe tem um metodo construtor, que é o mesmo nome da classe, quando vc cria uma classe ,
e ñ define um construtor, o compilador irá definir um contrutor padrão para vc, se vc tiver definido um,
ele irá utilizalo. Sendo assim o codigo:

    public Card(String cardFace, String cardSuit){  
        face = cardFace; suit = cardSuit;  
    }  

em Card, é uma sobrescrita do construtor padrão.
Logo a classe Card tem sómente um metodo que é o toString.

espero ter ajudado.