JAVA介绍
javaSE:标准版 -------------------------桌面开发
javaME:微型版-------------------------移动电子设备
javaEE:企业级应用版-------------------企业级开发(企业管理系统等)
JDK工具
jdk是java语言的软件开发工具
bin文件夹:存放java运行的各种可执行文件
jre文件:存放java的运行环境
include文件:用于编译本地方法的文件
lib文件:存放java的核心类库
src.zip:该文件是java的核心源码包,它在JDK安装的根目录下。
JVM、JRE和JDK区别什么?
(1)JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性。java语言跨平台,jvm不是跨平台的。
(2)JRE(Java Runtime Environment):java的运行环境,包括jvm+java的核心类库。
(3)JDK(Java Development Kit):java的开发工具,包括jre+开发工具。
环境变量path和classpath的作用是什么?
(1)path是配置Widows可执行文件的搜索路径,即扩展名为.exe的程序文件所在的目录,用于指定DOS窗口命令的路径。
(2)classpath是配置class文件所在的目录,用于指定类的搜索路径,JVM就是通过他来寻找该类的class类文件的。
java注释
单行注释------------------------//
多行注释-----------------------/*>>>>>>>>>>>*/
文档注释-----------------------/**>>>>>>>>>>*/
基本注意事项
变量定义:在整个程序执行过程中值会发生改变的量
类:具有一组相同属性和方法的集合
变量:变量名由字母、数字,下划线,美元符号构成的,但是不能以数字开头。
其他规范
变量:如果变量名由一个单词组成,首字母要小写,如果变量名同时由多个单词组成,首字母小写,从第二个单词开始,首字母大写。
1.首字母:字母,下划线(_)或符号(不能含有空格,不能以数字开头)
2,其他部分:数字,字母,下划线,符号(不能含有空格,不能以数字开头)
3.变量名不能是Java关键字(即保留字)
4.除了下划线之外,不包括任何其他特殊字符
5.变量必须先声明再使用
6.变量可以先声明 后 赋值
7.同一个作用域中,变量名不能重复(不能声明多次)
属性和方法:首字母小写,第二个单词开始首字母大写。
类名:每个单词首字母大写
常量:全部大写
注意:
- final 常量
- a.属性final常量,要求声明时就必须初始化赋值
- b.局部变量定义后,必须初始化,即赋值,才能使用(它没有默认值)
- c.常量命名规范:全部大写
包名:全部小写
-
包名不能以圆点开头或结尾
-
在Eclipse里创建包名有两种方式
-
注意:在不通包中引入同名的类时,需要在类前附上自己的包名
如何定义包、使用包,以及使用时应该注意哪些事项。
包是Java语言提供的一种区别类名字命名空间的机制,它是类的一种文件组织和管理方式、是一组功能相似或相关的类或接口的集合。Java
package提供了访问权限和命名的管理机制,它是Java中很基础却又非常重要的一个概念。
一、包的作用
1 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
2 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
3 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
二、包的定义
在一个.java文件中可以一个public类和多个非public类,如果要将这些类组织在一个包当中,则在.java文件中除注释以外的第一行使用关键字package即可实现。当需要调用此包中的类时,就可以使用关键字import进行导入。在定义包的时候,应该注意几点:
-
为了尽量使包名保持唯一性,包名通常采用小写、按倒写互联网址的形式进行定义。如:com.hank.www表示包文件放置的文件路径为com/hank/www。
-
在进行命名包时,应该避免使用与系统发生冲突的名字,如java.lang、java.swing等。
三、包的使用:
- 创建类的时候,在java源码第一行使用 package 关键字标志本类所在的包。
- 如果某个类调用不同包类时,使用 import进行导入,如果使用import包名.*;表示导入包中所有的类。
- 如果本包中有某个类,而这时必须导入另外一个包相同名字的类时,使用import导入时会出现问题,为了避免出现歧义,一般使用全类名访问。
基本数据类型:
基本数据类型(8种):
数值型:
整形:
- byte(1字节)
- short(2字节)
- int(4字节)
- long(8字节)
浮点型:
- float(4字节)
- double(8字节)
非数值型:
- 字符型:char(2字节)
- 布尔型:boolean(占1位)
引用数据类型:数组、接口、类
Java中的4种引用类型
从JDK1.2开始,Java中的引用类型分为四种,分别是:
①强引用(StrongReference)
②软引用(SoftRefernce)
③弱引用(WeakReference)
④虚引用(PhantomReference)
强引用-StrongReference
这种引用是平时开发中最常用的,例如 String strong = new String(“Strong Reference”),当一个实例对象具有强引用时,垃圾回收器不会回收该对象,当内存不足时,宁愿抛出OutOfMemeryError异常也不会通过回收强引用的对象,因为JVM认为强引用的对象是用户正在使用的对象,它无法分辨出到底该回收哪个,强行回收有可能导致系统严重错误。
软引用-SoftReference
如果一个对象只有软引用,那么只有当内存不足时,JVM才会去回收该对象,其他情况不会回收。软引用可以结合ReferenceQueue来使用,当由于系统内存不足,导致软引用的对象被回收了,JVM会把这个软引用加入到与之相关联的ReferenceQueue中。
当系统内存不足时,触发gc,这个Book就会被回收,reference 将不为null。
弱引用-WeakReference
只有弱引用的对象,当JVM触发gc时,就会回收该对象。与软引用不同的是,不管是否内存不足,弱引用都会被回收。弱引用可以结合ReferenceQueue来使用,当由于系统触发gc,导致软引用的对象被回收了,JVM会把这个弱引用加入到与之相关联的ReferenceQueue中,不过由于垃圾收集器线程的优先级很低,所以弱引用不一定会被很快回收。下面通过一个主动触发gc的例子来验证此结论。
当然这不是每次都能复现,因为我们调用System.gc()只是告诉JVM该回收垃圾了,但是它什么时候做还是不一定的,但就我测试来看,只要多写几次System.gc(),复现的概率还是很高的。
虚引用-PhantomReference
如果一个对象只有虚引用在引用它,垃圾回收器是可以在任意时候对其进行回收的,虚引用主要用来跟踪对象被垃圾回收器回收的活动,当被回收时,JVM会把这个弱引用加入到与之相关联的ReferenceQueue中。与软引用和弱引用不同的是,虚引用必须有一个与之关联的ReferenceQueue,通过phantomReference.get()得到的值为null,试想一下,如果没有ReferenceQueue与之关联还有什么存在的价值呢?
类型转换:
- 大类型到小类型转换 强制转换
- 小类型到大类型转换 自动转换
java生成文档目录:
方法1:
javadoc InterfaceA.java -d A
InterfaceA.java表示java的源代码
-d 是一种格式
A 表示生成文档的信息存放的文件夹
A文件夹可以现在盘下创建,亦可以不用,但必须保证A文件夹和你导出的java源代码必须是在同一个盘下的同一级文件目录下。
方法2:
在Eclipse->progect->generate->Javadoc->选中你要生成的单个JAVA源代码->选择destination:这里面的输出文件夹名字和存放的路径不能包含汉字,否则出错。
另外就是如果编译的时候报 运行javadoc生成文档时gbk字符问题。
加入编码 -encoding utf-8 -charset utf-8
Java运算符优先级整理
算术运算符:+ - * / %
关系运算符:> < != == <= >=结果一定是boolean
位运算:& | ~ ^
逻辑运算符:& | ! && | |
条件运算符(三元表达式): ?:
赋值运算符:= += -= /= *=
口诀:括单算关位逻条赋
括号(1级): | ()[ ] (数组去取下标) |
---|---|
单目(2级)(从右向左): | ! + - ~ ++ – |
算术(3-5级) | * / % —>>>+ - —>>><< >> >>> |
关系(6-7级) | < <= > >= instanceof —>>> == != |
位(8-10级)(特殊的单目) | ~—>>>& —>>>^—>>>| |
逻辑(11-12级) | !(优先级高于算术运算符)—>>>&&—>>>|| |
条件运算符 | ?: |
赋值(14级)(从右向左) | = += -= *= /= %= &= |= ^= ~= <<= >>= >>>= |
—>>>用于区别同一类里面的优先等级 | 其中 1 级最高,14 级最低 |
注意:
- 1.---->>>>用于区别同一类里面的优先等级,每遇到一个---->>>>优先级降一级,如:单目类里%优先级高于+
- 2.单目中有几个特殊之处①.与括号同级②&^|优先级位于算、关之后③除①②中特殊的,其余单目结合方向均为从右向左赋值与普通的单目的结合方向从右向左
- 3.与C有点不一样,Java里好像没有“,”和“mod”运算符,^也不能表示指数或幂运算
Java 中共有 54 种运算符,按优先级可以分为 14 级,详见如下(原来整理的,供为参考):
1. 优先级 操作符 含义 关联性 用法
2. ----------------------------------------------------------------
3. 1 [ ] 数组下标 左 array_name[expr]
4. . 成员选择 左 object.member
5. ( ) 方法参数 左 method_name(expr_list)
6. ( ) 实例构造 左 class_name(expr_list)
7. ++ 后缀自增 左 lvalue++
8. -- 后缀自减 左 lvalue--
9.
10. 2 ++ 前缀自增 右 ++rvalue
11. -- 前缀自减 右 --lvalue
12. ~ 按位取反 右 ~expr
13. ! 逻辑非 右 !expr
14. + 一元加 右 +expr
15. - 一元减 右 -expr
16.
17. 3 ( ) 强制转换 右 (type)expr
18. new 对象实例化 右 new type()
19. new type(expr_list)
20. new type[expr]
21.
22. 4 * 乘 左 expr * expr
23. / 除 左 expr / expr
24. % 求余 左 expr % expr
25.
26. 5 + 加 左 expr + expr
27. - 减 左 expr - expr
28. + 字符串连接 左 strExpr + strExpr
29.
30. 6 >> 有符号右移 左 expr >> distance
31. >>> 无符号右移 左 expr >>> distance
32.
33. 7 < 小于 左 expr < expr
34. <= 小于等于 左 expr <= expr
35. > 大于 左 expr > expr
36. >= 大于等于 左 expr >= expr
37. instanceof 类型比较 左 ref instanceof refType
38. == 等于 左 expr == expr
39. != 不等于 左 expr != expr
40.
41. 8 & 整数按位与 左 integralExpr & integralExpr
42. & 布尔与 左 booleanExpr & booleanExpr
43.
44. 9 ^ 整数按位异或 左 integralExpr ^ integralExpr
45. ^ 布尔异或 左 booleanExpr ^ booleanExpr
46.
47. 10 | 整数按位或 左 integralExpr | integralExpr
48. | 布尔或 左 booleanExpr | booleanExpr
49.
50. 11 && 逻辑与 左 booleanExpr && booleanExpr
51.
52. 12 || 逻辑或 左 booleanExpr || booleanExpr
53.
54. 13 ? : 条件运算 右 booleanExpr ? expr : expr
55.
56. 14 = 赋值 右 lvalue = expr
57. *= 乘赋值 右 lvalue *= expr
58. /= 除赋值 右 lvalue /= expr
59. %= 模赋值 右 lvalue %= expr
60. += 加赋值 右 lvalue += expr
61. += 字符串连接赋值 右 lvalue += expr
62. -= 减赋值 右 lvalue -= expr
63. <<= 左移赋值 右 lvalue <<= expr
64. >>= 有符号右移赋值 右 lvalue >>= expr
65. >>>= 无符号右移赋值 右 lvalue >>>= expr
66. &= 整数按位与赋值 右 lvalue &= expr
67. &= 布尔与赋值 右 lvalue &= expr
68. |= 整数按位或赋值 右 lvalue |= expr
69. |= 布尔或赋值 右 lvalue |= expr
70. ^= 整数按位异或赋值 右 lvalue ^= expr
71. ^= 布尔异或赋值 右 lvalue ^= expr
上表说明
1、 该表中优先级按照从高到低的顺序书写,也就是优先级为1的优先级最高,优先级14的优先级最低。
2、 结合性是指运算符结合的顺序,通常都是从左到右。从右向左的运算符最典型的就是负号,例如3±4,则意义为3加-4,符号首先和运算符右侧的内容结合。
3、 instanceof作用是判断对象是否为某个类或接口类型,后续有详细介绍。
4、 注意区分正负号和加减号,以及按位与和逻辑与的区别
其实在实际的开发中,不需要去记忆运算符的优先级别,也不要刻意的使用运算符的优先级别,对于不清楚优先级的地方使用小括号去进行替代,示例代码:
int m = 12;
int n = m << 1 + 2;
int n = m << (1 + 2); //这样更直观
这样书写代码,更方便编写代码,也便于代码的阅读和维护。
着重强调位运算符
1、“与”、“位与”(&)
按位“与”操作符,如果两个数的二进制,相同位数都是1,则该位结果是1,否则是0.
例1 5&4
5的二进制是 0000 0000 0000 0101
4的二进制是 0000 0000 0000 0100
则结果是 0000 0000 0000 0100 转为十进制是4。
2、“或”、“位或”(|)
按位“或”操作符,如果两个数的二进制,相同位数有一个是1,则该位结果是1,否则是0
例2 5 | 4
5的二进制是 0000 0000 0000 0101
4的二进制是 0000 0000 0000 0100
则结果是 0000 0000 0000 0101 转为十进制是5。
3、“异或、“位异或”(^)
按位“异或”操作符,如果两个数的二进制,相同位数只有一个是1,则该位结果是1,否则是0
例3 5 ^ 4
5的二进制是 0000 0000 0000 0101
4的二进制是 0000 0000 0000 0100
则结果是 0000 0000 0000 0001 转为十进制是1
4、“非”、“位非”(~)也称为取反操作符
按位“非”操作符,属于一元操作符,只对一个操作数进行操作,(其他按位操作符是二元操作符)。按位“非”生成与输入位相反的值,——若输入0,则输出1,若输入1,则输出0。
结论:
比如整数为i,那么整数的取反结果是:-(i+1);
比如负数为-i,那么整数的取反结果是:i-1;
1、机器数
一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.
“比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。
那么,这里的 00000011 和 10000011 就是机器数。”
2、真值
因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
“例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1”
3.原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
“[+1]原 = 0000 0001
[-1]原 = 1000 0001”
4.反码
反码的表示方法是:
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
一般我们要把反码转换成源码才能看懂。
5. 补码
补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.