Java 编程思想第三章笔记


                                                第三章操作符
一边做笔记一边看书,打代码更好
第六章静态导入是什么?

3.1
以前我就一直觉得 System 的输出语句太长了,作者在这里为我完美的解决了问题,利用静态导入这样在测试的时候就方便了很多。
3.2
操作符接收一个或多个参数,并生成一个新值,与普通方法调用有所不同。几乎所有的操作符只能操作基本类型,例外的是= == !=能操作所有对象,String 支持+和+=。
3.3
Java 中的输出语句中+作为字符串连接的标志,当编译器察觉到+之后有一个非 string 类型的元素,他会尝试把他们变成 String 类型。
3.4
在对基本类型赋值时候,基本类型储存了实际的数值,而非是对象的引用。
对对象的赋值,会将两个引用变成一个,另一个被覆盖并且有垃圾回收期自动请经理,这种显现叫做别名现象。避免别名问题的出现,就是要改变对象间的直接赋值。
而且在方法传递的时候,尤其要注意对象传递过去的引用如果在方法内发生了改变,那么原先存储在引用指向的对象内的数据也会发生改变,与此相较的是如果我们直接传入的是一个数据

3.5算数操作符
学习这里的时候发现:作者对那些什么精度,或者溢出没有 C语言那么变态。我这里的收获主要是随机数是怎么产生的。这里是用的是 java.util.Random;类中的方法,之后还有一个
java.lang.Math;类中的 Math.next
第一个还能像第二个一样.


除了这些之外还有很多其他方法,但是除了 nextInt(int bound)能够传入参数之外其他都不能。基本数据类型基本都能产生 boolean int float double long 以及特殊的 byte【】数组(没有返回值)和 int protected 类型(我不知道留这个来干什么,用也用不了,而且还有其他可以替代的方法)

pseudorandom 


3.6自动递增和递减
注意前缀形式和后缀形式的区别。
3.7关系操作符


生成一个布尔结果,而我学的 C语言中是生成0或1.
大于,小于,大于等于,小于等于,等于,不等于。。。
3.7.1测试对象的等价性
等于和不等于适用于所有基本数据类型和对象,但是后者要注意,比较的是引用。 引用使用 equals()方法,这是对象继承自 Object 父类的方法
这里的问题要到七章的覆盖才能解释,到十七章才能讯息如何恰当的定义 equals()
public class EqualsMethod2 {
  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));//结果太令人惊奇了,为什么
  }
} /* Output:
false
*///:~


3.8逻辑操作符
根据参数的逻辑关系生成一个布尔值,与或非。经常与关系操作符一起使用。
逻辑操作符限制比较大,因为他的操作只能用于布尔值,这与 C语言和 c++中有很大不同。
3.8.1短路
&&遇到一个 false   ||遇到一个 true,潜在的性能提升
3.9直接常量
存入不仅可以用十进制表示也可以用八进制和十六进制,octal 和 hexadecimal 前者是零开头后者是零 X 开头。。
    char c = 0xffff; // max char hex value  二的十六次方减一
    byte b = 0x7f; // max byte hex value  二的七次方减一 (8*16-1=127)
 


   short s = 0x7fff; // max short hex value 二的十五次方减一
如果我把 short s=0xffff;编译器会自动将之转换成 int 类型,我的 netbeans 中报错说,int 转换成 short 类型会损失精度

 short类型的取值范围是:-32768---32767
   
Char字符类型的编码值是:0---65535(65535加一再除以二==32768)

byte 类型:-128~ 127


在基本类型存入数据可以用后缀字符标志类型,如用 l L 和 d D ,f F
3.9.1指数计数法
用e在 Java 中表示10,大小写皆可以。Exponents
 double expDouble = 47e47d; // 'd' is optional
    double expDouble2 = 47e47; // Automatically double


3.10按位操作符
与,或,异或可以和=一起用。~不可以
对于布尔值按位操作符和逻辑操作符有相同的效果,但是不会中途短路,优先考虑逻辑操作符。并且异或没有在逻辑操作符中出现。

3.11移位操作符

1、数据在计算机底层是以二进制来存储的。而且就是按照数据的补码来存储的。(数据分为:原码、反码、补码)
2、对于正数来讲:原码、反码、补码都是相同的。对于负数来讲:其补码可以看做是其相反数的各个位去反后,再+1得到。
在机算机中负数是以补码形式存放的。
补码就是取反加1.
 1234567890123456(16位)
-1的绝对值1 的原码= 0000000000000001(不是说0代表的是正数吗?)
取反 1111111111111110
加1 1111111111111111

      要注意的是自动类型转换,如 byte short 和 char 类型在移位前会变成 int 类型的。其中最后的几个输出表现出了对 byte 和 short 值进行的移位运算,结果可能不正确。因为我发现在 byte 和 short 在计算机存储的形式变成了 int 类型一共32位二进制,但是在向右移位10之后,赋值给自己原先的类型 byte,打印出来,还是32位二进制。明显有问题。
     原因大概是赋值给原来自己的类型时,然后再进行打印前,类型又从 byte 转换成了 int,然后打印出了 int 转换成 String 的字符串(感觉有点不明)

3.12三元操作符
慎用,虽然更简洁,但不容易理解

3.13字符串操作符
System输出的显式方法,如非字符串的 int 类型打印输出,隐式转换(一般);但是显示转换需要调用一个 Integer。toString()方法

3.14使用操作符常犯的错误
Java 优秀于 C语言和c++的地方,使用= 和==时候常犯的错误。 因为 while(x=y){}中的 x=y 结果是一个非零值,所以 C语言和 c++陷入了一个死循环。但是该式子在 Java 中却不会出错,因为在 while 或者if 这种判断语句中的时候,编译器期望的是一个布尔值的结果,所以这里会报错提醒你。(除非x,y 都是布尔值)


3.15类型转换操作符
C语言和 c++中类型转换头疼,但是 Java 中比较安全。窄化和扩展转换。基本数据类型出了布尔类型之外可以相互转换,但是类 数据类型不允许类型转换,除了特殊方法
3.15.1截尾和舍入
Double float 变成 int,并不是我以为的扩展转换,而是直接把尾巴截掉
要想得到舍入结果,必须用到 round()方法。
3.15.2提升
对基本数据类型进行算术运算或者按位运算,类型比 int 晓得 byte short char 在运算之前都会自动转换成 int,但是如果想把结果赋值给较小的类型就要用类型转换。就像前面的那个 byte 移位前变成了 int 类型右移了10位之后赋值给了原先的类型,结果就出现了错误。我在那里比较疑惑的是,计算机在移位的时候是移动的补码吗?
3.16 Java 中没有 sizeof()
C语言和 c++中,其作用是为了移植,因为不同的数据类型在不同的机器上可能有不同的大小。Java 所有数据类型在所有的机器上大小是一样的不必考虑移植

3.17操作符小结
这里有一长串的代码,我还没有看,太多了
对于 char,byte 或者 short 来说,复合复制不需要类型转换。尽管执行类型提升,但也会获得与直接算术运算相同的结果,另一方面更简便?

猜你喜欢

转载自blog.csdn.net/qq_35502627/article/details/82830937