|
声明的时候可以用,调用的时候就不行,当然做参数的变量本身可以是final的,但是不是这么写的。
[php]
public class FinalVariable {
public static void main(String[] args) {
String tt="";
final String pp="";
test(final tt); //error
test(final new String(tt)); //error
test(tt);//correct
test(pp);//correct
test(new String(tt));//correct
test(new String(pp));//correct
pp=""; //error
tt=pp; //correct;
}
public static void test(final String ts){
String a=ts.substring(0);//correct
ts=new String(ts);//error
}
}
[/php]
方法的签名和方法内部或者类的内部所声明的final是为了防止修改对象引用,在方法内部的final参数和变量据说也会使java编译器对代码做更多的优化。
但事实上却不见得如此。
例如一下代码:
[php]public class FinalVariable {
public static void main(String[] args) {
String tt="";
final String pp="";
//test(final tt); //error
//test(final new String(tt)); //error
test(tt);//correct
test(pp);//correct
test(new String(tt));//correct
test(new String(pp));//correct
//pp=""; //error
tt=pp; //correct;
}
public static void test(final String ts){
String a=ts.substring(0);//correct
//ts=new String(ts);//error
}
}[/php]
正常情况下编译后,再反编译过来,可以看到final关键字都没了.
[php] public class FinalVariable
{
public FinalVariable()
{
}
public static void main(String args[])
{
String tt = "";
String pp = "";
test(tt);
test("" ;
test(new String(tt));
test(new String("" );
tt = "";
}
public static void test(String ts)
{
String a = ts.substring(0);
}
}[/php]
使用javac -O 优化编译,结果类似,虽然这段代码很简单,可以看到还是有区别的.
[php]public class FinalVariable
{
public FinalVariable()
{
}
public static void main(String args[])
{
String s = "";
test(s);
test("" ;
test(new String(s));
test(new String("" );
s = "";
}
public static void test(String s)
{
String s1 = s.substring(0);
}
}[/php]
至于在运行时由jit做的优化,就看不到了.高手估计还是有办法看到的.
由GCJ "GCC: (GNU) 3.4.6 20060404 (Red Hat 3.4.6-3)"编译的,又是另外一个样子了.可以看到构造函数位置的变化
[php] public class FinalVariable
{
public static void main(String args[])
{
String s = "";
String s1 = "";
test(s);
test(s1);
test(new String(s));
test(new String(s1));
s = s1;
}
public static void test(String s)
{
String s1 = s.substring(0);
}
public FinalVariable()
{
}
}[/php]
如果要优化编译,就看不到class文件了,最多瞧一瞧汇编代码,不在行,贴上来,有懂的,给讲解讲解,呵呵
未优化
[php]
.file "FinalVariable.java"
.section .debug_abbrev,"",@progbits
.Ldebug_abbrev0:
.section .debug_info,"",@progbits
.Ldebug_info0:
.section .debug_line,"",@progbits
.Ldebug_line0:
.text
.Ltext0:
.align 2
.globl _ZN13FinalVariable4mainEP6JArrayIPN4java4lang6StringEE
.type _ZN13FinalVariable4mainEP6JArrayIPN4java4lang6StringEE, @function
_ZN13FinalVariable4mainEP6JArrayIPN4java4lang6StringEE:
.LFB2:
pushl %ebp
.LCFI0:
movl %esp, %ebp
.LCFI1:
pushl %ebx
.LCFI2:
subl $20, %esp
.LCFI3:
.LBB2:
subl $12, %esp
.LCFI4:
pushl $_ZN13FinalVariable6class$E
.LCFI5:
call _Jv_InitClass
addl $16, %esp
.LCFI6:
movl _CD_FinalVariable+4, %eax
movl %eax, -8(%ebp)
.LBB3:
movl _CD_FinalVariable+4, %eax
movl %eax, -12(%ebp)
movl -8(%ebp), %eax
subl $12, %esp
.LCFI7:
pushl %eax
.LCFI8:
call _ZN13FinalVariable4testEPN4java4lang6StringE
addl $16, %esp
.LCFI9:
movl -12(%ebp), %eax
subl $12, %esp
.LCFI10:
pushl %eax
.LCFI11:
call _ZN13FinalVariable4testEPN4java4lang6StringE
addl $16, %esp
.LCFI12:
subl $8, %esp
.LCFI13:
pushl $20
.LCFI14:
pushl $_ZN4java4lang6String6class$E
.LCFI15:
call _Jv_AllocObjectNoFinalizer
addl $16, %esp
.LCFI16:
movl %eax, %ebx
movl -8(%ebp), %eax
subl $8, %esp
.LCFI17:
pushl %eax
.LCFI18:
pushl %ebx
.LCFI19:
call _ZN4java4lang6StringC1EPS1_
addl $16, %esp
.LCFI20:
movl %ebx, %eax
subl $12, %esp
.LCFI21:
pushl %eax
.LCFI22:
call _ZN13FinalVariable4testEPN4java4lang6StringE
addl $16, %esp
.LCFI23:
subl $8, %esp
.LCFI24:
pushl $20
.LCFI25:
pushl $_ZN4java4lang6String6class$E
.LCFI26:
call _Jv_AllocObjectNoFinalizer
addl $16, %esp
.LCFI27:
movl %eax, %ebx
movl -12(%ebp), %eax
subl $8, %esp
.LCFI28:
pushl %eax
.LCFI29:
pushl %ebx
.LCFI30:
call _ZN4java4lang6StringC1EPS1_
addl $16, %esp
.LCFI31:
movl %ebx, %eax
subl $12, %esp
.LCFI32:
pushl %eax
.LCFI33:
call _ZN13FinalVariable4testEPN4java4lang6StringE
addl $16, %esp
.LCFI34:
movl -12(%ebp), %eax
movl %eax, -8(%ebp)
.LBE3:
.LBE2:
movl -4(%ebp), %ebx
leave
ret
.LFE2:
.size _ZN13FinalVariable4mainEP6JArrayIPN4java4lang6StringEE, .-_ZN13FinalVariable4mainEP6JArrayIPN4java4lang6StringEE
.align 2
.globl _ZN13FinalVariable4testEPN4java4lang6StringE
.type _ZN13FinalVariable4testEPN4java4lang6StringE, @function
_ZN13FinalVariable4testEPN4java4lang6StringE:
.LFB3:
pushl %ebp
.LCFI35:
movl %esp, %ebp
.LCFI36:
subl $8, %esp
.LCFI37:
.LBB4:
subl $12, %esp
.LCFI38:
pushl $_ZN13FinalVariable6class$E
.LCFI39:
call _Jv_InitClass
addl $16, %esp
.LCFI40:
movl 8(%ebp), %eax
movl %eax, -8(%ebp)
cmpl $0, -8(%ebp)
jne .L4
call _Jv_ThrowNullPointerException
.L4:
subl $8, %esp
.LCFI41:
pushl $0
.LCFI42:
pushl -8(%ebp)
.LCFI43:
call _ZN4java4lang6String9substringEi
addl $16, %esp
.LCFI44:
movl %eax, -4(%ebp)
.LBE4:
leave
ret
.LFE3:
.size _ZN13FinalVariable4testEPN4java4lang6StringE, .-_ZN13FinalVariable4testEPN4java4lang6StringE
.align 2
.globl _ZN13FinalVariableC1Ev
.type _ZN13FinalVariableC1Ev, @function
_ZN13FinalVariableC1Ev:
.LFB4:
pushl %ebp
.LCFI45:
movl %esp, %ebp
.LCFI46:
subl $8, %esp
.LCFI47:
.LBB5:
movl 8(%ebp), %eax
subl $12, %esp
.LCFI48:
pushl %eax
.LCFI49:
call _ZN4java4lang6ObjectC1Ev
addl $16, %esp
.LCFI50:
.LBE5:
leave
ret
.LFE4:
.size _ZN13FinalVariableC1Ev, .-_ZN13FinalVariableC1Ev
.section .rodata
.align 2
.type _Utf1, @object
.size _Utf1, 4
_Utf1:
.value 1465
.value 4
.ascii "main"
.zero 1
.align 2
.type _Utf2, @object
.size _Utf2, 4
_Utf2:
.value 59434
.value 22
.ascii "([Ljava.lang.String V"
.zero 1
.align 2
.type _Utf3, @object
.size _Utf3, 4
_Utf3:
.value 17554
.value 4
.ascii "test"
.zero 1
.align 2
.type _Utf4, @object
.size _Utf4, 4
_Utf4:
.value 54943
.value 21
.ascii "(Ljava.lang.String V"
.zero 1
.align 2
.type _Utf5, @object
.size _Utf5, 4
_Utf5:
.value 626
.value 6
.ascii "<init>"
.zero 1
.align 2
.type _Utf6, @object
.size _Utf6, 4
_Utf6:
.value 39797
.value 3
.ascii "()V"
.zero 1
.data
.align 32
.type _MT_FinalVariable, @object
.size _MT_FinalVariable, 60
_MT_FinalVariable:
.long _Utf1
.long _Utf2
.value 16393
.value -1
.long _ZN13FinalVariable4mainEP6JArrayIPN4java4lang6StringEE
.long 0
.long _Utf3
.long _Utf4
.value 16393
.value -1
.long _ZN13FinalVariable4testEPN4java4lang6StringE
.long 0
.long _Utf5
.long _Utf6
.value 16385
.value -1
.long _ZN13FinalVariableC1Ev
.long 0
.globl _ZTVN13FinalVariableE
.align 32
.type _ZTVN13FinalVariableE, @object
.size _ZTVN13FinalVariableE, 36
_ZTVN13FinalVariableE:
.long 0
.long 0
.long _ZN13FinalVariable6class$E
.long 4
.long _ZN4java4lang6Object8finalizeEv
.long _ZN4java4lang6Object8hashCodeEv
.long _ZN4java4lang6Object6equalsEPS1_
.long _ZN4java4lang6Object8toStringEv
.long _ZN4java4lang6Object5cloneEv
.section .rodata
.align 2
.type _Utf7, @object
.size _Utf7, 4
_Utf7:
.value 0
.value 0
.zero 1
.data
.align 4
.type _CD_FinalVariable, @object
.size _CD_FinalVariable, 8
_CD_FinalVariable:
.long 0
.long _Utf7
.type _CT_FinalVariable, @object
.size _CT_FinalVariable, 2
_CT_FinalVariable:
.byte 0
.byte 8
.align 4
.type _catch_classes_FinalVariable, @object
.size _catch_classes_FinalVariable, 24
_catch_classes_FinalVariable:
.long 0
.long 0
.long 0
.long 0
.zero 8
.section .rodata
.align 2
.type _Utf8, @object
.size _Utf8, 4
_Utf8:
.value 20978
.value 13
.ascii "FinalVariable"
.zero 1
.globl _ZN13FinalVariable6class$E
.data
.align 32
.type _ZN13FinalVariable6class$E, @object
.size _ZN13FinalVariable6class$E, 120
_ZN13FinalVariable6class$E:
.long _ZTVN4java4lang5ClassE+8
.long 0
.long _Utf8
.value 1
.zero 2
.long _ZN4java4lang6Object6class$E
.long 2
.long _CT_FinalVariable
.long _CD_FinalVariable
.long _MT_FinalVariable
.value 3
.value 5
.long 0
.long 4
.value 0
.value 0
.long _ZTVN13FinalVariableE+8
.long 0
.long 0
.long 0
.long 0
.long _catch_classes_FinalVariable
.long 0
.long 0
.value 0
.byte 0
.zero 1
.long 0
.value 0
.zero 2
.long 0
.long 0
.long 0
.long 0
.long 0
.long 0
.section .jcr,"aw",@progbits
.align 4
.long _ZN13FinalVariable6class$E
.section .debug_frame,"",@progbits
.Lframe0:
.long .LECIE0-.LSCIE0
.LSCIE0:
.long 0xffffffff
.byte 0x1
.string ""
.uleb128 0x1
.sleb128 -4
.byte 0x8
.byte 0xc
.uleb128 0x4
.uleb128 0x4
.byte 0x88
.uleb128 0x1
.align 4
.LECIE0:
.LSFDE0:
.long .LEFDE0-.LASFDE0
.LASFDE0:
.long .Lframe0
.long .LFB2
.long .LFE2-.LFB2
.byte 0x4
.long .LCFI0-.LFB2
.byte 0xe
.uleb128 0x8
.byte 0x85
.uleb128 0x2
.byte 0x4
.long .LCFI1-.LCFI0
.byte 0xd
.uleb128 0x5
.byte 0x4
.long .LCFI4-.LCFI1
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI5-.LCFI4
.byte 0x2e
.uleb128 0x10
.byte 0x83
.uleb128 0x3
.byte 0x4
.long .LCFI6-.LCFI5
.byte 0x2e
.uleb128 0x0
.byte 0x4
.long .LCFI7-.LCFI6
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI8-.LCFI7
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI9-.LCFI8
.byte 0x2e
.uleb128 0x0
.byte 0x4
.long .LCFI10-.LCFI9
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI11-.LCFI10
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI12-.LCFI11
.byte 0x2e
.uleb128 0x0
.byte 0x4
.long .LCFI13-.LCFI12
.byte 0x2e
.uleb128 0x8
.byte 0x4
.long .LCFI14-.LCFI13
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI15-.LCFI14
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI16-.LCFI15
.byte 0x2e
.uleb128 0x0
.byte 0x4
.long .LCFI17-.LCFI16
.byte 0x2e
.uleb128 0x8
.byte 0x4
.long .LCFI18-.LCFI17
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI19-.LCFI18
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI20-.LCFI19
.byte 0x2e
.uleb128 0x0
.byte 0x4
.long .LCFI21-.LCFI20
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI22-.LCFI21
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI23-.LCFI22
.byte 0x2e
.uleb128 0x0
.byte 0x4
.long .LCFI24-.LCFI23
.byte 0x2e
.uleb128 0x8
.byte 0x4
.long .LCFI25-.LCFI24
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI26-.LCFI25
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI27-.LCFI26
.byte 0x2e
.uleb128 0x0
.byte 0x4
.long .LCFI28-.LCFI27
.byte 0x2e
.uleb128 0x8
.byte 0x4
.long .LCFI29-.LCFI28
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI30-.LCFI29
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI31-.LCFI30
.byte 0x2e
.uleb128 0x0
.byte 0x4
.long .LCFI32-.LCFI31
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI33-.LCFI32
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI34-.LCFI33
.byte 0x2e
.uleb128 0x0
.align 4
.LEFDE0:
.LSFDE2:
.long .LEFDE2-.LASFDE2
.LASFDE2:
.long .Lframe0
.long .LFB3
.long .LFE3-.LFB3
.byte 0x4
.long .LCFI35-.LFB3
.byte 0xe
.uleb128 0x8
.byte 0x85
.uleb128 0x2
.byte 0x4
.long .LCFI36-.LCFI35
.byte 0xd
.uleb128 0x5
.byte 0x4
.long .LCFI38-.LCFI36
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI39-.LCFI38
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI40-.LCFI39
.byte 0x2e
.uleb128 0x0
.byte 0x4
.long .LCFI41-.LCFI40
.byte 0x2e
.uleb128 0x8
.byte 0x4
.long .LCFI42-.LCFI41
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI43-.LCFI42
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI44-.LCFI43
.byte 0x2e
.uleb128 0x0
.align 4
.LEFDE2:
.LSFDE4:
.long .LEFDE4-.LASFDE4
.LASFDE4:
.long .Lframe0
.long .LFB4
.long .LFE4-.LFB4
.byte 0x4
.long .LCFI45-.LFB4
.byte 0xe
.uleb128 0x8
.byte 0x85
.uleb128 0x2
.byte 0x4
.long .LCFI46-.LCFI45
.byte 0xd
.uleb128 0x5
.byte 0x4
.long .LCFI48-.LCFI46
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI49-.LCFI48
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI50-.LCFI49
.byte 0x2e
.uleb128 0x0
.align 4
.LEFDE4:
.section .eh_frame,"a",@progbits
.Lframe1:
.long .LECIE1-.LSCIE1
.LSCIE1:
.long 0x0
.byte 0x1
.string "zP"
.uleb128 0x1
.sleb128 -4
.byte 0x8
.uleb128 0x5
.byte 0x0
.long __gcj_personality_v0
.byte 0xc
.uleb128 0x4
.uleb128 0x4
.byte 0x88
.uleb128 0x1
.align 4
.LECIE1:
.LSFDE1:
.long .LEFDE1-.LASFDE1
.LASFDE1:
.long .LASFDE1-.Lframe1
.long .LFB2
.long .LFE2-.LFB2
.uleb128 0x0
.byte 0x4
.long .LCFI0-.LFB2
.byte 0xe
.uleb128 0x8
.byte 0x85
.uleb128 0x2
.byte 0x4
.long .LCFI1-.LCFI0
.byte 0xd
.uleb128 0x5
.byte 0x4
.long .LCFI4-.LCFI1
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI5-.LCFI4
.byte 0x2e
.uleb128 0x10
.byte 0x83
.uleb128 0x3
.byte 0x4
.long .LCFI6-.LCFI5
.byte 0x2e
.uleb128 0x0
.byte 0x4
.long .LCFI7-.LCFI6
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI8-.LCFI7
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI9-.LCFI8
.byte 0x2e
.uleb128 0x0
.byte 0x4
.long .LCFI10-.LCFI9
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI11-.LCFI10
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI12-.LCFI11
.byte 0x2e
.uleb128 0x0
.byte 0x4
.long .LCFI13-.LCFI12
.byte 0x2e
.uleb128 0x8
.byte 0x4
.long .LCFI14-.LCFI13
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI15-.LCFI14
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI16-.LCFI15
.byte 0x2e
.uleb128 0x0
.byte 0x4
.long .LCFI17-.LCFI16
.byte 0x2e
.uleb128 0x8
.byte 0x4
.long .LCFI18-.LCFI17
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI19-.LCFI18
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI20-.LCFI19
.byte 0x2e
.uleb128 0x0
.byte 0x4
.long .LCFI21-.LCFI20
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI22-.LCFI21
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI23-.LCFI22
.byte 0x2e
.uleb128 0x0
.byte 0x4
.long .LCFI24-.LCFI23
.byte 0x2e
.uleb128 0x8
.byte 0x4
.long .LCFI25-.LCFI24
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI26-.LCFI25
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI27-.LCFI26
.byte 0x2e
.uleb128 0x0
.byte 0x4
.long .LCFI28-.LCFI27
.byte 0x2e
.uleb128 0x8
.byte 0x4
.long .LCFI29-.LCFI28
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI30-.LCFI29
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI31-.LCFI30
.byte 0x2e
.uleb128 0x0
.byte 0x4
.long .LCFI32-.LCFI31
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI33-.LCFI32
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI34-.LCFI33
.byte 0x2e
.uleb128 0x0
.align 4
.LEFDE1:
.LSFDE3:
.long .LEFDE3-.LASFDE3
.LASFDE3:
.long .LASFDE3-.Lframe1
.long .LFB3
.long .LFE3-.LFB3
.uleb128 0x0
.byte 0x4
.long .LCFI35-.LFB3
.byte 0xe
.uleb128 0x8
.byte 0x85
.uleb128 0x2
.byte 0x4
.long .LCFI36-.LCFI35
.byte 0xd
.uleb128 0x5
.byte 0x4
.long .LCFI38-.LCFI36
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI39-.LCFI38
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI40-.LCFI39
.byte 0x2e
.uleb128 0x0
.byte 0x4
.long .LCFI41-.LCFI40
.byte 0x2e
.uleb128 0x8
.byte 0x4
.long .LCFI42-.LCFI41
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI43-.LCFI42
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI44-.LCFI43
.byte 0x2e
.uleb128 0x0
.align 4
.LEFDE3:
.LSFDE5:
.long .LEFDE5-.LASFDE5
.LASFDE5:
.long .LASFDE5-.Lframe1
.long .LFB4
.long .LFE4-.LFB4
.uleb128 0x0
.byte 0x4
.long .LCFI45-.LFB4
.byte 0xe
.uleb128 0x8
.byte 0x85
.uleb128 0x2
.byte 0x4
.long .LCFI46-.LCFI45
.byte 0xd
.uleb128 0x5
.byte 0x4
.long .LCFI48-.LCFI46
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI49-.LCFI48
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI50-.LCFI49
.byte 0x2e
.uleb128 0x0
.align 4
.LEFDE5:
.file 1 "FinalVariable.java"
.text
.Letext0:
.section .debug_loc,"",@progbits
.Ldebug_loc0:
.LLST0:
.long .LFB2-.Ltext0
.long .LCFI0-.Ltext0
.value 0x2
.byte 0x74
.sleb128 4
.long .LCFI0-.Ltext0
.long .LCFI1-.Ltext0
.value 0x2
.byte 0x74
.sleb128 8
.long .LCFI1-.Ltext0
.long .LFE2-.Ltext0
.value 0x2
.byte 0x75
.sleb128 8
.long 0x0
.long 0x0
.LLST1:
.long .LFB3-.Ltext0
.long .LCFI35-.Ltext0
.value 0x2
.byte 0x74
.sleb128 4
.long .LCFI35-.Ltext0
.long .LCFI36-.Ltext0
.value 0x2
.byte 0x74
.sleb128 8
.long .LCFI36-.Ltext0
.long .LFE3-.Ltext0
.value 0x2
.byte 0x75
.sleb128 8
.long 0x0
.long 0x0
.LLST2:
.long .LFB4-.Ltext0
.long .LCFI45-.Ltext0
.value 0x2
.byte 0x74
.sleb128 4
.long .LCFI45-.Ltext0
.long .LCFI46-.Ltext0
.value 0x2
.byte 0x74
.sleb128 8
.long .LCFI46-.Ltext0
.long .LFE4-.Ltext0
.value 0x2
.byte 0x75
.sleb128 8
.long 0x0
.long 0x0
.section .debug_info
.long 0x158
.value 0x2
.long .Ldebug_abbrev0
.byte 0x4
.uleb128 0x1
.long .Letext0
.long .Ltext0
.string "GNU Java 3.4.6 20060404 (Red Hat 3.4.6-3)"
.byte 0xb
.string "FinalVariable.java"
.string "/homes/selgzhan"
.uleb128 0x2
.byte 0x1
.string "FinalVariable.main(java.lang.String[])"
.byte 0x1
.byte 0x4
.string "_ZN13FinalVariable4mainEP6JArrayIPN4java4lang6StringEE"
.long .LFB2
.long .LFE2
.long .LLST0
.uleb128 0x2
.byte 0x1
.string "FinalVariable.test(java.lang.String)"
.byte 0x1
.byte 0x16
.string "_ZN13FinalVariable4testEPN4java4lang6StringE"
.long .LFB3
.long .LFE3
.long .LLST1
.uleb128 0x3
.byte 0x1
.string "()"
.string "_ZN13FinalVariableC1Ev"
.byte 0x1
.long .LFB4
.long .LFE4
.long .LLST2
.byte 0x0
.section .debug_abbrev
.uleb128 0x1
.uleb128 0x11
.byte 0x1
.uleb128 0x12
.uleb128 0x1
.uleb128 0x11
.uleb128 0x1
.uleb128 0x25
.uleb128 0x8
.uleb128 0x13
.uleb128 0xb
.uleb128 0x3
.uleb128 0x8
.uleb128 0x1b
.uleb128 0x8
.byte 0x0
.byte 0x0
.uleb128 0x2
.uleb128 0x2e
.byte 0x0
.uleb128 0x3f
.uleb128 0xc
.uleb128 0x3
.uleb128 0x8
.uleb128 0x3a
.uleb128 0xb
.uleb128 0x3b
.uleb128 0xb
.uleb128 0x2007
.uleb128 0x8
.uleb128 0x11
.uleb128 0x1
.uleb128 0x12
.uleb128 0x1
.uleb128 0x40
.uleb128 0x6
.byte 0x0
.byte 0x0
.uleb128 0x3
.uleb128 0x2e
.byte 0x0
.uleb128 0x3f
.uleb128 0xc
.uleb128 0x3
.uleb128 0x8
.uleb128 0x2007
.uleb128 0x8
.uleb128 0x34
.uleb128 0xc
.uleb128 0x11
.uleb128 0x1
.uleb128 0x12
.uleb128 0x1
.uleb128 0x40
.uleb128 0x6
.byte 0x0
.byte 0x0
.byte 0x0
.section .debug_pubnames,"",@progbits
.long 0x69
.value 0x2
.long .Ldebug_info0
.long 0x15c
.long 0x62
.string "FinalVariable.main(java.lang.String[])"
.long 0xd0
.string "FinalVariable.test(java.lang.String)"
.long 0x132
.string "()"
.long 0x0
.section .debug_aranges,"",@progbits
.long 0x1c
.value 0x2
.long .Ldebug_info0
.byte 0x4
.byte 0x0
.value 0x0
.value 0x0
.long .Ltext0
.long .Letext0-.Ltext0
.long 0x0
.long 0x0
.section .note.GNU-stack,"",@progbits
.ident "GCC: (GNU) 3.4.6 20060404 (Red Hat 3.4.6-3)"
[/php]
优化
[php]
.file "FinalVariable.java"
.text
.align 2
.p2align 2,,3
.globl _ZN13FinalVariableC1Ev
.type _ZN13FinalVariableC1Ev, @function
_ZN13FinalVariableC1Ev:
.LFB2:
pushl %ebp
.LCFI0:
movl %esp, %ebp
.LCFI1:
subl $20, %esp
.LCFI2:
pushl 8(%ebp)
.LCFI3:
call _ZN4java4lang6ObjectC1Ev
leave
ret
.LCFI4:
.LFE2:
.size _ZN13FinalVariableC1Ev, .-_ZN13FinalVariableC1Ev
.align 2
.p2align 2,,3
.globl _ZN13FinalVariable4testEPN4java4lang6StringE
.type _ZN13FinalVariable4testEPN4java4lang6StringE, @function
_ZN13FinalVariable4testEPN4java4lang6StringE:
.LFB3:
pushl %ebp
.LCFI5:
movl %esp, %ebp
.LCFI6:
pushl %ebx
.LCFI7:
subl $16, %esp
.LCFI8:
movl 8(%ebp), %ebx
pushl $_ZN13FinalVariable6class$E
.LCFI9:
call _Jv_InitClass
addl $16, %esp
.LCFI10:
testl %ebx, %ebx
je .L6
subl $8, %esp
.LCFI11:
pushl $0
.LCFI12:
pushl %ebx
.LCFI13:
call _ZN4java4lang6String9substringEi
movl -4(%ebp), %ebx
leave
ret
.LCFI14:
.L6:
call _Jv_ThrowNullPointerException
.LFE3:
.size _ZN13FinalVariable4testEPN4java4lang6StringE, .-_ZN13FinalVariable4testEPN4java4lang6StringE
.align 2
.p2align 2,,3
.globl _ZN13FinalVariable4mainEP6JArrayIPN4java4lang6StringEE
.type _ZN13FinalVariable4mainEP6JArrayIPN4java4lang6StringEE, @function
_ZN13FinalVariable4mainEP6JArrayIPN4java4lang6StringEE:
.LFB4:
pushl %ebp
.LCFI15:
movl %esp, %ebp
.LCFI16:
pushl %esi
.LCFI17:
pushl %ebx
.LCFI18:
subl $12, %esp
.LCFI19:
pushl $_ZN13FinalVariable6class$E
.LCFI20:
call _Jv_InitClass
movl _CD_FinalVariable+4, %ebx
movl %ebx, (%esp)
call _ZN13FinalVariable4testEPN4java4lang6StringE
movl %ebx, (%esp)
call _ZN13FinalVariable4testEPN4java4lang6StringE
popl %ecx
.LCFI21:
popl %esi
.LCFI22:
pushl $20
.LCFI23:
pushl $_ZN4java4lang6String6class$E
.LCFI24:
call _Jv_AllocObjectNoFinalizer
movl %eax, %esi
popl %eax
.LCFI25:
popl %edx
.LCFI26:
pushl %ebx
.LCFI27:
pushl %esi
.LCFI28:
call _ZN4java4lang6StringC1EPS1_
movl %esi, (%esp)
call _ZN13FinalVariable4testEPN4java4lang6StringE
popl %ecx
.LCFI29:
popl %esi
.LCFI30:
pushl $20
.LCFI31:
pushl $_ZN4java4lang6String6class$E
.LCFI32:
call _Jv_AllocObjectNoFinalizer
movl %eax, %esi
popl %eax
.LCFI33:
popl %edx
.LCFI34:
pushl %ebx
.LCFI35:
pushl %esi
.LCFI36:
call _ZN4java4lang6StringC1EPS1_
movl %esi, (%esp)
call _ZN13FinalVariable4testEPN4java4lang6StringE
leal -8(%ebp), %esp
popl %ebx
popl %esi
leave
ret
.LCFI37:
.LFE4:
.size _ZN13FinalVariable4mainEP6JArrayIPN4java4lang6StringEE, .-_ZN13FinalVariable4mainEP6JArrayIPN4java4lang6StringEE
.section .rodata.jutf8.10,"aM",@progbits,10
.align 2
.type _Utf1, @object
.size _Utf1, 4
_Utf1:
.value 1465
.value 4
.ascii "main"
.zero 1
.section .rodata.jutf8.28,"aM",@progbits,28
.align 2
.type _Utf2, @object
.size _Utf2, 4
_Utf2:
.value 59434
.value 22
.ascii "([Ljava.lang.String V"
.zero 1
.section .rodata.jutf8.10
.align 2
.type _Utf3, @object
.size _Utf3, 4
_Utf3:
.value 17554
.value 4
.ascii "test"
.zero 1
.section .rodata.jutf8.26,"aM",@progbits,26
.align 2
.type _Utf4, @object
.size _Utf4, 4
_Utf4:
.value 54943
.value 21
.ascii "(Ljava.lang.String V"
.zero 1
.section .rodata.jutf8.12,"aM",@progbits,12
.align 2
.type _Utf5, @object
.size _Utf5, 4
_Utf5:
.value 626
.value 6
.ascii "<init>"
.zero 1
.section .rodata.jutf8.8,"aM",@progbits,8
.align 2
.type _Utf6, @object
.size _Utf6, 4
_Utf6:
.value 39797
.value 3
.ascii "()V"
.zero 1
.data
.align 32
.type _MT_FinalVariable, @object
.size _MT_FinalVariable, 60
_MT_FinalVariable:
.long _Utf1
.long _Utf2
.value 16393
.value -1
.long _ZN13FinalVariable4mainEP6JArrayIPN4java4lang6StringEE
.long 0
.long _Utf3
.long _Utf4
.value 16393
.value -1
.long _ZN13FinalVariable4testEPN4java4lang6StringE
.long 0
.long _Utf5
.long _Utf6
.value 16385
.value -1
.long _ZN13FinalVariableC1Ev
.long 0
.globl _ZTVN13FinalVariableE
.align 32
.type _ZTVN13FinalVariableE, @object
.size _ZTVN13FinalVariableE, 36
_ZTVN13FinalVariableE:
.long 0
.long 0
.long _ZN13FinalVariable6class$E
.long 4
.long _ZN4java4lang6Object8finalizeEv
.long _ZN4java4lang6Object8hashCodeEv
.long _ZN4java4lang6Object6equalsEPS1_
.long _ZN4java4lang6Object8toStringEv
.long _ZN4java4lang6Object5cloneEv
.section .rodata.jutf8.6,"aM",@progbits,6
.align 2
.type _Utf7, @object
.size _Utf7, 4
_Utf7:
.value 0
.value 0
.zero 1
.data
.align 4
.type _CD_FinalVariable, @object
.size _CD_FinalVariable, 8
_CD_FinalVariable:
.long 0
.long _Utf7
.type _CT_FinalVariable, @object
.size _CT_FinalVariable, 2
_CT_FinalVariable:
.byte 0
.byte 8
.align 4
.type _catch_classes_FinalVariable, @object
.size _catch_classes_FinalVariable, 24
_catch_classes_FinalVariable:
.long 0
.long 0
.long 0
.long 0
.zero 8
.section .rodata.jutf8.18,"aM",@progbits,18
.align 2
.type _Utf8, @object
.size _Utf8, 4
_Utf8:
.value 20978
.value 13
.ascii "FinalVariable"
.zero 1
.globl _ZN13FinalVariable6class$E
.data
.align 32
.type _ZN13FinalVariable6class$E, @object
.size _ZN13FinalVariable6class$E, 120
_ZN13FinalVariable6class$E:
.long _ZTVN4java4lang5ClassE+8
.long 0
.long _Utf8
.value 1
.zero 2
.long _ZN4java4lang6Object6class$E
.long 2
.long _CT_FinalVariable
.long _CD_FinalVariable
.long _MT_FinalVariable
.value 3
.value 5
.long 0
.long 4
.value 0
.value 0
.long _ZTVN13FinalVariableE+8
.long 0
.long 0
.long 0
.long 0
.long _catch_classes_FinalVariable
.long 0
.long 0
.value 0
.byte 0
.zero 1
.long 0
.value 0
.zero 2
.long 0
.long 0
.long 0
.long 0
.long 0
.long 0
.section .jcr,"aw",@progbits
.align 4
.long _ZN13FinalVariable6class$E
.section .eh_frame,"a",@progbits
.Lframe1:
.long .LECIE1-.LSCIE1
.LSCIE1:
.long 0x0
.byte 0x1
.string "zP"
.uleb128 0x1
.sleb128 -4
.byte 0x8
.uleb128 0x5
.byte 0x0
.long __gcj_personality_v0
.byte 0xc
.uleb128 0x4
.uleb128 0x4
.byte 0x88
.uleb128 0x1
.align 4
.LECIE1:
.LSFDE1:
.long .LEFDE1-.LASFDE1
.LASFDE1:
.long .LASFDE1-.Lframe1
.long .LFB2
.long .LFE2-.LFB2
.uleb128 0x0
.byte 0x4
.long .LCFI0-.LFB2
.byte 0xe
.uleb128 0x8
.byte 0x85
.uleb128 0x2
.byte 0x4
.long .LCFI1-.LCFI0
.byte 0xd
.uleb128 0x5
.byte 0x4
.long .LCFI3-.LCFI1
.byte 0x2e
.uleb128 0x4
.byte 0x4
.long .LCFI4-.LCFI3
.byte 0x2e
.uleb128 0x0
.align 4
.LEFDE1:
.LSFDE3:
.long .LEFDE3-.LASFDE3
.LASFDE3:
.long .LASFDE3-.Lframe1
.long .LFB3
.long .LFE3-.LFB3
.uleb128 0x0
.byte 0x4
.long .LCFI5-.LFB3
.byte 0xe
.uleb128 0x8
.byte 0x85
.uleb128 0x2
.byte 0x4
.long .LCFI6-.LCFI5
.byte 0xd
.uleb128 0x5
.byte 0x4
.long .LCFI8-.LCFI6
.byte 0x83
.uleb128 0x3
.byte 0x4
.long .LCFI9-.LCFI8
.byte 0x2e
.uleb128 0x4
.byte 0x4
.long .LCFI10-.LCFI9
.byte 0x2e
.uleb128 0x0
.byte 0x4
.long .LCFI11-.LCFI10
.byte 0x2e
.uleb128 0x8
.byte 0x4
.long .LCFI12-.LCFI11
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI13-.LCFI12
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI14-.LCFI13
.byte 0x2e
.uleb128 0x0
.align 4
.LEFDE3:
.LSFDE5:
.long .LEFDE5-.LASFDE5
.LASFDE5:
.long .LASFDE5-.Lframe1
.long .LFB4
.long .LFE4-.LFB4
.uleb128 0x0
.byte 0x4
.long .LCFI15-.LFB4
.byte 0xe
.uleb128 0x8
.byte 0x85
.uleb128 0x2
.byte 0x4
.long .LCFI16-.LCFI15
.byte 0xd
.uleb128 0x5
.byte 0x4
.long .LCFI19-.LCFI16
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI20-.LCFI19
.byte 0x2e
.uleb128 0x10
.byte 0x83
.uleb128 0x4
.byte 0x86
.uleb128 0x3
.byte 0x4
.long .LCFI21-.LCFI20
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI22-.LCFI21
.byte 0x2e
.uleb128 0x8
.byte 0x4
.long .LCFI23-.LCFI22
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI24-.LCFI23
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI25-.LCFI24
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI26-.LCFI25
.byte 0x2e
.uleb128 0x8
.byte 0x4
.long .LCFI27-.LCFI26
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI28-.LCFI27
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI29-.LCFI28
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI30-.LCFI29
.byte 0x2e
.uleb128 0x8
.byte 0x4
.long .LCFI31-.LCFI30
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI32-.LCFI31
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI33-.LCFI32
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI34-.LCFI33
.byte 0x2e
.uleb128 0x8
.byte 0x4
.long .LCFI35-.LCFI34
.byte 0x2e
.uleb128 0xc
.byte 0x4
.long .LCFI36-.LCFI35
.byte 0x2e
.uleb128 0x10
.byte 0x4
.long .LCFI37-.LCFI36
.byte 0x2e
.uleb128 0x0
.align 4
.LEFDE5:
.section .note.GNU-stack,"",@progbits
.ident "GCC: (GNU) 3.4.6 20060404 (Red Hat 3.4.6-3)"
[/php]
可以看到,还是有不小的区别的。 |
|