質問が連投になって大変申し訳ないのですが。
javaを学習中でありますが、引数の引渡し作用がいまいちわかりません。

class CallByValue{
public static void main(String args[]){
    int i   = 5;
    int j[] = { 1, 2, 3, 4};
    StringBuffer sb = new StringBuffer("abcde");

    display(i, j, sb);

    a(i, j, sb);

    display(i, j, sb);
}

static void a(int i, int j[], StringBuffer sb) {
    i = 7;
    j[0] = 11;
    sb.append("fghij");
}
static void display(int i, int j[], StringBuffer sb) {
    System.out.println(i);
    for(int index = 0; index < j.length; index++)
        System.out.println(j[index] + " ");
    System.out.println("");
    System.out.println(sb);
}}

このコードで出されるメッセージは
5
1
2
3
4

abcde
5
11
2
3
4

abcdefghij
です。
main()で記述されている diplay()で一度表示して a()でstatic void a()の値を戻して変えて次の display()に表示といった順にメッセージを表示していると考えているのですが

static void a(int i, int j[], StringBuffer sb) {
    i = 7;
    j[0] = 11;
    sb.append("fghij");
}

このコードをみると 7 11 2 3 4 fghijとなるのではないかと思います。

i = 7と書いているのにどうして i=5のままで出されるのでしょうか
またsb.append("fghij")と書かれているのにどうして abcdefghijと出されるのでしょうか。
よろしくお願い致します。