demo:PassObject.java
package javabase.flowcontrol;
class Letter{ char c; } public class PassObject { /** *对象引用 */ static void f(Letter y){ y.c = 'z'; } public static void main(String[] args) { Letter x = new Letter(); x.c = 'a'; System.out.println("before:x.c = " + x.c); f(x); System.out.println("after:x.c = " + x.c); } } /*输出结果: before:x.c = a after:x.c = z */ |
此类对于传递对象引用而引起的问题在Think In Java被称做”别名问题”
使用中应注意此类陷阱
++或--:前缀++/--先运算再生成值,后缀++/--先生成值再运算
==与equals:
比较2个实际值是否相等:对象用equals,基本数据类型用==
比较对象的地址是否相等:对象/基本数据类型都用==
demo:EqualsTest.java
package javabase.flowcontrol;
class ValueInt{ int id; } class ValueString{ String id; @Override public boolean equals(Object obj) { boolean instanceFlag; instanceFlag = obj instanceof ValueString; if(!instanceFlag) return super.equals(obj); else{ ValueString vTemp = (ValueString)obj; if(vTemp.id.equals(this.id)){ return true; } return false; } } } public class EqualsTest { /** * ==操作符、equals的区别 */ public static void main(String[] args) { //基本数据类型 int i1 = 100; int i2 = 100; System.out.println("i1 == i2 : " + (i1 == i2)); //对象 Integer n1 = new Integer(250); Integer n2 = new Integer(250); System.out.println("n1 == n2 : " + (n1 == n2)); System.out.println("n1 equals n2 : " + n1.equals(n2)); //自定义对象 ValueInt vInt1 = new ValueInt(); ValueInt vInt2 = new ValueInt(); vInt1.id = vInt2.id = 32; System.out.println("vInt1 == vInt2 : " + (vInt1 == vInt2)); System.out.println("vInt1 equals vInt2 : " + vInt1.equals(vInt2)); ValueString vString1 = new ValueString(); ValueString vString2 = new ValueString(); vString1.id = vString2.id = "李艺辉"; System.out.println("vString1 == vString2 : " + (vString1 == vString2)); System.out.println("vString1 equals vString2 : " + vString1.equals(vString2)); //String 对象比较复杂,后面会有String对象的详细解析 } } /*输出结果: i1 == i2 : true n1 == n2 : false n1 equals n2 : true vInt1 == vInt2 : false vInt1 equals vInt2 : false //这是因为equals默认行为是比较2个对象的引用 vString1 == vString2 : false vString1 equals vString2 : true //复写该对象的equals方法后的比较 */ |
逻辑操作符:&&、||、!
逻辑操作只可以应用于布尔值,注意逻辑操作的”短路”情况
test(1) && test(2) && test(3) //顺序判断,只要前面有一个test为假后面的判断就不需要执行了
test(1) || test(2) || test(3) //顺序判断,只要前面有一个test为真后面的判断就不需要执行了
按位操作符:位与(&)、位或(|)、位非(~)、
有符号位左移(<<):低位补0
有符号位右移(>>):若符号为正则高位补0,若符号为负则高位补1
无符号位左移(<<<):无论正负低位全部补0
无符号位右移(>>>):无论正负高位全部补0
如果对char、byte、short类型数值进行移位处理,那么在移位之前它们都将先被转换为int类型,
并且得到的结果也是int类型,且移位后的数值结果只有低5位才有用(int类型为2的5次方)