前言
读了Thinking in Java 第三章操作符,自己总结了一些自己感觉重要的一些问题。
一、在最底层,Java中的数据是通过使用操作符来操作的!
二、问题
1.赋值
(1)对基本数据类型赋值是简单的。
基本数据类型存放了实际的数据,而并非是一个对象的引用。
(2)对对象赋值的时候存在问题
如果我们将一个对象赋值给另一个对象,实际上复制的是对象的引用。我们改变一个对象的字段,另一个对象的相应字段也会被改变。
class Student {
public int num;
public int age;
public Student() {
}
public Student(int num, int age) {
this.num = num;
this.age = age;
}
public void show() {
System.out.println("num:" + this.num + "age:" + this.age);
}
}
public class CopyStu {
public static void main(String[] args) {
Student s1=new Student(12,13);
Student s2=s1;
s1.show();//起初s1的字段的值: num:12age:13
s2.age=14;//改变s2的age
s1.show();//s1的字段:num:12age:14 s1的age也随着改变
}
}
2.关系操作符
(1) ==和!=比较的是对象的引用,尽管对象的内容相同,也是false。
基本数据类型直接使用就行。
public class Text1 {
public static void main(String[] args) {
Integer i1 = new Integer(47);
Integer i2 = new Integer(47);
System.out.println(i1 == i2);//false
System.out.println(i1 != i2);//true
}
}
(2)equals()方法 比较的是两个对象的实际内容是否相同,
public class Text1 {
public static void main(String[] args) {
Integer i1 = new Integer(47);
Integer i2 = new Integer(47);
System.out.println(i1.equals(i2));//true
}
}
3.逻辑操作符
(1) 短路现象
一旦确定整个表达式的值,就不会计算剩余表达式的部分。例如:if(true||表达式1||2||3||...)和if(false&&表达式1&&2&&3&&...)
public class Test
{
public static void main(String[] args)
{
int x = 0;
int y = 0;
int k = 0;
for (int z = 0; z < 5; z++) {
if ((++x > 2) && (++y > 2) && (k++ > 2))
{
x++;
++y;
k++;
}
}
System.out.println(x + ”” +y + ”” +k);
}
}
z=0时候,执行++x > 2,不成立,&&后面就不执行了,此时 x=1,y=0,k=0;
z=1时候,执行++x > 2,还不成立 ,&&后面就不执行了,此时 x=2,y=0,k=0;
z=2时候, 执行++x > 2,成立,继续执行 ++y > 2, 不成立 , &&后面就不执行了, 此时 x=3,y=1,k=0;
z=3时候,执行++x > 2,成立,继续执行++y > 2,不成立 , &&后面就不执行了, 此时 x=4,y=2,k=0;
z=4 时候,执行++x > 2,成立,继续执行 ++y > 2, 成立 , 继续执行k++>2 ,不成立,此时仍没有进入for循环的语句中, 但此时 x=5,y=3,k=1;
z=5时候,不满足条件了,整个循环结束,所以最好打印时候: x=5,y=3,k=1。
4.类型转换操作符
(1)窄化转换
将能容纳更多信息的数据类型转化成无法容纳那么多的数据类型,这里有着信息丢失的危险,我们需要进行强制类型转换(显性类型 转换)。
(2)扩展转换
与窄化转换相反,不会造成信息丢失,不必进行显性转换。
public class Text1 {
public static void main(String[] args) {
int a=128;
byte b=(byte) a;//窄化转换,显性
System.out.println(b);//输出-128 因为byte范围是-128到127
float c=a;//扩展转换 非显性
System.out.println(c);//输出128.0
}
}
(3)截尾和舍入
进行窄化转换时考虑截尾和舍入问题
double和float类型转换为int类型时候对该数据进行截尾,如果想得到舍入的结果需要调用java.lang.Math中的round()方法
public class Text1 {
public static void main(String[] args) {
double above=0.5,below=0.4;
float fabove=0.5f,fbelow=0.4f;
System.out.println(Math.round(above));//1
System.out.println(Math.round(below));//0
System.out.println(Math.round(fabove));//1
System.out.println(Math.round(fbelow));//0
}
}
(4)提升
通常,表达式中出现的最大的数据类型决定了表达式最终结果的数据类型。
例如:float类型和double类型相乘结果就是double;
int和long相加结果就是long类型。
总结
继续加油