Java 编程思想第三章
Java 操作符:
注意:几乎所有操作符都只能操作“基本类型”。例外的操作符是“=”、“==”和“!=”,这些操作符能操作所有对象。除此以外,String 类支持“+”和“+=”。
关于赋值的坑:
对基本数据类型的赋值很简单,基本类型存储了实际的数值,而并非指向一个对象的引用,所以在为其赋值的时候,是直接将一个地方的内容复制到了另一个地方。例如:基本数据类型的 a=b,就是把 b 的内容复制给 a。如果紧接着我们修改了 a,b 是不会受影响的。
但是,在对对象赋值的时候就不一样了,对一个对象进行操作时,我们真正操作的是对对象的引用。所以如果将“一个对象赋值给另一个对象”,实际是将“引用”从一个地方复制到另一个地方。例如,如果对对象 c 和对象 d 使用 c=d,那么 c 和 d 都指向原本只有 d 指向的那个对象。这时我们如果再改变 c 中的字段值,那么 d 中的字段值也将改变。
代码示例:
//对对象赋值时应注意的坑
package Unity3;
class Tank {
int level;
}
public class Assignment {
public static void main(String[] args) {
// TODO Auto-generated method stub
Tank t1=new Tank();
Tank t2=new Tank();
t1.level=9;
t2.level=47;
System.out.println("1:t1.level:"+t1.level+",t2.level:"+t2.level);
t1=t2;
System.out.println("2:t1.level:"+t1.level+",t2.level:"+t2.level);
t1.level=27;
System.out.println("3:t1.level:"+t1.level+",t2.level:"+t2.level);
}
}
运行结果:
1:t1.level:9,t2.level:47
2:t1.level:47,t2.level:47
3:t1.level:27,t2.level:27
对对象赋值,操作的是引用,其实和基本类型的赋值相似,都是复制,只不过基本类型赋值时是复制内容,即 a=b 是将 b 的内容复制给 a;而对象赋值时是复制引用,t1=t2 是将 t2 这个引用复制给 t1,所以现在 t1 和 t2 指向同一个对象,所以对 t1 进行操作,t2 也会改变。而 t1 之前指向的对象在执行 t1=t2 时被覆盖,就是丢失了,这些不会再被引用的对象会由“垃圾回收器”自动清理。
关系操作符
package Test;
public class dengJiaXing {
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer n1=new Integer(47);
Integer n2=new Integer(47);
System.out.println(n1==n2);
System.out.println(n1!=n2);
}
}
输出结果:
false
true
注意:
尽管对象 n1 和对象 n2 内容相同,但对象的引用却是不同的,而==和!=比较的就是对象的引用。所以输出结果先是 false,再是 true。
如果想比较两个对象的实际内容是否相同,必须使用所有对象都适用的特殊方法 equals(),但这个方法不适用于基本类型,基本类型直接使用==和!=即可。
但是!!!如果创建了自己的类,再用 equals()比较两个对象的话,,,
package Test;
public class dengJiaXing {
public static void main(String[] args) {
// TODO Auto-generated method stub
Value v1=new Value();
Value v2=new Value();
System.out.println(v1.equals(v2));
}
}
class Value{
int i;
}
输出结果:
false
这是因为,equals()的默认行为还是比较引用。也就是说,默认的 equals(),和==一样都是比较引用。所以,在自己写的类中,除非覆盖了 equals 方法,否则它不会比较内容。但我们比较内容的时候还是会使用 equals(),这是因为大多数 Java 类库都实现了 equals()方法,以便来比较对象内容。
逻辑操作符
短路:
比如:test1(0)&&test2(0)&&test3(0);
如果 test1(0)或 test2(0)为 false,那么程序将不会继续执行 test3(0)。
Random 随机数生成器
Random random=new Random(47);//47为随机数种子
int x=random.nextInt(100);//100为产生的随机数上限
这是随机产生 0 到 100 的数赋给 x,第一行中的 47 称为随机数种子,如果不提供这个参数,那么 Java 就会将当前时间作为随机数生成器的种子,这样程序每次执行都会产生不同的随机数;但如果我们提供了参数给 Random(),那么我们提供的这个参数就会称为种子,随机数是种子经过计算生成的,所以,随机数生成器对于特定的种子(也就是指定相同的参数,例如 47)总是产生相同的随机数序列。
注意:random.nextInt()若不提供参数,则返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int
值(没有了上下限)。
Random 代码演示:
package Test;
import java.util.Random;
public class randomTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Random有参数,nextInt有参数:");
for(int i=0;i<5;i++) {
Random random=new Random(47);
for(int j=0;j<5;j++) {
int x=random.nextInt(100);
System.out.print(x+" ");
}
System.out.println();
}
System.out.println("Random无参数,nextInt有参数:");
for(int i=0;i<5;i++) {
Random random=new Random();
for(int j=0;j<5;j++) {
int x=random.nextInt(100);
System.out.print(x+" ");
}
System.out.println();
}
System.out.println("Random有参数,nextInt无参数:");
for(int i=0;i<5;i++) {
Random random=new Random(47);
for(int j=0;j<5;j++) {
int x=random.nextInt();
System.out.print(x+" ");
}
System.out.println();
}
System.out.println("Random无参数,nextInt无参数:");
for(int i=0;i<5;i++) {
Random random=new Random();
for(int j=0;j<5;j++) {
int x=random.nextInt();
System.out.print(x+" ");
}
System.out.println();
}
}
}
输出结果:
Random 有参数,nextInt 有参数:
58 55 93 61 61
58 55 93 61 61
58 55 93 61 61
58 55 93 61 61
58 55 93 61 61
Random 无参数,nextInt 有参数:
79 3 92 13 44
48 9 26 70 77
41 96 76 42 42
3 20 16 24 73
41 75 95 38 41
Random 有参数,nextInt 无参数:
-1172028779 1717241110 -2014573909 229403722 688081923
-1172028779 1717241110 -2014573909 229403722 688081923
-1172028779 1717241110 -2014573909 229403722 688081923
-1172028779 1717241110 -2014573909 229403722 688081923
-1172028779 1717241110 -2014573909 229403722 688081923
Random 无参数,nextInt 无参数:
-550073410 -1342601947 -1853558256 -1018749599 -1448924627
292165710 2131636137 1466246140 -477954433 1548214475
1820380166 -198488431 -1747352699 1556494529 1751189178
-940072479 1840899878 -2076749813 231761793 -54476412
-376365477 -2013226106 1611246644 -1391678938 -1700623111
nextInt()无参数简直惨不忍睹...
通过 Random 类的对象,程序可以生成许多不同类型的随机数字,只需调用方法 nextInt()、nextFloat()即可(也可调用 nextLong()或者 nextDouble())。传递给 nextInt()的参数设置了所产生的随机数的上限,而其下限为 0,若不提供参数,,,看事态不提供好像不太好。
自动递增和递减
**对于前缀递增和前缀递减(如 ++a 或--a),会先执行运算,再生成值。而对于后缀递增和后缀递减(如 a++ 或 a--),会先生成值,再执行运算。
###类型转换
Java 允许我们把任何基本数据类型转换成别的基本数据类型,但布尔型除外,后者根本不允许进行任何类型的转换处理。“类”数据类型不允许进行类型转换
####截尾和舍入
float 或 double 转型为整数时,总是对该数字进行截尾。如果想要得到舍入的结果,就需要使用 java.lang.Math 中的 round()方法。
###Java 中没有 sizeof
Java 不需要 sizeof()来获取数据分配的字节数,因为所有的数据类型在所有机器中的大小都是相同的。我们不必考虑移植问题——它已经被设计在语言中了。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于