Java笔记入门Day2
一、数据类型
Java中一共8种基本类型,包括4种整型、2种浮点类型、1种字符类型char、1种布尔类型boolean
1.整型
类型 | 储存需求 | 取值范围 |
---|---|---|
int | 4字节 | -2,147,483,648 ~ 2,147,483,647(刚刚超过20亿) |
short | 2字节 | -32,768 ~ 32767 |
long | 8字节 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
byte | 1字节 | -128 ~ 127 |
- 1.byte和short类型主要用于特定的应用场合,例如,底层的文件处理或者存储空间很宝贵时的大数组;
- 2.由于Java程序必须保证在所有机器上都能够得到相同的运行结果,所以各种数据类型的取值范围必须固定。
长整型数值后缀有L或者l(例如400000000L)多用L表示 更加清楚
十六进制数值有一个前缀0x或者0X(例如 0xCAFE)八进制前缀0(例如 010)
八进制表示法比较容易混淆所以不推荐使用
前缀0b或0B表示二进制,例如0b1001就是十进制的9;
Java中可以通过加下划线使数值更易读,如1_000_000表示100万;
2.浮点类型
类型 | 存储需求 | 取值范围 |
---|---|---|
float | 4字节 | 大约±3.402 823 47E+38F(有效位数为6~7位) |
double | 8字节 | 大约±1.797 693 134 862 315 70E+308(有效位数为15位) |
float类型的数值后缀F或f(例如3.14F),没加后缀的浮点数值默认为double类型
计算0/0或者负数的平方根结果为NaN
*ATTENTION:浮点数值不适用于无法接受舍入误差的金融计算。例如,命令System.out.println(2.0-1.1)将打印出0.899999999999999999,而不是人们期望的0.9。这种舍入误差的主要原因是浮点数值采用二进制系统表示,而在二进制系统中无法精确地表示分数1/10。这种就像十进制无法精确地表示分数1/3一样。如果在数值计算中不允许有任何舍入误差,就应该使用BigDecimal类
3.char类型
char类型的字面量值要用单引号括起来。例如:'A’是编码值为65的字符常量。它与"A"不同,"A"是包含一个字符A的字符串。char类型的值可以表示为十六进制,其范围从\u0000到\uFFFF。例如,\u2122表示商标符号(™),\u03C0表示希腊字母π
转义序列 | 名称 | Unicode值 |
---|---|---|
\b | 退格 | \u0008 |
\t | 制表 | \u0009 |
\n | 换行 | \u000a |
\r | 回车 | \u000d |
" | 双引号 | \u0022 |
’ | 单引号 | \u0027 |
\ | 反斜杠 | \u005c |
\u005B和\u005D分别是[ ]的编码
- 警告:Unicode转义序列会在解析代码之前得到处理。例如,"\u0022+\u0022"并不是一个由引号(U+0022)包围加号构成的字符串。实际上,\u0022会在解析之前转换为",这会得到" “+” ",也就是一个空串
更隐秘地,一定要当心注释中的\u。注释
// \u000A is a newline
会产生一个语法错误,因为读程序时\u00A0会替换为一个换行符。类似地,下面这个注释
// look inside c:\users
也会产生一个语法错误,因为\u后面并没有跟着4个十六进制数
4.Unicode和char类型
小编还没搞懂(《Java核心技术 卷1》p33-34)
5.boolean类型
boolean类型有两个值:false和true,用来判断逻辑条件
整型值和布尔值之间不能进行相互转换
二、变量与常量
1.声明变量
double salary;
int vacationDays;
long earthPopulation;
boolean done;
变量名必须是一个以字母开头并由字母或数字构成的序列。需要注意,与大多数程序设计语言相比,Java中“字母”和“数字”的范围更大。字母包括’A’ ~ ‘Z’ 、‘a’ ~ ‘z’ 、 ‘_’ 、’$'或在某种语言中表示字母的任何Unicode字符。
变量名中不能出现 '+'和 '©’这样的符号,空格也不行
不能使用Java保留名作为变量名
2.变量初始化
使用未初始化的变量的值时,Java编译器会报错
int vacationDays;
vacationDays = 12;
变量的声明应该尽可能地靠近变量第一次使用的地方
3.常量
常量名习惯上使用全大写
在Java中,经常希望某个常量可以在一个类的多个方法中使用,通常将这些常量成为类常量(class constant) 可以使用static final设置一个类常量
public class Constants
{
public static final double CM_PER_INCH = 2.54;
public static void main(String[] args)
{
double paperWidth = 8.5;
double paperHeight = 11;
System.out.println("Paper size in centimeters:" + paperWidth * CM_PER_INCH + " by " + paperHeight * CM_PER_INCH);
}
}
类常量的定义位于main方法的外部。因此,在同一个类的其他方法中也可以使用这个常量。而且,如果一个常量被声明为public,那么其他类的方法也可以使用这个常量。
4.枚举类型
enum Size {SMALL,MEDIUM,LARGE,EXTRA_LARGE };
Size s = Size.MEDIUM;
Size类型的变量只能存储这个类型声明中给定的某个枚举值,或者特殊值null,null表示这个变量没有设置任何值
5.运算符
1)算术运算符
大部分同C语言要求,需要注意的是,整数被0除将会产生一个异常,而浮点数被0除将会得到无穷大或NaN结果
2)数字函数与常量
在Math类中,包含了各种各样的数学函数
想要计算一个数值的平方根,可以使用sqrt方法:
double x = 4;
double y = Math.sqrt(x);
System.out.println(y);//prints 2.0
在Java中,没有幂运算,因此需要借助于Math类的pow方法。
double y = Math.pow(x,a);
将y的值设置为x的a次幂(xa) pow方法有两个double类型的参数,其返回结果也为double类型。
floorMod方法的目的是解决一个长期存在的有关整数余数的问题
下面考虑这个一个问题:计算一个时钟的位置。这里要做一个时间调整,而且要归一化为一个0~11之间的数。(position + adjustment)% 12。为了避免调整出现负数,可以使用floorMod方法
floorMod(position + adjustment,12)总会得到一个0~11之间的数。
Math类提供了一些常用的三角函数:
Math.sin
Math.cos
Math.tan
Math.atan
Math.atan2
还有指数函数以及它的反函数——自然对数以及以10为底的对数:
Math.exp
Math.log
Math.log10
Java还提供了两个用于表示π和e常量的最接近的近似值:
Math.PI
Math.E
不需要在数学方法名和常量名前添加前缀"Math",只要在源文件的顶部加上下面这行代码就可以了
import static java.lang.Math.*;
3)数值类型之间的转换
当用一个二元运算符连接两个值时(例如n + f,n是整数,f是浮点数),先要将两个操作数转换为同一种类型,然后再进行计算
如果两个操作数中有一个是double类型,另一个操作数就会转换为double类型
否则,如果其中一个操作数是float类型,另一个操作数将会转换为float类型
否则,如果其中一个操作数是long类型,另一个操作数将会转换为long类型
否则,两个操作数都将被转换为int类型
4)强制类型转换
强制类型转换可能损失信息;语法格式是在圆括号中给出想要转换的目标类型,后面紧跟待转换的变量名,例如:
double x = 9.997;
int nx = (int )x;
这样,变量nx的值为9,因为强制类型转换通过截断小数部分将浮点值转换为整型;
如果想对浮点数进行舍入运算,那就需要使用Math.round方法:
double x = 9.997;
int nx = (int) Math.round(x);
现在,变量nx的值为10;
当调用round的时候,仍然需要使用强制类型转换(int)。其原因是round方法返回的结果为long类型,犹豫存在信息丢失的可能性,所以只有使用显式的强制类型转换才能够将long类型转换成int类型、
5)结合赋值与运算符
同C语言
可以在赋值中使用二元运算符,例如:
x += 4;
//等价于
x = x + 4;
重点:如果运算符得到一个值,其类型与左侧操作数的类型不同,就会发生强制类型转换。例如,如果x是一个int,则以下语句
x += 3.5;
是合法的,将把x设置为(int)(x + 3.5) 。
6)自增与自减运算符
同C语言,在此不赘述
7)关系和boolean运算符
同C语言,在此不赘述
8)位运算符
符号 | 名称 | 口诀 |
---|---|---|
& | 与运算符 | 有0出0,全1出1 |
| | 或运算符 | 有1出1,全0出0 |
~ | 非运算符 | 二进制各位取反 |
^ | 异或运算符 | 相同出0,不同出1 |
<< | 左移运算符 | 左移,低位补0 |
>> | 右移运算符 | 右移,正,高位补0,负,则在高位补1 |
>>> | 右移运算符(无符号) | 无论正负,高位补0 |
位移运算符的右操作要完成模32的运算,例如1<<35的值等同于1<<3
参考博客:https://www.cnblogs.com/lichengze/p/5713409.html
9)括号和运算符级别
同C语言,在此不赘述