一、Java基本数据类型的转换,请看题。
请问如下语句是否正确?
byte b = 1000;错误,正确写法为byte b = (byte)1000;
解释:
Java整型数据默认是int类型,所以1000是int类型,当把int类型赋值给byte类型必须类型的强制转换。
byte b = (byte)12;错误,该语句其实编译与运行没有任何错误,只是完全可以将强制类型转省略。正确写法为byte b = 12;
解释:
虽然Java整数类型默认是int类型,但 12 在 byte 类型的范围之内,所以Java虚拟机会给我们进行类型的自动转换,所以我们不需要书写强制类型转换。
注意:
以上的特性适用于 byte、short 、char。
1、2两题的实例图
byte b1 = 10; byte b2 = 12; byte b3 = b1+b2;错误:正确写法byte b3 = (byte)(b1+b2);
解释:
byte、short、char 只要进行变量的运算就会转换为int类型,所以计算所得的结果必定是int类型,所以必须强制类型转换。
注意:
以上特性byte、short、char 都适用。
3题实例图
二、三元运算符中的类型转换
1、请问下列程序输出的结果是
public static void main(String[] args) { int a = 10; double b = 13; System.out.println(b > a ? a : b); }正确答案:10.0
解析:
很多人可能第一时间认为输出结果为10。但这里必须注意,三元运算符是一种运算符,就像加减乘除的运算一样,如果参与运算的数据类型不一致,会进行数据类型的转换,返回的结果也一定是转换后的数据类型。所以这里会将a自动转换为double类型的值,返回的结果必定是double类型的。
三元运算的注意点
三元运算符是一种运算符,所以一定有运算结果参与三元运算的两个变量,数据类型时必须一致或者能够自动转换为同类型数据。程序实例图
三、Arrays工具类中的copyof函数
解释:Arrays工具类中的copyof函数是一个复制数组的函数,用来得到和现有数组一模一样的数组副本。
1、请问下面程序输出的结果?
class User{ private String name; private int age; public User(String name, int age) { super(); this.name = name; this.age = age; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User [name=" + name + ", age=" + age + "]"; } } public class MyTest { public static void main(String[] args) { int[] nums = {1,2,3}; int[] copyNums= Arrays.copyOf(nums, 3); copyNums[0] = 1000; System.out.println(nums[0]); User[] users = new User[2]; users[0] = new User("小明", 20); users[1] = new User("小红", 18); User[] copyUsers = Arrays.copyOf(users, 2); copyUsers[0].setName("小黄"); System.out.println(users[0]); } }正确答案:
1
User [name=小黄, age=20]
解释:
由Java API 可知,Arrays.copyof()将会得到现有数组得到一个副本。
所以对于nums数组来说,copyNums数组只是一个副本,所以修改copyNums数组不会对nums数组有任何影响,所以输出结果为1。
那么为何copyUsers的元素时,导致users数组的元素被修改呢?,请看内存分析图!
1、nums(数组元素为基本类型)复制过程的内存图
解释:
复制的过程就是将原数组中每个元素的值复制到新数组中。
2、users(数组元素的值为引用类型)复制过程
解释:
复制的过程就是将原数组中每个元素的值复制到新数组中,但此时复制得到的是引用对象的地址值,所以有得到新数组元素依然指向原来的对象。