对Java的基本类型,存储的是实际的值,而并非指向一个对象的引用,所以在赋值时,是直接将一个地方的内容复制到了另一个地方。
引用静态方法,在HelloData类中需要引用Print中的静态方法:
package net.mindview.util;
public class Print {
public static void print(Object obj){
System.out.println(obj);
}
}
package com.test.tij4.operators;
// 该import表示引用Print类的静态方法
import static net.mindview.util.Print.*;
public class HelloDate {
public static void main(String[] args){
print("Hello");
}
}
对于i++和++i,前者是先得值再自加,后者是先自加再得值,例:
public class AutoInc {
public static void main(String[] args) {
int i = 1;
System.out.println(++i); // i先+1再打印,结果=2
System.out.println(i++); // i先打印再+1,结果=2,但i的值已变为3
System.out.println(i); // 结果为3
System.out.println(--i); // i先-1再打印,结果为2
System.out.println(i--); // i先打印再-1,结果为2,但i的值已变为1
System.out.println(i); // 结果为1
}
}
对于基本数据类型,可以直接使用=比较值;对于大部分Java类库,可以使用equals()方法来比较值;而对于其他自定义类,需要自行重写equals()方法。因为大部分Java类库,都重写了equals()方法,equals()默认比较的还是对象的引用,例:
class Value{
int i;
}
public class EqualsMethod {
public static void main(String[] args) {
int i1 = 23;
int i2 = 23;
Integer n1 = new Integer(23);
Integer n2 = new Integer(23);
Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i = 23;
System.out.println(i1 == i2); // 对于基本数据类型直接使用=比较值,结果为true
System.out.println(n1 == n2); // 作为对象,=比较的是引用,结果为false
System.out.println(n1.equals(n2)); // 大部分Java类库,equals被重写,比较的是值,结果为true
System.out.println(v1.equals(v2)); // 由于Value类没有重写equals,默认equals比较的还是对象的引用,结果为false
}
}
直接常量:long型在值后加l或L,float加f或F,double加d或D;十六进制以前缀0x或0X开头,后面跟0~9或大小写a-f表示;八进制以前缀0开头,后面跟0~7的数字表示。
指数计数法:如,float f = 1.39e-43f代表的是1.39x10的-43次方。对于定义float,有小数点后位数的,需要明确指出是单精度类型f,因为编译器会默认认为是double类型。
原码、反码、补码:反码是对原码的取反操作,补码是对反码+1操作,如:
int型整数5二进制表示为:00000000 00000000 00000000 00000101
原码:00000000 00000000 00000000 00000101
反码:11111111 11111111 11111111 11111010
补码:11111111 11111111 11111111 11111011
在计算机中表达负数即为补码,最高位表示正负,负数为1,反之为正数,所以5的补码即为-5的值。
按位操作符,即用来操作整数基本数据类型中的单个bit,即二进制的位。
- ~:按位求反,作用是将各个二进制位由1变成0,0变成1;
- &:按位与操作符,两个都为1时结果为1,否则为0,类似"且";
- | :按位或操作符,两个有一个或以上为1时结果为1,否则为0,类似"或";
- ^:按位异或运算符,两个不同则结果为1,否则为0。
移位操作符,操作对象也是二进制的bit,只可用来处理整数类型。
- <<:无符号左移位操作符,按操作符右侧指定的位数将操作符左边的操作数向左移动(低位补0);
- >>:有符号右移位操作符,按操作符右侧制定的位数将操作符左边的操作数向右移动,若符号位正,则在高位插入0,否则插入1;
- >>>,无符号右移位操作符(Java特有),功能同上,只是无论如何都在高位插入0。
public class BiteManipulation {
public static void main(String[] args) {
// 无符号左移
System.out.println(7 << 8); // 将7的二进制111向左移动8位为11100000000,结果为1792
int x = 7;
x <<= 8;
System.out.println(x); // 将7的二进制111向左移动8位为11100000000,结果为1792并将值赋给变量x
// 有符号右移
System.out.println(7 >> 2);// 将7的二进制111向右移动2位为1,结果为1
/*
* 将-7的二进制11111111111111111111111111111001向右移动2位为xx111111111111111111111111111110
* 由于向右移是有符号的,-7为负数,高位补1,所以结果为11111111111111111111111111111110,即-2
*/
System.out.println(-7 >> 2);
int y = 7;
y >>= 2;
System.out.println(y); // 将7的二进制111向右移动2位为1,结果为1并赋值给变量y
// 无符号右移(Java特有)
/*
* 将-7的二进制11111111111111111111111111111001向右移动2位为xx111111111111111111111111111110
* 由于是无符号右移,高位补0,所以结果为00111111111111111111111111111110,即1073741822
*/
System.out.println(-7 >>> 2);
}
}
窄化转换(narrowing conversion),一种将能容纳更多信息的数据类型转换成无法容纳那么多信息的类型的转换;如将float型转换为int型。Java中默认的处理方式是将float数值的小数点后的数据直接舍弃,只保留整数值;如果想要得到四舍五入的结果,可以使用java.lang.Math中的round()方法。
在对不同数据类型做算术运算时,总是表达式中出现的最大的数据类型决定了最终结果的数据类型,如:一个float类型与double类型的值做运算,结果为double类型。