操作符的详解
操作符
更简单的打印语句
- 静态导入, 让我们省去了new这个类的步骤,会在加载类的时候自动默认加载。
- think中使用打印语句system.out.print,用一个方法将它缩短print这样输出的使用就可以直接使用print去打印, 但是实际开发基本用不到静态导入,也基本不会去用另一个方法去缩短输出语句,毕竟编辑器中有输出的快捷方式。
使用Java操作符号
操作符基本只能操作基本数据类型, 除了等于, 不等于,恒等于这些关系的 操作符号。
String,可以接受+ +=进行连接: 把数字和字符串进行连接变成一个字符串
优先级
其实对于优先级的理解只要小括号优先, 其他的数字,逻辑运算优先于关系运算, 普通的加减乘除会比其他的来的优先一点。
赋值
关于赋值有一道题目, 是:
Demo t1 = new Demo()
Demo t2 = new Demo()
t1.level = t2.level;
t1.level = 27
请问这个时候t2.level的值为多少?
呃呃呃。。。 根据引用传递的原则, 因为t2的引用赋值给了t1,所以t1改变的也会让t2改变
算数操作符号
这个章节主要是讲述了, 加减乘除,取模运算, 在整数里面, 除法如果不够除会直接得数为0而不是为小数。 浮点型里面按照位数进行保留, 然后还提到一点, 随机数是利用时间进行充当种子进行计算,因为每个时间段都不一样, 也就造成了随机数的不一样, 假设我们new Random 对象的时候进行了提供随机数, 那么我们也就能得到相同的时间序列了
public static void main(String[] args) {
public static void main(String[] args) {
java.util.Random r=newjava.util.Random(10);
for(int i=0;i<10;i++){
System.out.println(r.nextInt());
}
}
运行以上代码就可以发现每次随机数都是相同的。
自动递增和递减
- 自增和自减, 要把握的精髓就是要知道, 增加放在前面就是语句运行前增加, 放在后面就是语句结束的时候增加。 当然如果把自增或者自减 ,放在单独的一行,那么结果一定是一样的。
关于自增我们看到源码我们也能知道, for循环的底层,就是用while语句中用一个flag(标识变量)进行控制,从而达到控制循环的目的。- 顺便再提一下, while循环其实就是用goto进行不断的返回之前的代码地址,从而达到循环的目的。
- 提到循环不得不提一下, foreache的循环其实就是for循环。 可以试着写一个foreach的代码,生成的class文件进行反编译后。 可以得到代码 ,里面就会惊奇的发现原来的foreach其实就是for循环。
- 得出的结论, 其实Java中很多类都是通过之前的类进行封装修饰, 得到现有的类。
- 实际用途上我们也可以运用这种理念进行学习封装, 就好像我们平时打的jar包, 各种的插件, 让我们避免了重复性的代码工作。
关系操作符
- 再关系运算符我们只要知道:
等于号, 不等于, 大于小于,恒等于...
里面要注意的点就是:== 和 equal的区别
== 是比较的数据的地址, 而 equal方法的实现是比较的是值的比较。方法的思路就是, 把一类转化成值, 然后进行比较。
由以上可以知道
Integer a = 2;
Integer b = 2;
String c = "你猜";
String d = "你猜";
a b如果用== 结果是不一样的因为地址是不一样的, 但如果用equal则比较的是值的大小所以是相同的。
但是c 和d 用 == 运行的时候为什么又相同呢。 因为String类型再堆里面的方法区中有一个常量池, String类型的数据首先会到常量池里面去寻找如果有的化就不用重新进行创建对象,也就是给内存空间。 所以c和d 结果是true。
逻辑操作符号
- 逻辑操作符: 与 或 非。
- 里面比较特别的就是短路问题, 如果在或中,其中一个判断条件如果已经确定了, 那么就不会进行下一个的判断条件,直接运行, 这样在大量的工作中会节省内存。
- 测试的语句, 只要拿一个标志变量在短路语句中,进行对值的操作,这样从标志变量中就可以看出是否有经过这个判断。
直接常量
直接常量是指, 编译器可以直接知道需要什么类型的数据, 比如:
- 比如在输出十六进制的时候要加0x, 在八进制的时候要加0 , 在float类型的时候后面要加任意大小的f, 在long类型的时候一定要加大写的L(害怕混肴)
- 这边的科学计数法用e去标识10的基底数,还有一个是在浮点型的时候科学记数法是被默认用双精度类型的引用去装。
按位操作符号
- 按为运算符, 是对整数基本类型中的,单个比特(二进制位的数)进行运算, 然后再web开发中使用的很少。
有:与 或 非 亦或
移位操作符
- 移位运算符号,再日常项目中用到的就更加少了, 举个实用的例子, 因为移位操作符是再二进制中的, 比如左移一位,增加了两种可能,所以是乘二。 向反方向则相反,为除, 用移位操作符,可以提高效率, 这也算是另类的算法把。
- 另外再不得不提的是, 移位跟符号位和非符号位不无关系, 正是因为符号位占了一位,所以int类型的数位4个字节,但它是从-2的31次方 到2的31次方
三元操作符
三元运算符:只要知道格式是 express?true: false;就行
字符串操作符
+= = 这里讲述的编译器的一个特性, 开始为字符串的i语句中,后面跟的变量会被编译器同样认为是字符串进行操作
使用操作符时常犯的错误
这里书中给的例子是: 当我们再进行while循环的时候。 判断条件是a = b; 这样的是赋值语句, 在c语言中结果就会一直进行循环操作, 只要结果是为0之外的任何数。 而Java虚拟机, 只认布尔值, 这样的数值在编译的时候就会报错。 所以我们就不存在这种逻辑上的错误了
类型转换操作符
- 里面就是指类型转换问题:无非就是窄化转换,和扩展转换。
- 窄化转换具有数据丢失的风险。 扩展转换则没有, 但是浮点类型的数据和等大的整型数据之间的转化会出现精度丢失的问题。
- 然后值得一提的是,我们之前所说的范型,里面就用到窄化转换, 因为我们是单继承的, 但是为什么没有事呢, 因为我们实现记录了它的类型进行转化的对象是自己。 转化成最大的父类Object不会丢失数据, 父类转化为本身的时候的值自然就不会丢失数据。
Java没有sizeof
- 首先什么是sizeof , sizeof 是c或者c++的程序员用于告诉你为数据项分配的字节数,因为在不同的机子上, 数据类型的大小是不相同的, 但是在Java中, Java虚拟机将其定义为相同的。