一、java概述
创建时间:1991年,命名OAK,是SUN公司推出,1995开始以java名义推出
创建人:Java之父詹姆斯·高斯林
分类:JavaSE,JavaEE,JavaME
二、java特性
面向对象,跨平台,自动垃圾回收,多线程(jvm四大特性)
java是准动态强类型解释性语言
java的准动态主要体现在反射机制
三、注释
1、单行注释
//这是单行注释
2、多行注释
/**
*这
*是
*多
*行
*注
*释
*/
四、数据
1、数据概念
程序:命令的集合
源文件是文本文件
二进制文件是电脑处理的文件
编写文本的是编辑器
把文本转为二进制文件的编译器
2、单位
bit:比特,最小的单位,位
byte:字节,一个字节是8位
最高位表示符号位,0表示正数,1表示负数
3、存储方式
内存:两端无限延伸的线
硬盘:螺旋线
光盘:同心圆
五、数据类型
1、分类
基本数据类型
数值型
整型
byte 字节 8bit -128~127
short 短整型 16bit
int 整形 32bit
long 长整形 64bit
浮点型
float 单浮点 32bit
double 双浮点 64bit
字符型
char 字符 16bit
布尔型
boolean 布尔 8bit
引用数据类型
类,数组,接口
注意:java中不能表示2进制,但是可以可以表示8进制,10进制
8进制:0开头
10进制:非0开头
16进制:0x开头 A-F表示10到15
2、命名规范
除了强制命名还有非强制命名
非强制命名:类名遵循大驼峰,变量名和方法名遵循小驼峰
3、类型的使用
1、整型
public static void main(String[] args){
int i_1 = 10;
//这里的10默认是int类型
System.out.print(10);
2、浮点型
public static void main(String[] args){
//float的值必须加F
float f_1 = 2.2F;
float f_2 = (float)2.2;
double d_1 = 2.0;
3、字符型
/**
char是字符型,用英文单引号表示,并且单引号中只能有一个字符
char 占用两个字节,16位,范围0~65535
*/
public static void main (String[] args){
char a = 'li'
}
4、布尔型
/**
java里面布尔型只有true和false
*/
public static void main(String[] args){
boolean flag = true;
}
5、转义符
public calss DT_04_char{
public static void main(String[] args){
//为了解决某些特殊的字符赋值,引入了转义字符\
char c_1 = '\'';
// \n 换行 \t tab键
}
}
4.数据类型的转换
1、8中数据类型中除了boolean类型之外,其他的都可以相互转换
2、低精度到高精度是自动转换(隐式转换),高精度到低精度是强制转换(显示转换)
byte->short->int->long->float->double
char->
注意short不可以自动转char,因为short是32767,char到65535
byte也不可以自动转char,因为有负数
3、强制转换会把高位截取掉,可能会造成数据错误
4、多种数据类型混合运算中,结果的类型是参与运算的类型中最大的类型
注意:byte short char int 任意之中或者多种运行,结果都是int
5.常量、变量、字面量
常量:在程序生命运行周期,值不可以更改
字面量/直接量:没有明确表示空间存储,不能重复使用
变量:在程序生命周期,值可以改变,可以理解为有名字的变量空间
变量的声明:
数据类型 变量名;
数据类型划分内存空间大小,给空间取名字,然后赋值
变量定义:
数据类型 变量名 = 赋值;
作用域:
一个大括号{}就是一个作用域,一个变量的使用范围,不会超过包含他的大括号
原码,反码,补码
原码:二进制表示法,最高位是符号位,"0"表示正,"1"表示负,其余是数值位
反码:正数的反码与原码相同,负数的反码就是对其原码逐一取反,符号位除外
补码:正数的补码与原码相同,负数的补码是在反码的末尾加1
注意:我们读取的十进制是根据原码来读取,而在内存中,数值都是以二进制补码形式保存的。
一.算数运算符
1.种类
符号 | 名称 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 取余 |
++ | 自增 |
-- | 自减 |
2.i++和i--的区别
i++:先赋值后加1
++i:先加1后赋值
只要记住程序是从左往右运行的就行
3.优先级
优先级:单目>双目>三目
单目:只有一个操作数,比如++和--
双目:1+2
4.注意
0.1+0.2不等于0.3
所以千万不要使用小数进行比较
二.关系运算符
1.分类
符号 | 名称 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
2.注意
==比较的是基本类型的大小,而引用类型是比较地址
==是比较,=是赋值
三.位运算符
1.分类
符号 | 名称 | 解释 |
---|---|---|
& | 位与 | 两边都是true,结果才是true |
| | 位或 | 两边一个是true,结果就是true |
! | 位非 | 取反 |
^ | 位异或 | 两边不一样,结果就是true |
~ | 按位非 | 将内存中的二进制位逐一取反(注意内存中保存的是二进制的补码) |
>> | 右移运算符(考虑符号位) | 二进制向右移动 |
<< | 左移运算符(考虑符号位) | 二进制向左移动 |
>>> | 右移运算符(不考虑符号位) | 二进制向右移动 |
&& | 且,短路与 | 和 & 一样,如果第一个是false,第二个就不执行了, 但是 & 第二个也会执行 |
|| | 或,短路或 | 如果第一个是true,第二个就不执行了, 但是 |第二个会执行 |
2.>>和>>>详解
>>和<<
符号位不变
8>>2 0000 1000 运算后: 0000 0010 结果:2 面试经常问的就是如何计算2的3次方 result = 2<<2; 因为是直接操作内存中的2进制数,所以会比较快 8<<2 运算后:0010 0000 -1<<2 -1的原码:1000 0001 反码:1111 1110 补码:1111 1111(内存中保存的就是补码) <<运算后:1111 1100 反码:1111 1011 原码:1000 0100 结果:-4 -1>>2 -1的原码:1000 0001 反码:1111 1110 补码:1111 1111(内存中保存的就是补码) >>运算后:1111 1111 结果没有变
规律:
符号位不变,移动其他位
>>>
符号位变
8>>>2 补码:0000 1000 >>>后:0000 0010 -128>>>2 -128的原码:1000 0000 反码:0111 1111 补码:1000 0000(内存中保存的就是补码) >>>运算后:1110 0000
注意没有<<<
注意:以上的都是模拟8位2进制数来计算的,实际上-128没法表示,如果你会的话评论下面教教我
四.赋值运算符
符号 | 解释 |
---|---|
= | 把左边的值赋值给右边 |
+= | i+=2等价于i = i + 2 |
-= | i-=2等价于i = i - 2 |
*= | i*=2等价于i = i * 2 |
/= | i/=2等价于i = i / 2 |
%= | i%=2等价于i = i % 2 |
注意:
byte b = 2; b = (int)(b + 2);//需要强转 b += 2;//不需要强转
五.字符串连接符
"+"号既是数值运算符号也是字符串的拼接符号
String str = "hello"; int a = 10; str = str + a;//str会变成hello10
六.三目运算符
语法 : boolean表达式 ? 真语句 : 假语句;
int i = 0; // 需求 : 如果为真 给变量i 赋值1,否则赋值 11 i = 2<3 ? 1 : 11;
七.优先级
以下优先级由高到低
运算符分类 | 结合顺序 | 运算符 |
---|---|---|
分隔符 | 左结合 | .[]();, |
一元运算符 | 右结合 | ! ++ – - ~ |
算术运算符 | 左结合 | * / % + - |
移位运算符 | 左结合 | << >> >>> |
关系运算符 | 左结合 | < > <= >= instanceof == != |
逻辑运算符 | 左结合 | ! && ||~ & |^ |
三目运算符 | 右结合 | 布尔表达式?表达式1:表达式2 |
赋值运算符 | 右结合 | = *= /= %= += -= <<= >>= >>>= &= *= |= |
一.顺序结构
从上往下,从左到右执行
二.分支结构
通过某个判断条件,选择不同的执行分支
2.1单分支
有不执行情况
if(boolean表达式){ //success do }
2.2双分支
肯定会执行
if(boolean表达式){ //success do }else{ //fail do }
2.3多分支
2.3.1 if else
else结尾肯定会执行,否则有不执行情况,多分支只会有一个执行
if(boolean表达式){ //success do }else if(boolean表达式){ //success do }else{ //fail do }
注意:如果分支下只有一条语句,那么可以不用加括号
2.3.2 switch
语法 : switch( 变量 ){ case 值: java语句; break; // 可以不写 case 值: java语句; break; case 值: java语句; break; default: // 可以不写 默认执行程序; }
注意:1.7之前 ,只能传入整型(byte,short,char,int) 自动类型转换 1.7开始,还可以传入字符串
三.循环结构
3.1for循环
for循环又被称为计数循环
语法:
for(表达式1;表达式2;表达式3){ //要循环做的事 }
表达式1 : 是初始化表达式,最先执行,且执行一次
表达式2 : 必须是boolean类型的表达式
表达式3 : 步长
例子:输出0-9之内的偶数
for(int i = 0;i<10;i+=2){ System.out.println(i); }
运行过程:
表达式1---->判断表达式2真假------>(真)执行循环体---------->表达式2判断真假(循环执行)
------->(假)退出循环
循环三要素:
初始值,终止条件,步长
嵌套循环
九九乘法表
for(int i = 1;i<10;i++){ for(int j = 1;j<=i;j++){ System.out.println(j+" * "+i+"="+i*j); } }
3.2while循环
while循环又被称为真假循环
语法:
while(boolean表达式){ java代码; }
for和while的执行次数都是0~n次
某个次数范围内,for有优势
某个条件为真的条件下,while有优势
3.3do..while...
保障代码至少执行一次
先执行后判断
语法:
do{ java语句; }while(boolean表达式);
四.break,continue,return
break
1.用于switch语句中,结束分支语句,防止case穿透现象
2.用于循环体中结束循环执行,默认结束最近的一次循环
continue
跳过本次循环,继续下次循环
return
结束方法
五.内层循环结束外层循环方法
方法一
boolean flag = false; for(int i = 0;i<10;i++){ for(int j = 0;j<10;j++){ if(i==5&&j==5){ flag = true; } } if(flag == true){ break; } }
方法二
boolean flag = false; outer:for(int i = 0;i<10;i++){ for(int j = 0;j<10;j++){ if(i==5&&j==5){ break outer; } } }
一.方法
1.1概述和作用
一堆代码的集合,可以重复使用
1.使程序变得简洁更清晰
2.有利于程序维护
3.提高开发效率
4.提高代码重复性/复用性
1.2方法声明
[修饰符列表] 返回值类型 方法名(参数列表){方法体}
[]:0-n个
1.方法修饰符列表,是可选的:
权限控制:public private protected,默认(不写)
static(声明静态),abstract,synchronized,finall
2.返回值类型:11中数据类型的任意一种,或者是void
3.方法名:合法的标识符即可(大小写字母,下划线,美元符号,数字,数字不能打头,不能使用关键字和保留字)
4.参数列表,可以有,可以没有,可以有多个,过个之间使用逗号隔开
形参:形容参数,在方法声明的时候,规定传入什么类型的数据
实参:调用方法的时候,时间传入的数据
5.方法体:要做的事情,代码的集合
如果有返回值类型,那么方法体中,最后一条语句必须写return 数据;
如果没有返回值类型,那么方法体中可以没有语句,如果要加return语句,那么return之后不能有数据
只能写return;.此时return只有终止方法运行的作用.
1.3方法的分类
静态方法:使用static关键字修饰的方法.类相关
成员方法没有使用static关键字修饰的方法.对象相关
构造方法用于创建对象
静态方法
public static void test(){}
成员方法
public int test(){}
构造方法(没有返回值,方法名和类名一样)
public Test(){}
1.4方法的调用
方法不调用不执行,调用才执行,并把结果返回到调用处
1.静态方法:类名.静态方法名(参数值);
2.成员方法:对象.成员方法(参数值)
3构造方法:使用new关键字调用
1.5返回值
1如果方法有返回值,必须有return
2 如果方法没有返回值,可以没有return
注意:return语句的后面不可以有语句
1.6方法的重载
方法重载:overload
方法名相同,参数列表不同(个数或者类型不同)
在同一个类中,方法名是允许相同的,可以根据方法名和参数列表来确定一个方法
例子:
public static void sum(int a,int b){ System.out.println(a+b); } public static void sum(double a,double b){ System.out.println(a+b); } public static void sum(byte a,byte b){ System.out.println(a+b); }
注意:只考虑方法名和参数列表
作用:记忆方便,代码简洁
二.内存划分
程序:一堆命令的集合,是可执行文件,并且是个静态概念,一般保存在硬盘中
进程:就是正在执行的程序,是个动态概念,会按照程序设计,一步步在内存中执行
java中的内存划分:
java Runtime Data Area: java运行时数据区,也可以叫jvm内存
内存被划分为5个区域:程序计数器,方法区/静态区,栈内存,堆内存,本地方法栈
2.1程序计数器:
是一块比较小的内存区域,可以看做是当前执行的字节码位置,分支,循环,跳转,异常等都需要依赖程序计数器,可以理解为保存执行的代码行号,每个方法都会有一个计数器,否则不知道返回值要返回到哪里
2.2.方法区/静态区
保存我们的程序文件(class),载入内存后的那个文件,java中就是calss文件
包括方法,还有代码段,内部的运行常量池
2.3栈内存
虚拟机栈/VM栈/栈内存
方法是在栈内存中执行的,包括局部变量也是在栈内存
栈内存:就是一个以栈为数据结构模型的一段内存空间
栈:先进先出,比如弹夹
栈的构成:
栈空间:就是指以栈数据结构为模型的于丹内存空间
栈帧:栈内存中的每一个元素
栈底元素:最先入栈的元素
栈顶元素:最后入栈的元素
栈操作:
压栈:元素入栈的操作
弹栈:元素出栈的操作
2.4堆内存
用来存放对象
每个对象的空间分为3块:
1.数据部分:成员变量
2.头部:hashCode值
3.类型:保存类文件在静态区的地址
2.5本地栈
为虚拟机执行使用到的Native方法服务,本地方法栈 和 VM栈 结构一样
2.6java内存模型图解