VScode Java environment deploy

Download and insatll JDKadd bin to environment variable

Download Extension Pack for Java plug that include sie Extension Pack in VScode
refer document

Java 运行原理

alt text

Java 基础语法

变量

  • 变量名不能重复
  • 在一条语句中,可以定义多个变量。但是这种方式影响代码的阅读。
  • 变量在使用之前必须要赋值。

数据类型

基本数据类型(4类8种)

变量存储的是真实的数据,赋值给其他变量是真实的值

数据类型 关键字 内存占用 取值范围
整数 byte 1 负的2的7次方 ~ 2的7次方-1(-128~127)
short 2 负的2的15次方 ~ 2的15次方-1(-32768~32767)
int(default) 4 负的2的31次方 ~ 2的31次方-1
long 8 负的2的63次方 ~ 2的63次方-1
浮点数 float 4 1.401298e-45 ~ 3.402823e+38
double(defalut) 8 4.9000000e-324 ~ 1.797693e+308
字符UTF-16 编码 char 2 0-65535
布尔 boolean 1 true,false

引用数据类型

变量存储的是地址值,真实的数据在堆空间中,赋值给其他变量是地址值,多个变量指向同一个地址

标识符定义规则

必须

  • 必须由数字、字母、下划线_、美元符号$组成。
  • 数字不能开头
  • 不能是关键字
  • 区分大小写。

建议

  • 变量名和方法名: 小驼峰命名法
  • 类名: 大驼峰命名法

运算符和表达式

运算符

  • 算术运算符: + - * / %
  • ++ 自增/减运算符:++、– 。前缀:使用值之前增减,后缀:使用值之后增减。
  • 赋值运算符: =
  • 扩展赋值运算符: +=、-=、*=、/=、%=,扩展的赋值运算符中隐层还包含了一个强制转换
    byte a = 10;
    byte b = 20;
    // a += b;
    a = (byte)(a+b);
  • 关系运算符: ==、!=、>、<、>=、<=
  • 逻辑运算符: &、|、^、!
  • 短路逻辑运算符: &&、||
  • 三元运算符: 关系表达式 ? 表达式1 :表达式2 ;
    //关系表达式的值为真,那么执行表达式1,否则执行表达式2
    a > b ? a : b;

运算符优先级

表达式

  • 用运算符把常量或者变量连接起来的,符合Java语法的式子就是表达式,表达式都有值

转换

隐式转换

  • 取值范围小的,和取值范围大的进行运算,小的会先提升为大的,再进行运算。
  • byte、short、char三种类型的数据在运算的时候,都会直接先提升为int,然后再进行运算。(字符到计算机内置的ASCII码表中去查对应的数字,然后再进行计算)

强制转换

  • 书写格式:目标数据类型 变量名 = (目标数据类型)被强转的数据;
  • 强制转换有可能会导致数据的精度丢失

流程控制语句

顺序结构

if语句结构

格式1:              
if (关系表达式) {
语句体;
}
格式2:
if (关系表达式) {
语句体1;
} else {
语句体2;
}
格式3:
if (关系表达式1) {
语句体1;
} else if (关系表达式2) {
语句体2;
}

else {
语句体n+1;
}

switch语句结构

switch (表达式) {
case 1: // jdk12新特性:case 1 -> {},和带有break的效果一样,代码一行{}可以省略
语句体1;
break; //如果没有break会依次从匹配的case往下执行
case 2:
语句体2;
break;
...
default: //如果所有的case都和表达式的值不匹配,就会执行default语句体部分,
default可以放在任意位置,也可以省略
语句体n+1;
break;
} //可以用变量接收switch值 变量 = switch(表达式)

循环结构

  • for循环
    for (初始化语句;条件判断语句;条件控制语句) { 
    循环体语句;
    }
  • while循环
    初始化语句;
    while(条件判断语句){
    循环体;
    条件控制语句;
    }
  • do…while循环
    初始化语句;
    do{
    循环体;
    条件控制语句;
    }while(条件判断语句);

无限循环

for(;;) {} //条件判断语句可以空着不写,如果不写,默认表示true,循环一直进行。
while(true) {} //小括号里面就不能省略了,true一定要写出来,否则代码会报错,do while 相同
do{} while(true);

条件控制语句

  • break:不能单独存在的。可以用在switch和循环中,表示结束,跳出的意思。
  • contiune:不能单独存在的。只能存在于循环当中。表示跳过本次循环,继续执行下次循环

数组

定义格式

  1. 格式一:数据类型 [] 数组名,比如:int [] array(常用)
  2. 格式二:数据类型 数组名 [],比如: int array []

静态初始化

  • 完整格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3,元素4…};
  • 简化格式: 数据类型[] 数组名 = {元素1,元素2,元素3,元素4…};

地址值

打印数组的时候,实际出现的是数组的地址值。
数组的地址值:就表示数组在内存中的位置。
以[I@6d03e736为例:[ :表示现在打印的是一个数组。I:表示现在打印的数组是int类型的。
@:仅仅是一个间隔符号而已。6d03e736:就是数组在内存中真正的地址值。(十六进制的)

索引

  • 索引一定是从0开始的。
  • 连续不间断。
  • 逐个+1增长。

数组的遍历

for(int i = 0; i < arr.length; i++){
//在循环的过程中,i依次表示数组中的每一个索引
sout(arr[i]);//就可以把数组里面的每一个元素都获取出来,并打印在控制台上了。
}

数组的动态初始化

  • 格式:数据类型[] 数组名 = new 数据类型[数组的长度];
  • 数组的默认初始化值:
    整数类型:0
    小数类型:0.0
    布尔类型:false
    字符类型:’\u0000’ 空格
    引用类型:null
  • 静态初始化不能用于对数组重新赋值
    数组名 = {元素1,元素2,··}	//报错

二维数组

数据类型[][] 数组名 = new 数据类型[][]{元素1,··}{元素1,··}	//完整静态初始化
数据类型[][] 数组名 = {元素1,··}{元素1,··} //简化静态初始化
数据类型[][] 数组名 = new 数据类型[m][n] (n))可以省略 //动态初始化

二位数组内存图

java内存分配

jdk8开始取消方法区,新增元空间,把方法区的功能进行拆分,放到堆和元空间中
java内存分配
java内存分配
两个数组指向同一个空间内存

int arr1 = {1,2};
int arr1 = arr2; //把arr2数组地址值赋值给arr1,两者指向同一片内存空间

方法

方法(method)是程序中最小的执行单元

定义和调用

//方法定义
public static 返回值类型 方法名(int num1, int num2){ //参数可省略
... //方法体
return 数据; //返回值类型为void可省略;
}
//方法调用,进栈先进后出
方法名(参数1,参数2);
数据类型 变量名 = 方法名 ( 参数 ) ;
  • 方法不能嵌套定义
  • 可以单独的书写return,后面不加数据,表示终止方法体执行

方法重载

方法重载指同一个类中定义的多个方法之间的关系,满足下列条件的多个方法相互构成重载

  • 多个方法在同一个类中
  • 多个方法具有相同的方法名
  • 多个方法的参数不相同,类型不同或者数量不同

重载仅针对同一个类中方法的名称与参数进行识别,与返回值无关,换句话说不能通过返回值来判定两个方法是否相互构成重载

方法值的传递

传递基本数据数据类型时,传递的是真实的数据,只是在方法中copy一份,形参的改变不影响实参的值
方法基本数据类型的传递
传递引用数据类型时,传递的是数据的地址值,形参的改变会影响实参的值
方法引用数据类型的传递