关于primitive类型的赋值问题,还有以下两个需要注意的问题: 这段代码 byte b = 1; short s = b; 不会出错。因为,byte为8 bits, 而short为16 bits,将byte类型的数值赋予给short类型的变量不会引起数值精度问题。但是 short s = 1; byte b = s; 则不能正确编译。因为这样赋值可能导致s所含数值的高8 bit被舍弃,因而数值不正确。这样需要我们在写程序的时候指定 byte b = (byte)s;以便通知编译器,"嘿, 如果有精度的损失,那是我自愿的,你不必担心!"这样编译就不会出错了。同样的, short s = 1; byte b = 1; b = b + s; 不能正确编译。需要我们在写程序的时候指定 b = (byte)(b + s); 这些错误很多人现在都会避免了。但是这样子的代码是否会编译错误呢? short s = 1; byte b = 1; b += s; 照以上的解释,你一定认为这段代码不能正确编译。但是如果你实际编译一下则会发现,它编译通过了!为什么呢?这是因为, +=, -=, *=, /=, %=这类操作符号比较特殊,对于编译器来说,他们相当于 b += s; -------> b = (byte)(b + s);
hehe . 狗咬人士正常的,人咬狗就是反常。玩笑!
因为你是从animal 到 dog 是向下转型
Animal a= new ("anim"); // error Animal a= new Animal("anim");
只能向上转换,不能向下转换,不过对象可以上溯造型,下溯造型 1. Dog d = new Dog("dog"); Animal a = d; //可以,上溯造型 等同于: Animal a = new Dog("dog");2. Animal a = new Animal("anim"); Dog d = (Dog)a; //不可以3. Animal a = new Dog("dog"); Dog d = (Dog)a; //可以
Animal a= new Dog("anim");
这段代码
byte b = 1;
short s = b;
不会出错。因为,byte为8 bits, 而short为16 bits,将byte类型的数值赋予给short类型的变量不会引起数值精度问题。但是
short s = 1;
byte b = s;
则不能正确编译。因为这样赋值可能导致s所含数值的高8 bit被舍弃,因而数值不正确。这样需要我们在写程序的时候指定
byte b = (byte)s;以便通知编译器,"嘿, 如果有精度的损失,那是我自愿的,你不必担心!"这样编译就不会出错了。同样的,
short s = 1;
byte b = 1;
b = b + s;
不能正确编译。需要我们在写程序的时候指定
b = (byte)(b + s);
这些错误很多人现在都会避免了。但是这样子的代码是否会编译错误呢?
short s = 1;
byte b = 1;
b += s;
照以上的解释,你一定认为这段代码不能正确编译。但是如果你实际编译一下则会发现,它编译通过了!为什么呢?这是因为, +=, -=, *=, /=, %=这类操作符号比较特殊,对于编译器来说,他们相当于
b += s; -------> b = (byte)(b + s);
是向下转型
Animal a= new Animal("anim");
1. Dog d = new Dog("dog");
Animal a = d; //可以,上溯造型
等同于: Animal a = new Dog("dog");2. Animal a = new Animal("anim");
Dog d = (Dog)a; //不可以3. Animal a = new Dog("dog");
Dog d = (Dog)a; //可以