Java编程思想读书笔记–第三、四章笔记(操作符,流程控制)
- String和+操作符以及在输出语句中的转换
- 对象引用的赋值
- 随机数Random类
- Equals方法入门
- 短路原则
- 字符串的打印和有趣的地方
- 类型转换
- 截尾和舍入
- Java没有sizeof()
- 逗号运算符
String和+操作符以及在输出语句中的转换
对象引用的赋值
看下面例子:
/**
* 对象引用的赋值问题
* 可以想象成两根线连着一个气球
*/
public class Code_01_QuoteAssignment {
private static class Tank{
public int level;
}
public static void main(String[] args) {
Tank t1 = new Tank();
Tank t2 = new Tank();
t1.level = 9;
t2.level = 47;
System.out.println("t1 : " + t1.level );
System.out.println("t2 : " + t2.level );
System.out.println("-------------");
t1 = t2;
System.out.println("t1 : " + t1.level );
System.out.println("t2 : " + t2.level );
System.out.println("-------------");
t1.level = 27;
System.out.println("t1 : " + t1.level );
System.out.println("t2 : " + t2.level );
System.out.println("-------------");
}
}
输出效果
下面的也是产生类似的问题:
public class Code_02_QuoteAssignment2 {
private static class Letter{
public char c;
}
public static void f(Letter letter){
letter.c = 'z';
}
public static void main(String[] args) {
Letter letter = new Letter();
letter.c = 'a';
System.out.println("1 : letter.c = " + letter.c);
f(letter);
System.out.println("2 : letter.c = " + letter.c);
}
}
输出:
1 : letter.c = a
2 : letter.c = z
但是要注意下面的输出,如果一个引用又指向了别的,就没关系了:
StringBuilder str1 = new StringBuilder("2");
StringBuilder str2 = new StringBuilder("3");
StringBuilder str3 = str1;
str1.append("2");
System.out.println(str3);
str1 = str2; //牵了别的气球
System.out.println(str1);
System.out.println(str3);
输出
22
3
22
更多内容可以看下这篇博客
随机数Random类
Equals方法入门
public class Code_03_EqualsTest {
private static class Value{
public int i;
}
public static void main(String[] args) {
Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i = 100;
System.out.println(v1.equals(v2));//false
}
}
短路原则
这个可以在判断数组越界的时候,把判断是否越界放在第一个条件。
/**
* 测试短路原则
*/
public class Code_04_ShortCircuit {
public static boolean test1(int val){
System.out.println("test1");
return val < 1;
}
public static boolean test2(int val){
System.out.println("test2");
return val < 2;
}
public static boolean test3(int val){
System.out.println("test3");
return val < 3;
}
public static void main(String[] args) {
boolean bool = test1(0) && test2(2) && test3(2);
System.out.println("hello! ");
}
}
输出:
test1
test2
hello!
字符串的打印和有趣的地方
/**
* 字符串和输出要注意的地方
*/
public class Code_07_StringOperators {
public static void main(String[] args) {
int x = 0, y = 1,z = 2;
System.out.println(" " + x + y + z); //012
System.out.println(x + y + z + " "); //3
System.out.println(" " + (x+y+z)); // 3
System.out.println("" + x); //short than Integer.toString()
}
}
输出:
类型转换
/**
* 类型转换
*/
public class Casting {
public static void main(String[] args) {
int i = 10;
long lng = (long)i; //不是必须的
lng = i; //从低到高
long lng2 = 100;
//从高到低 是必须的
i = (int) lng2; //这个是必须的
}
}
截尾和舍入
在执行窄化转换时,必须注意截尾和舍入的问题,例如,如果将一个浮点值转换成一个整形值,Java会如何处理呢?看下面的代码:
public class CastingNumbers {
public static void main(String[] args) {
double above = 0.7, below = 0.4;
float fabove = 0.7f, fbelow = 0.4f;
System.out.println("(int)above: " + (int)above);
System.out.println("(int)below: " + (int)below);
System.out.println("(int)fabove: " + (int)fabove);
System.out.println("(int)fbelow: " + (int)fbelow);
}
输出:
(int)above: 0
(int)below: 0
(int)fabove: 0
(int)fbelow: 0
根据输出可以得到答案是: 将float或者double转换成整形值时,总是对该数字执行截尾。要想得到舍入的结果,就需要使用java.lang.Math中的round方法。
public class Code_10_RoundingNumbers {
public static void main(String[] args) {
double above = 0.7, below = 0.4;
float fabove = 0.7f, fbelow = 0.4f;
System.out.println("Math.round(above): " + Math.round(above));
System.out.println("Math.round(below): " + Math.round(below));
System.out.println("Math.round(fabove): " + Math.round(fabove));
System.out.println("Math.round(fbelow): " + Math.round(fbelow));
}
}
输出(注意是四舍五入) :
Math.round(above): 1
Math.round(below): 0
Math.round(fabove): 1
Math.round(fbelow): 0
看下面图: