Java基础注意点、易错点
一、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(数组元素的值为引用类型)复制过程
解释:
复制的过程就是将原数组中每个元素的值复制到新数组中,但此时复制得到的是引用对象的地址值,所以有得到新数组元素依然指向原来的对象。