2012-01-06 60 views
2

对相同类型执行显式转换是否会影响性能,或者它们是否被编译器过滤并且不会达到字节码?显式转换为相同类型

实施例:

int x = 3; 
int y = (int) x; 
+0

为什么你需要这样做? – 2012-01-06 09:23:52

+0

@HarryJoy我只是想知道编译器在这种奇怪的情况下的行为,因为它甚至不会产生警告。 – Acidic 2012-01-06 09:26:49

+0

我真的写过对话吗?哈哈!感谢编辑。 – Acidic 2012-01-06 09:30:28

回答

3

运行的javap -c这个类:

public class SameTypeCastsDemo { 

    public static void withoutCasts() { 
     int x = 2; 
     int y = x; 
     System.out.println(y); 
    } 

    public static void withCast() { 
     int x = 2; 
     int y = (int) x; 
     System.out.println(y); 
    } 

} 

表明字节码看起来相同:

public static void withoutCasts(); 
    Code: 
    0: iconst_2 
    1: istore_0 
    2: iload_0 
    3: istore_1 
    4: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 
    7: iload_1 
    8: invokevirtual #3; //Method java/io/PrintStream.println:(I)V 
    11: return 

public static void withCast(); 
    Code: 
    0: iconst_2 
    1: istore_0 
    2: iload_0 
    3: istore_1 
    4: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 
    7: iload_1 
    8: invokevirtual #3; //Method java/io/PrintStream.println:(I)V 
    11: return 

更新:与非基本对象的引用:

public class SameTypeCastsDemo { 
    Integer x; 
    Integer y; 

    public SameTypeCastsDemo(Integer x, Integer y) { 
     this.x = x; 
     this.y = y; 
    } 

    public void print() { 
     System.out.println(y); 
    } 

    public static void withoutCasts() { 
     SameTypeCastsDemo x = new SameTypeCastsDemo(2, 3); 
     SameTypeCastsDemo y = x; 
     y.print(); 
    } 

    public static void withCast() { 
     SameTypeCastsDemo x = new SameTypeCastsDemo(2, 3); 
     SameTypeCastsDemo y = (SameTypeCastsDemo) x; 
     y.print(); 
    } 

} 

javap -c SameTypeCastsDemo:

public static void withoutCasts(); 
    Code: 
    0: new #6; //class SameTypeCastsDemo 
    3: dup 
    4: iconst_2 
    5: invokestatic #7; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 
    8: iconst_3 
    9: invokestatic #7; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 
    12: invokespecial #8; //Method "<init>":(Ljava/lang/Integer;Ljava/lang/Integer;)V 
    15: astore_0 
    16: aload_0 
    17: astore_1 
    18: aload_1 
    19: invokevirtual #9; //Method print:()V 
    22: return 

public static void withCast(); 
    Code: 
    0: new #6; //class SameTypeCastsDemo 
    3: dup 
    4: iconst_2 
    5: invokestatic #7; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 
    8: iconst_3 
    9: invokestatic #7; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 
    12: invokespecial #8; //Method "<init>":(Ljava/lang/Integer;Ljava/lang/Integer;)V 
    15: astore_0 
    16: aload_0 
    17: astore_1 
    18: aload_1 
    19: invokevirtual #9; //Method print:()V 
    22: return 
+0

我可以认为这也适用于对象引用? – Acidic 2012-01-06 09:34:25

1

太阳称之为identity conversion.

从链路--quote -

从类型到同样类型A转换允许用于任何类型。

这看起来很平凡,但它有两个实际的结果。首先, 总是允许表达式具有以 开头的期望类型,从而允许简单规定的规则,即每个表达式 都可以进行转换(如果仅进行简单的标识转换)。其次,这意味着为了清晰起见,允许程序包括冗余演员操作员。

相关问题