Java基础知识
Java环境介绍:
- JDK(Java开发工具包)
- JRM (Java运行时环境):
运行Java程序必须有的环境 - JVM (Java虚拟机):
JVM作为JRM的一个主要的核心部分
三者的关系如下图:
编译过程:Java文件的源代码后缀为.java
运行过程:.java文件经过编译之后会生成二进制的字节码文件(后缀名 .class)
Java的基本数据类型
整形 | 浮点型 | 布尔型 | 字符型 |
---|---|---|---|
byte(1字节) | float(4字节) | booblean(1字节或者一个byte位 看JVM规定) | char(2字节) |
short(2字节) | double(8字节) | ||
int(4字节) | |||
long(8字节) |
Java为了保证能多平台运行,变量所占用的字节是固定的.
int的数据范围:
-2^31 - int - +2^31-1
大概-21亿到正21亿
其他的还有引用类型:
Java的引用可以说是C语言的低配指针
在Java语言中阉割了许多c语言中指针所能完成的操作
同时C语言当中许多关键字也改变了它的本来用法
变量
变量形态(variable) | 局部变量(local variable) |
---|---|
属性/成员变量/实例变量 | |
静态属性/类成员变量/类变量 |
class Test{
static int a; //静态属性/类成员变量/类变量
int b; //属性/成员变量/实例变量
public static void main(String[] args ){
int c; //局部变量
}
}
声明变量的时候注意格式
变量规范
int a = 10;
long num = 10_000_0000L;//避免混淆尽量使用大写并用下划线分割
double kk = 10.0;
float jj = 1.11F;
变量命名规范
硬性规则:
其中最为核心的概念就是 类 和对象
变量可以由数字,字母,下划线,$构成,但是数字不能开头
同时也不能和Java的关键字重复.
软性规则:
第一要求见名知意,
多个单子构成的变量名,可以使用驼峰命名法
- 小驼峰命名法(首个单词首字母小写,后续单词首字母大写)
一般用于变量和方法名字
int studentname//不推荐
int studentNameLength
- 大驼峰命名法(所有单词首字母都大写)
用于类名的命名
int StudentName
- 蛇形命名法(python常用)
int student_name
- 脊柱命名法(Java不支持CSS语言常用)
int student-name
双精度浮点数的辨析:
double a = 1.1;
if(a * a) == 1.21){
System.out.println("相等");
}else{
System.out.println("不相等");
}
//结束输出不相等.
//结果等于:1.2100000000000002
上面有误差的原因是:java 的double类型遵循IEEE 754标准
这种方式表示的浮点数不一定是精确的值,可能会产生误差.
比较浮点数是否相等不能直接用 == 来比较;
正确的做法应该是把两个要比较的浮点数进行相减,然后比较这个差值是否小于误差允许的范围;
double aa = 1.1;
if(aa*aa - 1.21 < 0.0000001&&
aa*aa -1.21 > - 0.0000001){
System.out.println("xiangtong");
}
字节类型(byte)
一个字节
在网络编程的时候有比较重要的作用
Java没有unsigned
Java没有unsigned(无符号)
因为unsigned使用的时候有很多问题.
unsigned int a = 10;
unsigned int b = 20;
a-b = -10;
//输出的时候因为没有符号位导致数据异常;
强制类型转换
常量
字面值
值 | 解释 |
---|---|
10 | int 字面值常量(十进制) |
010 | int 字面值常量(八进制)由数字 0 开头. 010 也就是十进制的 8 |
0x10 | int 字面值常量(十六进制)由数字 0x 开头.0x10 也就是十进制的 16 |
10L | int 字面值常量(八进制) /也可以写成10l (小写的 l ) 不推荐使用小写 |
1.0 | double 字面值常量 . 可以写成 1.0d 或者 1.0D |
1.5e2 | double 字面值常量 . 科学计数法表示相当于 1.5 * 10 ^ 2 |
1.0f | float 字面值常量,也可以写成1.0F |
true | boolen 字面值常量, |
‘a’ | char 字面值常量,单引号里面只能有一个字符 |
“asfgg” | String 字面值常量 , 双引号里面可以有多个字符 |
final关键字修饰的常量
final int a = 10;
a = 20;
//编译出错因为不能为最终变量a分类值
转义字符
转义字符 | 解释 |
---|---|
\n | 换行 |
\r | 回到行首 |
\t | 水平制表符 |
’ | 单引号 |
" | 双引号 |
\ | 反斜杠 |
除法的特殊情况
double a = 5.5;
double b = 1.5;
System.out.println(a%b);
b = 0;
System.out.println(a/b);
int aa = 17;
int bb = 2;
System.out.println(aa%bb);
bb = 0;
System.out.println(aa/bb);
/*
1.0
Infinity
1
Exception in thread "main" java.lang.ArithmeticException
整形类型等的除法中除数为0 的时候会抛出异常
而浮点类型会显示无穷大.
原因是因为整形类型在处理的时候cpu会因此报错,而浮点类型根据IEEE标志浮点数0是一个无穷小的数字而不是0;因此不会报错而是Infinity(无穷大)
逻辑符号的使用技巧:
- 逻辑符号&& || 有着短路求值的作用
int a = 10;
int b = 20;
System.out.println(a>b && (a/0) == 0);
System.out.println(a<b && (a/0) == 0);
/*
false
Exception in thread "main" java.lang.ArithmeticException*/
按照正常运算,在运行 a/0 时会因为除数为零而抛出错误但是,因为&&短路求值的作用,在计算a>b的booblean的值为false就不再计算右侧 a/0 的值从而不会抛出错误.
- 逻辑符号 & 和 | 不支持短路求值;
如果操作数是boolean类型,那么运算行为就是进行逻辑与 / 逻辑或
如果操作数是整数类型,行为就是按位与 / 按位或
按位与运算:如果两个对应的比特位都为1,结果为1否则为0.
按位或运算:如果两个对应的比特位都为0,结果为0,否则为1.
int a = 10;//01010
int b = 20;//10100
System.out.println(a & b);
System.out.println(a | b);
/*
0
30
*/
- 逻辑符号 ~ 和 ^ (二进制)
^ 按位比较相同为0 , 不同为1.
~ 按位取反.
int a = 10;//0000 1010
int b = 20;//0001 0100
System.out.println(a^b);//00011110;
System.out.printf("%x",~a);//fffffff5
//1111 1111 1111 1111 1111 1111 1111 0101 = 10的取反
//0000 0000 0000 0000 0000 0000 0000 1010 = 10
- 移位运算
<< 左移 : 最左侧一位为不要了,在最右侧补0,左移一位相当于 * 2
>> 算数右移 : 最右侧一位不要了,在左侧补符号位,右移一位相当于 / 2
>>> 逻辑右移 : 最右侧一位不要了,在最左侧补0;
int num = 10; //1010
System.out.println(num<<1);
System.out.println(num<<2);
System.out.println(num>>1);
/*
20
40
5
*/
注意事项: 移位运算的时候,移动的位数不能太大,也不能是负数
Java语言的作用域
static 的用法
C中的static
- 修饰局部变量,修改了生命周期
- 修饰全局变量,修改了作用域
- 修饰函数,修改了作用域
Java中的static
- 待续
注释标准
//内容 单行注释
/内容/ 多行注释
/** 内容 */ 文档注释
方便后期生成注释文档
如果你写了-个函数/类给别人用,通过文档注释,来告诉调用者,该函数/类的用法.使用专门的文档生成工具,就可以自动提取出文档注释的内容生成一定格式的文档文件.
在IDEA中使用ctrl +鼠标左键跳转到类/方法的定义
//注释内容
/*
注释内容
*/
/**
文档注释
*/
分支结构
switch(整数|枚举|字符|字符串){
case 内容1 : {
内容满足时执行语句;
break;
}
case 内容2 : {
内容满足时执行语句;
break;
}
...
default:{
内容都不满足时执行语句;
break;
}
}
switch的括号里只能使用整形或者字符串类型作为判断