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()来获取数据分配的字节数,因为所有的数据类型在所有机器中的大小都是相同的。我们不必考虑移植问题——它已经被设计在语言中了。


代码书写世界,吉他演奏生活