Caro, realmente é curioso este exercício. No meu caso, como faço muitas operações binárias, fiquei até preocupado de um dia cair nesta pegadinha num cenário errado.
Pelo que pude analisar, em ordem foram chamados:
1.o) Integer Method Called
2.o) Byte Method Called
3.o) Byte Method Called
4.o) Integer Method Called
Analise por chamada:
Primeira chamada: O bytecode do seu algoritimo está chamando Integer.valueOf para expressão (byte) b+c porque está predefinido ser a forma mais ágil de execução neste tipo de invocação. Por isso chamou o método com a assinatura Integer. A minha primeira impressão foi de que você estivesse fazendo um parse da expressão [b+c] para byte, mas na verdade você converteu desnecessariamente b. A conversão da expressão é assim: (byte) (b+c).
Segunda chamada: Por se tratar de uma atribuição (b += c) antes de chamada do método, quando invocado o método, é passado não uma expressão e sim um primitivo byte. Neste caso o compilador decidiu pelo método de assinatura Byte.
Terceira chamada: Por se tratar de um parâmetro incrementado antes (c++), quando invocado o método, é passado não uma expressão e sim um primitivo byte. Neste caso o compilador também decidiu pelo método de assinatura Byte.
Quarto chamada: A primeira chamada compreende esta situação em seu esclarecimento.
Segue a pilha de chamadas de main:
public static void main(java.lang.String[]);
Code:
Stack=4, Locals=3, Args_size=1
0: bipush 10
2: istore_1
3: bipush 15
5: istore_2
6: new #6; //class Mae
9: dup
10: invokespecial #7; //Method "<init>":()V
13: iload_1
14: iload_2
15: iadd
16: invokestatic #8; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
19: invokevirtual #9; //Method metodo:(Ljava/lang/Integer;)V
22: new #6; //class Mae
25: dup
26: invokespecial #7; //Method "<init>":()V
29: iload_1
30: iload_2
31: iadd
32: i2b
33: dup
34: istore_1
35: invokestatic #10; //Method java/lang/Byte.valueOf:(B)Ljava/lang/Byte;
38: invokevirtual #11; //Method metodo:(Ljava/lang/Byte;)V
41: new #6; //class Mae
44: dup
45: invokespecial #7; //Method "<init>":()V
48: iload_2
49: iload_2
50: iconst_1
51: iadd
52: i2b
53: istore_2
54: invokestatic #10; //Method java/lang/Byte.valueOf:(B)Ljava/lang/Byte;
57: invokevirtual #11; //Method metodo:(Ljava/lang/Byte;)V
60: new #6; //class Mae
63: dup
64: invokespecial #7; //Method "<init>":()V
67: iload_1
68: iload_2
69: iadd
70: invokestatic #8; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
73: invokevirtual #9; //Method metodo:(Ljava/lang/Integer;)V
76: return
LineNumberTable:
line 14: 0
line 15: 3
line 17: 6
line 18: 22
line 19: 41
line 20: 60
line 22: 76
}
wiliamps