数据转换java

时间:2009-10-21 18:15:34

标签: java

char c='c';
int i=10;
double d =50;
long l=30;
String s="Goodbye";

这些声明是否有效?

s+=i;
i+=s;
c+=s;
c=c+i;

有人可以解释转换数据类型的逻辑

5 个答案:

答案 0 :(得分:3)

你为什么不尝试一下:

bash-3.2$ cat ConveraionTest.java 
    public class ConvertsonTest {
        public static void main( String [] args ) {
            char c='c';
            int i=10;
            double d =50;
            long l=30;
            String s="Goodbye";

            //Are these statement valid?

            s+=i;
            i+=s;
            c+=s;
            c=c+i;
        }
    }
bash-3.2$ javac ConversionTest.java 
ConversionTest.java:12: incompatible types
found   : int
required: java.lang.String
            i+=s;
            ^
ConversionTest.java:13: incompatible types
found   : char
required: java.lang.String
            c+=s;
            ^
ConversionTest.java:14: possible loss of precision
found   : int
required: char
            c=c+i;
               ^
3 errors

修改

历史悠久

基本上,java中的所有类型都有一个“形状”,如果你想这样调用它(好吧我会这样称呼它)

对于基元数据类型(boolean,byte,short,char,int,float,long,double),“shape”是它使用的字节大小(或以位为单位,此处为1) byte = 8位):

boolean = true or false  
byte = 8 bits
short = 16 bits
char = 16 bits
int = 32 bits
float = 32 bits
long = 64 bits
double = 64 bits

对象的“形状”因其类别而异。

所以,基本上你可以为任何东西分配任何东西,只要它们适合“形状”

因此,您可以将int分配给long(您可以将32位适合64位),短(16)分配到int(32)等。

你不能做的是分配一些不适合形状的东西。

所以

ConversionTest.java:12: incompatible types
found   : int
required: java.lang.String
            i+=s;
            ^

您无法将String分配到int。你好吗?内容在哪里?它们不是“形状”,也不是兼容的。“

Stringchar

相同
ConversionTest.java:13: incompatible types
found   : char
required: java.lang.String
            c+=s;
            ^

现在,您可以将一个int(32位)分配给char(16位)或短(16位)。问题是,如果该值保持>超过16位(例如131 071)

您将丢失不适合16位的位。这就是你得到这个错误的原因:

ConversionTest.java:14: possible loss of precision
found   : int
required: char
            c=c+i;

但是,如果您确定它适合(例如int i = 65;当然适合16位),您可以强制它,如下所示:

 int i = 65;
 char c = ( char ) i;

按照你告诉编译器的方式进行转换:

嘿,我是这里的程序员,我知道我在做什么

答案 1 :(得分:2)

是,否,否,否(除非您明确执行类型转换)。如果您要编写一个简单的main方法,编译它并执行它,您可能已经看到了 - 这些问题应该由编译器识别。

page on Java primitive data types解释得非常好。

答案 2 :(得分:1)

char c='c';
int i=10;
double d =50;
long l=30;
String s="Goodbye";

s+=i; // legal :)
i+=s; // not legal :( The operator += is undefined for the argument types int, String
c+=s; // not legal :( The operator += is undefined for the argument types char, String
c=c+i; // not legal :( Type Mismatch: cannot convert from int to char

complete explanation of Java data type conversions很长很详细。

答案 3 :(得分:1)

转化有两种类型:扩大转化次数和缩小转化次数。允许扩展转换,Java将为您处理,但不允许缩小转换。扩展转换意味着您将“较小”值(如int(32位))转换为“较大”值(如long(62位))。缩小转换的方式必须明确地进行。

 s+=i;

将要求将int转换为允许的String。

i+=s;

将要求将String转换为不允许的int。 + =运算符将转换为

i = i + s;

和i + s将返回一个无法分配给int的字符串。

c+=s;

由于c + s返回您尝试分配给char的String,因此不允许这样做。

c=c+i;

也会产生错误,因为c + i将导致int(32位)并将其分配给char(16位)可能会导致精度损失。

您尝试的每个操作实际上都是可能的,但您必须明确告诉Java您要执行它们并接受后果。已经说过,混合型操作在完全纯粹的硬鼻编程领域中是不受欢迎的,因为存在可能导致问题的边缘情况。

答案 4 :(得分:0)

s + =我将连接s和字符串“10”,这等于s + =((整数)i).toString();

i + = s不认为这会起作用,类型不兼容

c + = s也不应该编译,相同,不兼容的类型。

c = c + i应该在c的ascii值中加10,c将变为'c'=>之后的第10个字母我想,我猜

EDIT。所以在最后一种情况下,你必须将i转换为char以使其编译。