练习一:需要静态导入相关知识
操作符大部分和c++差不多。
1.优先级
先乘除后加减,没说的。
这里有一个字符串的运算+号。如果String类后的+号后跟着一个非String类型,那么会将非String转化为String类型
2.别名问题
常数不能是左值。
对基本类型赋值,存储的就是实际的数值。而对对象赋值操纵的是对象的引用,这一点要注意。
练习二:
class AFloat{
float num;
}
public class Test2 {
public static void main(String[] args) {
AFloat sample1=new AFloat();
AFloat sample2=new AFloat();
sample1.num=42.42f;
sample2.num=42f;
System.out.println(sample1.num);
System.out.println(sample2.num);
sample1=sample2;
System.out.println(sample1.num);
System.out.println(sample2.num);
sample2.num=32.9f;
System.out.println(sample1.num);
System.out.println(sample2.num);
}
}
在方法调用中别名
练习三:
class Num{
float a;
}
public class Test3 {
static void f(Num x) {
x.a=42.0f;
}
public static void main(String[] args) {
Num temp = new Num();
temp.a=10f;
System.out.println(temp.a);
f(temp);
System.out.println(temp.a);
}
}
3.关于操作符
注意的地方:1.整数除法会直接去掉结果的小数位,而不是四舍五入。
书中这里有一个Random类,Random会根据系统当前时间作为随机数生成种子。
这里用Rando写一下题。
练习四:
import java.util.Random;
public class Test4 {
public static void main(String[] args) {
Random rand=new Random(42);
int distance=rand.nextInt(100)+1;
int time=rand.nextInt(100)+1;
System.out.println(distance);
System.out.println(time);
System.out.println(distance/(float)time);
}
}
这里nextInt是左开右闭的。
再说下判断等价,对于对象之间的==,是判断引用是否相同,如果想比较对象实际内容,要用到equals()方法。大多数java类库都实现了equals()方法,但自己写的类要覆盖equals方法。
练习五:
class Dog{
String name;
String says;
}
public class Test5 {
public static void main(String[] args) {
Dog a=new Dog();
Dog b=new Dog();
a.name="spot";
a.says="Ruff!";
b.name="scruffy";
b.says="Wurf!";
System.out.println(a.name);
System.out.println(a.says);
System.out.println(b.name);
System.out.println(b.says);
}
}
练习六:
class Dog{
String name;
String says;
}
public class Test5 {
public static void main(String[] args) {
Dog a=new Dog();
Dog b=new Dog();
a.name="spot";
a.says="Ruff!";
b.name="scruffy";
b.says="Wurf!";
System.out.println(a.name);
System.out.println(a.says);
System.out.println(b.name);
System.out.println(b.says);
Dog c=new Dog();
c.name="spot";
c.says="Ruff!";
System.out.println(a==c);
System.out.println(a.equals(c));
}
}
逻辑操作符要注意java的与或非只能应用与布尔值,c++非0即真不行的。举例:
i&&j i||j !i都是不行的
练习七:
class Coin{
boolean isHead;
}
public class Test7 {
public static void main(String[] args) {
Coin yuan=new Coin();
int isHeadCount=0;
Random rand =new Random(42);
for(int i=0;i<100000;i++) {
yuan.isHead=rand.nextBoolean();
if(yuan.isHead) {
isHeadCount++;
}
}
System.out.println(isHeadCount);
}
}
注意下短路。对于合取,如果第一个已经判断为假,后面是不会再继续的。对于析取,如果第一个为真,则后续不会运行。
4.关于常量
十六进制有前缀0x(或0X),八进制为0。
练习八:
public class Test8 {
public static void main(String[] args) {
long a=0xfff;
long b=0763;
System.out.println(Long.toBinaryString(a));
System.out.println(Long.toBinaryString(b));
}
}
指数计数法
练习九:
public class Test9 {
public static void main(String[] args) {
float a=Float.MAX_VALUE;
float b=Float.MIN_VALUE;
double c=Double.MAX_VALUE;
double d=Double.MIN_VALUE;
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
}
}
按位操作符
布尔值可以作为单比特值对待,可以对它进行按位与,或,异或,但不能按位非。对于布尔值,按位操作符与逻辑操作符效果相同,但缺少短路。
练习十:
public class Test10 {
public static void main(String[] args) {
int a=0xaaaa;
int b=0x5555;
System.out.println(Integer.toBinaryString(a));
System.out.println(Integer.toBinaryString(b));
System.out.println(Integer.toBinaryString(a&b));
System.out.println(Integer.toBinaryString(a|b));
System.out.println(Integer.toBinaryString(a^b));
}
}
移位操作符
<<左移操作符,在低位补0。>>有符号右移操作符,若符号为正,最高位补0,反之为1.>>>无符号右移操作符,无论正负,都在高位插入0。
这里注意下用无符号右移位结合赋值对byte和short操作可能会得到-1结果。原因是它们要先转换为int类型,然后再右移,之后被截断,赋值给原来的类型。
练习十一:
public class Test11 {
public static void main(String[] args) {
int a=0xaaaa;
while(a!=0) {
a>>=1;
System.out.println(Integer.toBinaryString(a));
}
}
}
练习十二:
public class Test12 {
public static void main(String[] args) {
int a=0xffff;
while(a!=0) {
a>>>=1;
System.out.println(Integer.toBinaryString(a));
}
}
}
练习十三:
public class Test13 {
static void change(char a) {
System.out.println(Integer.toBinaryString((int)a));
}
public static void main(String[] args) {
change('a');
change('b');
change('c');
}
}
字符串操作符
如果表达式以一个字符串起头,那么后续所有操作数都得是字符串类型。
类型转换操作符
注意窄化转换和扩展转换。除了布尔型其他基本类型均可转成别的基本类型
截尾和舍入
java中浮点数转整形,会对数字执行截尾,若想舍入,就需要round()方法。
提升
表达式中最大的数据类型决定了最终结果数据类型。
练习十四:
public class Test14 {
static void contrast(String a,String b) {
System.out.println(a==b);
System.out.println(a.equals(b));
}
public static void main(String[] args) {
contrast("hello","hello");
contrast("nihao","hello");
String a=new String("hello");
String b=new String("hello");
contrast(a,b);
String c="ok";
String d="ok";
contrast(c,d);
}
}