【Java基础_02】Java变量、运算符、程序控制结构
Java中每一种数据都定义了明确的数据类型,在内存中分配了不同大小的内存空间(字节)。
Java 的整数类型就是用于存放整数值的,比如 12 , 30, 3456 等等
int n1 = 1
long n3 = 1L; //数值是1,但是long类型
//Java 的浮点型常量(具体值)默认为 double 型,声明 float 型常量,须后加‘f’或‘F'
float num1 = 1.1; //对不对?错误
float num2 = 1.1F; //对的
double num3 = 1.1; //对
double num4 = 1.1f; //对(小放大,是正确的)
//十进制数形式:如:5.12 512.0f .512 (必须有小数点)
double num5 = .123; //等价 0.123
System.out.println(num5); //0.123
//科学计数法形式:如:5.12e2 [5.12 * 10 的 2 次方 ] 5.12E-2 [5.12 / 10的2次方]
System.out.println(5.12e2);//512.0 进行了乘法运算,计算后后类型是double,所以是512.0
System.out.println(5.12E-2);//0.0512
//通常情况下,应该使用 double 型,因为它比 float 型更精确。
//[举例说明]
double num9 = 2.1234567851;
float num10 = 2.1234567851F;
double num9 = 2.1234567851;
float num10 = 2.1234567851F;
System.out.println(num9); //2.1234567851
System.out.println(num10); //2.1234567
//浮点数使用陷阱: 2.7 和 8.1 / 3 比较
double num11 = 2.7;
double num12 = 8.1 / 3; //2.7
System.out.println(num11);//2.7
System.out.println(num12);//接近 2.7 的一个小数,而不是 2.7 2.6999999999999997,因为转成二进制算的,可能会算成这样
//得到一个重要的使用点: 当我们对运算结果是小数的式子进行相等判断时要小心
//应该是以两个数的差值的绝对值,在某个精度范围类判断
if( num11 == num12) {
System.out.println("num11 == num12 相等");
}
//正确的写法
if(Math.abs(num11 - num12) < 0.000001 ) { //这个0.000001在不同的业务逻辑中不同
System.out.println("差值非常小,到我的规定精度,认为相等...");
}
细节:如果不是计算所得,而是直接查询得的的小数或者直接赋值,是可以判断相等
java中的char占两个字节,c语言中是一个字节
初始化方式
1.char c='c'; //字符,可以是汉字。因为是Unicode编码,需要加单引号才能直接输出单引号内的内容,否则输出unicode编码对应字符。
2.char c=十进制数,八进制数,十六进制数都可以; //可以用整数赋值【整数范围:0~65535】。输出unicode字符编码表中对应的字符。**
3. 在java中,char默认输出是unicode码(即该数字)对应的字符。要输出对应的数字,可以(int)字符。
char c3 = 97;
System.out.println(c3);// a
System.out.println(int(c3));//97 输出'a'对应的数字
//字符型
char c1 = 'a'; //用char只能用单引号,双引号是string,string和char不兼容
char c2 = '哈';
char c2_ = 21704;
char c3 = 97;
char c4 = '9';
char c5 = '\t'; //前面的/表示转义
System.out.println(c1); //输出a
System.out.println((int)c1); //输出'a'对应的数字 97
System.out.println(c2); //输出哈
System.out.println((int)c2); //输出'哈'对应的数字
System.out.println(c2_); //输出哈
System.out.println(c3); //输出97表示的那个字符-》a ascii码
System.out.println(c4); //输出9
System.out.println(c5);
System.out.println('a' + 10); //编译器先把a转为97进行计算=》107
char c6 = 'b' + 1;
System.out.println(c6); // 99->对应的字符->ascii编码表(unicode兼容它)
System.out.println((int)c6); // 99
一个汉字用2个字节表示,一共能表示65536个【范围是0-65536】
UTF-8使用三个字节表示汉字,表示的汉字更多
不可以用0或者非0的整数替代false或true!
蓝图转换都是正确的,'c’为char类型,可以自动转换为int型。80为int,可以自动转换为double(输出为80.0)。
小数就是默认double的,后面加F才是float,但是byte c = 10;10虽然默认int,但是这样的句子是可以的,在范围内
//(一)多种类型的数据进行混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算
int n1 = 10;
double d1 = n1 + 1.1;
//float d1 = n1 + 1.1; 1.1默认double类型,即结果类型是double,设置为float有精度损失
float d2 = n1 + 1.1F; //把1.1转为float类型
//(二)把精度容量大的数据类型赋给精度容量小的数据类型时就会报错,反之会进行自动类型转换
//int n2 = 1.1;//小数默认double类型【用int放置精度会丢失】
//(三)(byte,short)和char之间不会相互自动转换
//(四)当把具体数赋给byte时,(1)先判断该数是否在byte范围内 (2)如果是变量赋值,判断类型
byte b1 = 10; // 对, -128 - 127 10只是默认int
int n2 = 1;
// byte b2 = n2; //不对,n2是int,按照四个字节存放,放到b2中精度会有丢失。
// char c1 = b1;// 不对,byte不能自动转换为char
//(五)byte,short,char三者可以计算,在计算时自动先转换为int类型(当做int进行处理)
byte b2 = 1;
short s1 = 1;
//short s2 = b2 + s1; 不对,b2和s1是int类型
//byte b4 = b2 + b3; 不对,b2和b3是int类型
//(六)boolean不参与转换
//(七) 表达式结果的类型自动提升为操作数中精度最大的类型
//byte int short double 进行计算,转换为double
自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符 ( ),但可能造成 精度降低或溢出,格外要注意。
int j = 100;
byte b1 = (byte)j;
System.out.println(b1);//100不会明显有损失,但如果是1000就会有大的损失
4对应前面的(五)
double x = (int)10 * 3.6 + 6 * 1.5; //把10转换为int
int y = (int)(10 * 3.5 + 6 * 1.5);
System.out.println(x);
System.out.println(y);
1和2中的错误主要是因为byte,short,char三者可以计算,在计算时首先转换为int类型,目前我认为不能贸然默认是由于9和11是默认int类型,毕竟是在范围内的。
字符串相加是拼接,所以加上一个空的字符串就是前面的东西和空的字符串拼接,也就是内容不变但是类型变为字符串。
//基本数据类型->String
int n1 = 100;
float f1 = 1.1F;
double d1 = 4.5;
boolean b1 = true;
String s1 = n1 + "";
String s2 = f1 + "";
String s3 = d1 + "";
String s4 = b1 + "";
System.out.println(s1 + " " + s2 + " " + s3 + " " + s4);
//String->对应的基本数据类型
String s5 = "123";
int num1 = Integer.parseInt(s5);
double num2 = Double.parseDouble(s5);
float num3 = Float.parseFloat(s5);
long num4 = Long.parseLong(s5);
byte num5 = Byte.parseByte(s5);
boolean b = Boolean.parseBoolean("true");
short num6 = Short.parseShort(s5);
System.out.println(num1);//123
System.out.println(num2);//123.0
System.out.println(num3);//123.0
System.out.println(num4);//123
System.out.println(num5);//123
System.out.println(num6);//123
System.out.println(b);//true(输出的就是这四个字母)
//怎么把字符串转成字符 char -> 含义是指 把字符串的第一个字符得到
//解读 s5.charAt(0) 得到 s5 字符串的第一个字符 '1'
System.out.println(s5.charAt(0));