1.别名问题: 赋值符号为“=”。意思为,取“=”右边的值复制给左边。对于基本数据类型来赋值时,是直接将右边的内容复制给左边,只会修改左边的值,而对于右边的值没有影响。但是当为对象进行赋值操作时,实际是将一个“引用”从一个地方复制到另一个地方,如果赋值后修改左边值,右边的值也会修改。
从上面的代码中可以看出,当重新赋值后,t1.level和t2.level相同了,而且引用地址指向了同一个末尾6d69c,那么当我们再次修改t1.level时,也就是对重新赋值后的引用进行操作了,又因为t2同时也指向着这个地址,所以t2.level也会被修改,这个现象就是别名问题。
2。方法调用中的别名问题:当我们调用方法时,使用一个对象当做参数的方法,在方法中对这个对象进行了修改,实际上是对这个对象的引用进行了修改。
3. 一元加号与一元减号,一元减号是负数的意思,一元加号与它对应,但是唯一的作用就是将较小类型的操作数提升为int。
4.自动递增和递减,使用“++”和“--”时,需要注意的是“++”和“--”的位置,用专业点的话来说呢,就是”前缀式“和”后缀式“,“前缀式”会先运算再生成值,“后缀式”会先生成值,再执行运算,也就是说,前后缀代表着先运算还是后运算。
5.关系操作符: > < <= >= == != ;对于== 和 != 试用于所有的基本数据类型,而其他比较符不适用于boolean类型,因为boolean只有true和false,>和<没有实际意义。
== 和 != 也适用于所有对象,但是比较的是对象的引用。
因为Integer是包装类,尽管他们的值一样,但是使用“==”和“!=”时比较的是对象的引用,所以不一样。/**在这里留下一个问题,就是当类中重写了toString方法时,怎么去获取它的引用地址,对于自己定义的类来说,输出变量可以得到它的引用,输出toString也可以得到它的引用*/
这个问题被bug小哥解决掉了,因为Object.toString()方法里面的代码是这样的:
如果要比较对象的实际内容该怎么做呢?用equals()方法。equals()方法默认比较的是对象的引用。
对于上面代码的输出结果,按照默认来说两个应该都是false,但是,Integer重写了equals()方法
Integer.equals()方法比较它们的value值。现在,我们来给我们的Value重写equals()方法试一下。
在重写后,我们equals()方法比较的就是i值了。和Integer类似。
6.指数计数法 ,java中的指数计数法,e代表10的次幂,也就是说 1.01e-2代表0.0101。下面截图记录一下double和float的最大最小指数计数法。
7. 按位操作符,|(或),&(与),~(非),^(异或)
&的操作法则为:当相同位都是1则为1,否则为0;
|的操作法则为:相同位上有一个1.则为1;
~的操作法则为:取反,0为1,1为0;属于一元操作符。
^的操作法则为:相同位上只有一个1,则为1,否则为0;
8.位移运算符。位移运算符操作的对象是二进制的“位”。位移运算符只可用来处理整数类型。左位移操作符(<<)是按照右侧指定的位数将操作符左边的操作数向左移动,在低位补0。“有符号”右移操作符(>>)则按照指定的位数向右移动,然后在高位补0,这里,如果操作数为正,则最高位补0,为负补1。“无符号”右移操作符(>>>)无论正负都在最高位补0。
如果对于char,byte,或者short类型的数值进行位移运算,在位移之前会默认转成int类型,得到的结果也是int类型,且只有数值右端的低5位有用。如果对long类型的数据进行处理,则得到的结果是long类型,此时只会用到低6位。
下面我们通过代码来了解一下
输出结果为:
至于为什么short,byte类型的无符号右移后还是-1呢?是因为对byte,short值进行位移运算时,先转换为int类型再进行右移操作,然后被截断,赋值给原来的类型。也就是说呢,byte在进行运算后截断为8位,还是1111 1111 也还是-1,而-1的二进制 还是32位1.所以输出没有错误。对于最后一个结果来说,没有进行赋值,所以输出仍正确。
9.对于运算时,结果取决于表达式中的最大的数据类型。比如将一个int值和一个long值相加,得到的结果是long类型,如果double类型和float类型相加,得到的结果是double类型。
10. 截尾和舍入。当对float或者double类型转换为整型时,是对该数字进行结尾。如果想要摄入,则采用Math.round()方法。