Olá Matheus,
foi a ordem com a qual ele executou as instruções que fez ele devolver 54. Se quiser, depois uma ferramenta de debug que você verá que ele vai executar exatamente este passo a passo que vou descrever abaixo.
Antes vamos supor que na verdade o código está assim
public class Classe1 {
public float d1;
public Classe1 (float p) {
this.d1 = p;
}
public void metodo3 (float m, float n) {
d1 *= (m + n);
}
public void metodo2 (float m) {
this.metodo3(m, m);
d1 *=m;
}
public void metodo1() {
this.metodo2 (this.d1);
}
}
class Program {
static void Main (string[] args) {
Classe1 c1 = new Classe1 (3);
c1.metodo1();
System.Console.WriteLine (c1.d1);
}
}
Mudei o nome dos métodos para facilitar um pouco.
Primeiro quando o código roda new Classe1 (3)
, então o d1
ganhará o valor 3.
Ai chamar o método c1.metodo1()
, como não recebe nenhum parâmetro, ele executa este código aqui:
public void metodo1() {
this.metodo2(this.d1);
}
Este código chama o método2 passando como parâmetro valor de d1
que é 3 por enquanto. Então o método2 que ele executa é este aqui:
public void metodo2(float m) {
this.metodo3 (m, m);
d1 *=m;
}
Sendo que m
então recebeu o valor 3. A primeira coisa que ele faz é chamar o metodo3 que recebe dois floats como parâmetro. Ambos ele passa o 3 do m
para isso. Então ele está rodando o metodo3 agora:
public void metodo3 (float m, float n) {
d1 *= (m + n);
}
Sendo que o m
e o n
está com o valor 3. O que ele faz nesta linha é primeiro a soma de m + n
, que dá 6. Então o que ele está fazendo depois seria um código assim d1 *= 6
, que é a mesma coisa que d1 = d1 * 6
. Como d1
está por enquanto com o valor 3, então o novo valor de d1
será 3 * 6. Ou seja, agora o valor de d1
passa a ser 18.
Como ele termina de executar o metodo3, então ele volta a executar o metodo2. O comando que falta ele fazer do metodo2 é d1 *=m
, que é a mesma coisa que d1 = d1 * m
. Como d1
está com o valor 18 e o m
está com o valor 3, então o novo valor de d1
será 18 * 3. Pronto, o novo valor de d1
fica em 54.
Assim, ele termina de executar o metodo2 e o metodo1 e só imprime o valor no console.