目录
1.1 关键字、标识符和注释
关键字: key word 被高级编程语言赋予特殊含义的一些英文单词,特点 都是小写字母 不能随便使用。
不是关键字,但也是具有特殊含义的一些单词,像String,system都是java内置类,像这种java自带类我们也不能随便使用。
标识符: 指的是再程序中我们程序员为一些数据起的名称,自定义名称
类名,变量名,函数名(主函数的名称main虽然不是关键字 本身标识符 但是比较关键 对于jvm主函数只认main)
起名规则:
1.由数字、字母和下滑线_和美元符$组成,其中数字不能开头,必须是一个连续的词
2.严格区分大小写
3.不能使用关键字和java内置类的名称
起名规范(最主要的含义就是通过单词的组成从而可以更快地看出数据所代表的含义):
1.变量/函数:第一个单词首字母小写,其他单词首字母大写 myAge yourBoyfriend test()
2.类/接口:所有单词的首字母大写 System String
3.常量:所有字母大写 单词和单词之间用_ 分隔 MAX_VALUE pi
4.包名:所有字母小写,单词与单词之间用. 分隔(文件层级)
1.2 常量
常量
从数据量的角度而言,表示不变的量
从代码的角度而言,就是直接在程序中出现的数据 也称之为字面量
还有一种是通过变量的形式 将一个具体的常量给他符号化pi
\u 在Unicode字符集中 取编号为00AF’的字符9
1.3 变量与数据类型
变量
所谓的变化的量
变量是临时存在的
变量存的是临时的值 也是可变的
变量存的值可变范围必须是同类型的
变量存的值是有限的
变量要存数据 就需要消耗空间
变量的本质:变量就是内存中的一个临时空间,该空间有真实物理地址(指针),但是为了方便使用该空间,所以起一个别名-变量名,用来存储有大小限制的并且变化是在同一个类型(向下兼容也行)的常量
数据类型
数据类型主要决定的是变量存储值的大小限制和常量类型,也决定了变量的类别。
在java当中,数据类型分两大类别
基本数据类型(数据值直接存在变量空间里)
整型
byte 1字节 8比特
short 2字节 16比特
int 4字节 32比特(默认使用 整型常量默认int类型)
long 8字节 64比特
浮点型
float 4字节
double 8字节
布尔型
boolean 不确定字节数目
boolean b= true;
对于单一的布尔类型变量而言,JVM将true解析为1,false 0,1和0都是整型常量 默认int类型4字节
boolean[]bs =new boolean[5];
对于布尔类型的数组而言,jvm将每一个数据空间解析为byte
字符型
char 2字节 0---65535因为编码都是正数和零
。引用数据类型(数据值存在堆内存,变量空间里存的是数据值在堆内存中的地址)
字符串
数组
对象
1.4 运算符
算数运算符
+
-
*
/
%
i++(先用后加)
1.开辟临时存储取 将i的值赋值进取
2.i自身+1
3.临时存储取等待被调用 (输出 赋值 运算)
++i(先加后用)
1.i自身+1
2.等待被调用(输出 赋值 运算)
赋值运算符
+=
-=
*=
/=
%=
=
逻辑运算符
两边一定是布尔 结果一定是布尔
&单与
|单或
!非 取反
&& 双与
||双或
^异或
public static Sample{
public static void mian(String[] args){
int x=0;
int y=0;
System.out.println(x++ > 0& y++ >0);
System.out.println("x = " + x);//1
System.out.println("y = " + y);//1
//&两边都执行
int a=0;
int b=0;
System.out.println(a++ > 0&& b++ >0);
System.out.println("a = " + a);//1
System.out.println("b = " + b);//0
//&& 左边一旦为假 右边不执行
//|两边都执行
//|| 左边一旦为真 右边不执行
}
}
与:有假则假 全真则真
或:有真则真 全假则假
异或:相同为假 不同为真
比较运算符
目前而言 两边一定是数值 结果一定是布尔
‘>’
‘<’
‘<=’
‘>=’
‘!=’
‘==’
位移运算符
&与
|或
^异或
//利用异或法进行两个数之间的转化
int a = 3;
int b = 7;
a= a ^ b;
/*
0011
0111
0100 a 4
*/
b= a ^ b;
/*
0100
0111
0011 b 3
*/
a= a ^ b;
/*
0100
0011
0111 a 7
*/
‘>>’
‘<<’
int n = 2;
n << 5;//左移运算符
// 0000 0000 0000 0010
// 0000 0000 0100 0000 (左移后得到)
int j = 168;
j >> 4;//右移运算符
// 0000 0000 1010 1000
// 0000 0000 0000 1010 (右移后得到 右移后1被移除)
1.5 循环
while
基本结构
while(判断条件){
循环体 (一条或多条语句)
}
当判断条件不成立时循环结束
do-while
基本结构
do{
循环体
}while(判断条件)
do-while循环 不管判断条件是否成立
都会先执行循环体一次
for
基本结构
for(声明循环增量;判断条件;增量自增){
循环体
}
for(int i = 0; i < 5; i++){
sout("循环内");
}
sout("循环外");
1.6 数组
1.声明
- 数据类型 [] 数组名称 =
new
数据类型[元素个数或数组长度] - 元素类型[] 数组名 = new 元素类型[]{元素,元素,……};
2.数组遍历
public static void main(String[] args) {
int[] arr = new int[]{1,2,3,4};
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public static void main(String[] args) {
int[] arr = new int[]{1,2,3,4};
for (int i: arr
) {
System.out.println(i);
}
}
数组的特点:
1.数组中的每一个变量空间的数据类型必须是一致的
2.数组一旦创建出来,其长度不可修改,但其内容可以在兼容的情况下修改
3.数组提供角标来访问元素。长度为n的数组 角标0~n-1
4.数组本身是一个对象,在堆内存中创建的,在堆内存中创建的数据有一个特点,就是有默认初始化值,相对应的数据类型的零值
5,数组有且只有一个数据length表示数组的长度
数组扩容
public static void main(String[] args) {
int[] arr ={1,2,3,4};
arr = add(arr,10);
}
private static int[] add(int[] arr, int i) {
int[] newArr = new int[arr.length+1];//创建一个新数组 是原先数组长度+1
for (int j = 0; j < arr.length; j++) {
newArr[i]=arr[i];//将原来数组中的数据挨个赋值到新数组中
}
newArr[newArr.length - 1] = i;//将新元素放入到新数组最后
return newArr;
}
1.7 函数
函数主要解决具有重复性的且有独立功能的代码块,将这些代码块进行抽取生成函数方便后期调用,并解决了代码多余问题
Java当中的语法格式:
权限修饰符 函数类型修饰符 返回值类型 函数名(参数列表){
函数体
(return 返回值)
}
权限修饰符:表示的是该函数的调用权限 public protected 默认 private
函数类型修饰符:
static 静态函数 native 本地函数 abstract 抽象函数 synchronized 同步函数
返回值类型:函数计算的结果,如果需要向调用者返回,则标记为计算结果的数据类型;如果不需要返回,则写为void
函数名:对于该功能的描述命名
参数列表:就是外界传给函数的一些数据,这些数据一般称之为是形式参数,外界传递的数据称之为是实际参数
函数体:具有独立功能的代码块
函数只能定义在类中,函数中不能定义函数
函数内存运行原理
函数的运行是基于栈的,每一个函数都是栈中的元素,我们把这个元素称之为栈帧(栈帧主要包含的是函数所有的字节码信息,如果在极端情况下一个栈帧过于大,则导致栈结构存不下,导致栈内存溢出异常StackOverFlowError;如果栈帧进入的过多,也会导致栈内存存不下,栈内存溢出)一般第一个进栈的栈帧是主函数,一个栈帧一旦进入到栈里面,则开始逐个执行,如果在执行的过程中,有调用了其他函数,此时当前栈帧暂停运行,新函数的栈帧进栈,开始逐个运行,直到运行完毕遇到return则弹栈,当前栈顶 的栈帧继续执行。
但凡在函数中创建的变量,统称为局部变量(变量的访问范围只在该函数中),所以形式参数也是一种局部变量
函数的递归
第一种层面的理解:从函数内存运行角度而言,递归其实就是指函数在调用函数自身
public class M{
public static void main(String[] args){
show();//函数在不停的进栈运行,直到栈内存不够用了,会导致栈内存溢出的问题
}
public static void show(){
System.out.println("show.....");
show();//想当与写了一个没有退出情况的死循环,递归不能无限制的调用,需要一定的结束条件
}
}
第二种层面的理解:从算法角度而言,递归就是自动推理和推导的过程(数学归纳法)
最常用的两大算法思想,迭代(for while循环) 递归