资讯详情

java SE部分以及数据库学习笔记

Day01 类名:每个单词首字母大写 main方法是程序的入口 一个java多个源文件可以出现在源文件中class例如,有五个定义class,然后在编译后,将生成5个class文件,有多少class定义会产生多少个定义class文件

public : 还有一个公共的java只有一个文件public类,且public类名必须与文件名一致 class :类,定义类关键词 HelloWorld : 只能是: 大大小小的字母,美元符号$,下划线_,数字,数字不能开始,不能使用关键字和保留字,public的类的类名,必须和文件名一致

命名时要注意: 只有大小写字母 A-Za-z 数字0-9 下划线 _ 美元符号 $ 数字不能打头 不能使用关键词和保留词 关键字 : java已使用的单词 比如 public static void class 保留字 : java关键字尚未使用,但可用于后续新版本 goto 不能单独使用关键字和保留字,如 public1 或者 classpublic 都是可以的

JVM特性: 四大特性: 跨平台 自动垃圾回收机制 多线程 面向对象 是JVM跨平台

数据类型 命名规则 强制 : 数字,大小写字母,美元符号,下划线且不能数字开头 不能使用关键词和保留词

非强制 : 建议望文知义 驼峰命名法 ZhanGao

所有需要命名的地方都应符合本标准 文件名 类名 方法名 变量名 包名

数据存储 1 程序 集合一堆命令 它是一个静态概念,通常保存在硬盘中

2 文件类型 文本,二进制,可执行 文本文件 给人看的 二进制文件 给电脑看的

3 编辑器 编辑器编写文本文件的工具程序

4 数据的存储 数据要运算,必须先存储 5 存储方式 内存 : 无限延伸线 硬盘 : 螺旋线 光盘 : 同心圆

6 存储单位 bit : 比特是电子位 byte : 字节 = 8 bit 最高位作为符号位,以表示符号位(负数), 1 表示负数 0 表示 正数 -128 ~ 127

Day02

  1. 数据类型 1.1 本质 指占用内存空间的大小,用位和字节表示 1.2 分类 数据类型 : 基本数据类型 数值型 整数型 Byte 字节型 Short 短整型 Int 整型 Long 长整型 浮点型(小数) Float 单精度浮点型 Double 双精度浮点型 字符型 Char 布尔型 Boolean 引用数据类型 类 数组 接口

1.3 进制 Java没有办法直接表示二进制

 十进制表示法  int i_1 = 10;  八进制表示法  int i_2 = 012;    十六进制表示法  int i_4 = 0x1f;   双引号是字符串,里面的数据不会解释,所以 i_4 在内存中找不到0x1f的  System.out.println("i_4");  System.out.println(i_4);  以十六进制展示  System.out.println(Integer.toHexString(i_4)); 

1.4 类型使用 1.4.1 整数型 short s_1 = 123; byte b_1 = 123; int i_5 = 2147483647;

 java默认为中整数 int(整型)  所以 下面的代码是自动转换类型int值复制给long类型  long l_1 = 2147483647;  // 超过int上限 报错  // long l_2 = 2147483648 ;    // 如何声明long的值, 加 L/l  建议 L ,因为避免 l和1不容易区分  long l_3 = 1232167864124L;    // 最大值 : 9223372036854775807  System.out.println(Long.MAX_VALUE); 

1.4.2 浮点型

double d_1 = 1.2; // 因为浮点默认是double,所以 float必须增加声明F/f才可以 float f_1 = 1.2f;

 // 强制类型转换为float,double强制转换为float  float f_2 = (float) 1.34;  System.out.println(f_2); 

1.4.3 字符型

  • char 字符型 用 英文单引号表示 ‘’ 并且 只有一个字符
  • char = 2 byte = 16 bit
  • 字符 --> 整数 --> 二进制
  • 最初的ASCII编码
  •  'a'  97 
  •  'b'  98 
  •  'A' 65 
  •  'B' 66 
  •  '0' 48 
  •  '1' 49 

采用unicode编码

 char c_1 = 'a';  char c_2 = '2';  char c_3 = '张';  char c_4 = ' ';  System.out.println((int)c_1);  System.out.println((int)c_3);    // 测  char c_5 = '\u6D4B';  System.out.println(c_5); 
  • 转义符
  •  将有意义字符转换为无意义字符 
  • 比如 char用 ‘’ 单引号表示 并且 一个字符只能出现 ,假如我想输入 ’ 单引号 怎么办? 转义
  •  java 中 \ 表示转移符   
  •  \t : 制表符 
  •  \\ : 转义转移符 
  •  \r\n : 换行符    char c_1 = '\'';  char c_2 = '\\';  char c_3 = '\t';  System.out.println(c_1);  System.out.println(c_2);  System.out.println('\n');  System.out.println(c_3); 

Question 需要了解各种转义符 \n还是\r是换行符?

1.4.4 布尔型

  • boolean 不是 bool

  • 1 只有两个值 : true/false,没有 1和0

  • 2 默认值为false

  • 3 不参与任何类型的转换

  • 4 占用1字节,都是0表示false, 0000001表示true

  • 一般用于过程控制或逻辑判断 boolean b_1 = false; boolean b_2 = true; // 不能转换 // boolean b_3 = (boolean)1;

     if (b_2) {   System.out.println("为真");  }else{   System.out.println("为假");  } 

1.5 类型转换

  • 类型转换
  • 1 除了8种基本数据类型,boolean此外,可以转换
  • 2 精度低到精度高 是自动转换
  • 3 精度高到精度低 需要强制转换
  • 自动类型转换
  • byte --> short --> int --> long --> float --> double
  •     char -->   char和int并列,并且char可自动转换成int,可自动转换为更高精度 
  • 其他需要强制转换
  •  强制转换可能会失去精度,导致数据不准确  byte b1 = 1;  short s1 = b1;  int i1 = s1;  // char c1 = s1;  char c1 = '1';  i1 = c1;   char可自动转换成int  // s1 = 1;
     long l1 = c1;
     float f1 = l1;
     // l1 = f1;  float需要强制转换成long,高精度转换成低精度
     byte b2 = (byte) 131;
     System.out.println(b2);
     
     int i2 = 10;
     byte b3 = (byte) i2;
     System.out.println(i2);
    

1.6 混合运算

	// 混合运算
	// 当一个运算中出现多个类型的值的时候,结果一定是最大类型
	
	int i_1 = 10;
	long l_1 = 10;
	long b_1 = i_1+l_1;
	// byte  , short , char , int 四种中任意一种或多种进行运算,结果都是int类型
	int b_2 = b3+s1;

1.7 小结 Float,char,boolean三个的使用 自动转换和强制转换 转移符 混合运算

  1. 变量

2.1 常量 常量 : 整个程序生命周期中,值不能更改

字面量/直接量:也是有数据类型的, 整数默认int,小数默认double Final

	// final 修饰的  不可更改
	final int i1 = 1;
	// i1 = 2;
	System.out.println(1);

2.2 变量 可以更改的量,可以再程序执行中对值进行更改 可以复用

2.2.1 全局变量 什么是全局变量的概念 : 允许在类之外创建变量,和类同级别,那么所有的类都可以直接访问该变量,不需要二次引用 所谓二次引用,就是没有使用 . 操作符 xxx.xxxxx 首先 java不允许在类之外创建变量,但是可以将一个类的变量设置为public static修饰的,那么其他类就可以通过 该类的类名.变量名 来进行访问 全局变量的确定 : 安全性较差,容易命名冲突

所以 java引入了包概念,引用一个变量的时候必须通过该包和类才能访问 2.2.2 变量定义/声明

  • 变量声明 :
  •  数据类型  变量名 ;
    
  • 变量定义 :
  •  数据类型 变量名 =  赋值	
    
  •  数据类型划分内存空间  给空间命名  赋值(把数据保存到空间中)
    
  • 域 :
  •  空间范围,内存空间的划分
    
  •  一个 {} 大括号 就是一个作用域,变量不能超过向上碰到的第一个大括号,但是向下可以穿透域中嵌套的所有子大括号
    

Int i = 10;

int a=3,b=2,c=10; 2.2.3 变量分类

  • 变量分类 :
  •  局部变量 : 方法内部声明的变量是局部变量
    
  •  静态变量 : 类体中使用static修饰的变量是静态变量
    
  •  成员变量 : 类体中没有使用static修饰的变量是成员变量
    

2.2.4 变量调用

  •  局部变量 : 当前方法中,声明之后,直接写变量名调用即可
    
  •  静态变量 : 类名.静态变量名/当前类中调用当前类的静态变量时,类名可以省略,编译之后,JVM会自动补齐为类名调用
    
  •  成员变量 : 对象引用.成员变量名
    
     System.out.println(x1);
     System.out.println(_02_Var.x1);
     _02_Var aa = new _02_Var();
     System.out.println(aa.x);
    

2.2.5 默认值

  • 局部变量没有默认值,必须先初始化赋值之后 才能使用
  • 静态变量和成员变量 有默认值
  • 默认值: 整型 : 0 , 浮点型 : 0.0 , 布尔型 : false , 字符型 : \u0000 , 引用类型 : null

2.2.6 变量优先级 变量可以重名吗? 静态变量和成员变量 不能同名 但是局部变量和 静态变量/成员变量 是可以同名的 也就是说 有一个局部变量 i 那么 还可以再创建一个 静态变量/成员变量 i

如果静态变量和局部变量重名,那么优先使用局部变量 如果就想使用静态变量的话,可以使用类名来区分,也就是二次调用

static int age = 18;
public static void main(String[] args) {
	int age = 22;
	System.out.println(_04_Var.age);
}
  1. 操作符 3.1 算数运算符
  • 运算操作符 +,-,*,/,% ++,–

  • 运算符优先级 单目/单元运算符优先级最高 > 双目 > 三目

  • i++ 和 ++i 的区别

     int a = 10;
     int b = 3;
     System.out.println(a + b);
     System.out.println(a - b);
     System.out.println(a * b);
     System.out.println(a / b);
     System.out.println(a % b);
    
     double d1 = 0.1;
     double d2 = 0.2;
     // 0.30000000000000004
     // 注意 不要使用小数做比较
     System.out.println(d1 + d2);
    
     System.out.println("----------------------");
     // ++ : 把值取出,+1,再放回去
     int k = 100;
     // 只要是单独出现,不管k在前还是k在后,都一样,原数+1即可
     // k++;
     // ++k;
     Question   k++和++k区别需要完全搞明白
     // 201 如果是 k++ ,就会申请一块临时空间,把k中的值先保存到临时空间中,然后k++的这个k 就指向临时空间中的值
     // 然后计算++ , 计算完++ 后,继续后续操作 100+k
     // 如果是 ++k 那么 k 就不需要指向临时空间了
     
     // k++ : k使用的是++之前的值
     // ++k : k使用的是++之后的值
     // 但是 ++ 优先级 大于 双目和三目
     k = k++ +k;
     System.out.println(k);
     
     int w = 10;
     w = w++ * w;
     System.out.println(w);
     
     int m = 10;
     int e = 2+m++;
     System.out.println(e);
     System.out.println(m);
     
     int p= 2;
     p = 2 + p++ + ++p + p++ + ++p;
    

// p = 2 + 2 + ++p + p++ + ++p; p=3 // p = 2 + 2 + 4 + 4 + 6; p=6 System.out.println§;

	int x = 10;
	x = 10 + x++ + ++x +(10 * x++) + ++x;

// x = 10 + 10 + 12 +120 + 14; x=14 System.out.println(x);

	int i = 10;
	i= i++ + (i +1);
	System.out.println(i);

3.2 关系运算符

  • 关系运算符
  •  运算结果 是 boolean型  (true/false),可以叫布尔型表达式
    
  • = < <=

  • == : = 是赋值操作,java中 判断相等 使用 ==
  •  	如果是基本类型,比较值的大小
    
  •  	如果是引用类型,比较内存地址
    
  • != : 不等于
  • 常用于流程控制

3.3 位运算符

  • 位运算
  •  &  位与  , 两边都是true 结果才是true,也可以两边是数字
    
  •  |  位或 一边为true 结果就为true
    
  •  ! 位非,取反   !true 就是false   , !false 就是true
    
  •  ^ 异或  ,两边不一样就是true
    
  •  ~ 按位非,转换为二进制,然后 每位取反
    
  • 逻辑 比较
  •  && : 短路与,如果 第一个就为假,第二个表达式就不执行了,结果为假
    
  •  || : 短路或,或,如果第一个为真,第二个就不执行了
    
  • : 右移运算符(考虑符号位,符号位不移动,正数就是正数,负数就是负数)

  •  	8 >> 2
    
  •  		0000000 10  转换为二进制,然后符号位之后补两个0,最右边删除两位
    
  •  	右移  8 >> n  就等于 8 / 2^n
    
  •  	如果是 -8 >>2  就是补1  
    
  • << : 左移运算符(不考虑符号位),向最左边补0
  • : 右移运算符(不考虑符号位)

  •  	如果是正数  和>> 没有区别,因为最前面都是0
    
  •  	但是负数就不一样了, >> 只会在符号位之后补1 , 而 >>> 在符号位之前 补0
    
  •  	所以 -1 >>> 1 就成了  2147483647     question  位移运算符需要搞清楚
    

day03 4. 运算符 4.1 赋值运算符

  • = 赋值运算符
  •  	=   : 把右边的赋值给左边,如果右边是个运算,需要把运算结果赋值给左边
    
  •  	+= : 左边和右边相加,结果赋值给左边
    
  •  	-= : 左边 减去 右边 结果赋值给左边
    
  •  	*= .....
    
  •  	/=  .....
    
  •  	%= .....
    
  • i = i + 10;
  • i += 10;
  •  虽然两个式子是等价的,但是还不一样, i++ 和 += 这些写法,不需要强制转换,当然精度还是会丢失,这种写法会自动帮我们强制转换
    
  •  但是像  i = i+10; 这种 如果 i 是byte类型 或者short类型  就需要强制转换,因为byte,short,int,char四种类型进行混合运算时结果是int类型的
    

4.2 字符串连接符

    • 即是加减运算符,也是字符串连接符,用于把多个字符串拼接成一个字符串
  • 字符串 用 “” 双引号表示

4.3 三目运算符 也可以叫三元运算符

boolean条件表达式 ? 真语句 : 假语句;

  1. 流程控制 5.1 顺序结构 严格从上往下 从左到右执行 5.2 分支结构 通过某个判断条件,选择性执行某一个分支

5.2.1 if…else…

  • 语法结构
  • 第一种结构 : 有不执行情况
  •  if( boolean表达式 ){ 表达式为true 就执行java代码  为false就不执行
    
  •  	java代码;
    
  •  	java代码;
    
  •  }	
    
  • 第二种结构 : 没有不执行情况
  •  if( boolean表达式 ){ 表达式为true 就执行java代码1  为false就执行 else 中 java代码2
    
  •  	java代码1;
    
  •  	java代码1;
    
  •  }else{
    
  •  	java代码2;
    
  •  	......
    
  •  }			
    
  • 第三种结构 : 有不执行情况
  •  if( boolean表达式 ){ 
    
  •  	java代码1;
    
  •  	java代码1;
    
  •  }else if( boolean表达式 ){
    
  •  	java代码2;
    
  •  	......
    
  •  }	
    
  • 第四种结构 : 没有不执行情况
  •  if( boolean表达式 ){ 
    
  •  	java代码1;
    
  •  	java代码1;
    
  •  }else if( boolean表达式 ){
    
  •  	java代码2;
    
  •  	......
    
  •  }else{
    
  •  	.....
    
  •  }	
    
  • 注意 : if分支语句,只会有一个分支执行,一个执行 整个分支结束
  •  上面 1,3 有不执行情况, 2,4 一定会有一个分支执行
    

5.2.2 Switch

  • switch语句
  •  1.7之前 只能传入 int整型(能传入整型,也就可以传入 byte,short,char,自动类型转换)
    
  •  1.7开始,包括1.7,可以传入 字符串
    
  • 语法 :
  •  switch( 值 ){
    
  •  	case 值 :
    
  •  		java代码;
    
  •  		......
    
  •  		break;
    
  •  	case 值 :
    
  •  		java代码;
    
  •  		......
    
  •  		break;
    
  •  	case 值 :
    
  •  		java代码;
    
  •  		......
    
  •  		break;
    
  •  	default :
    
  •  		java代码;
    
  •  }
    
  • default 可以没有,如果没有的话,就有不执行的情况,
  •  如果所有的case 都不符合条件,就执行default
    

注意 break : 必须要写,如果不写 就会发生case穿透现象

合并 利用case穿透完成

5.3 循环结构 重复执行某些代码很多次

5.3.1 For

  • for 循环 :
  •  计数循环,在某个次数范围内,重复执行某些代码
    
  • 语法 :
  •  for( 表达式1 ; 表达式2 ; 表达式3 ){
    
  •  	// 循环体
    
  •  	java代码;
    
  •  }
    
  • 先执行表达式1,并且只执行一次
  • 执行表达式2,结果必须是boolean型,如果是true,就执行循环体,如果是false就终止循环
  • 假设是true,执行循环体,循环体执行完成后,执行表达式3
  • 执行完表达式3之后,再执行表达式2,如果是false 终止循环,如果是true 执行循环体,执行表达式3 , 执行表达式2 …
  • 表达式1 : 初始条件
  • 表达式2 : 终止条件
  • 表达式3 : 步长
  • 循环三要素 :
  •  初始值,终止条件,步长
    
  •  缺一不可
    

5.3.2 While

  • while循环 是真假循环,在某个条件为真的情况下执行
  • 语法 :
  •  while( boolean表达式 ){
    
  •  	循环体;
    
  •  }
    

5.3.3 Do…while…

  • while 有不执行情况,所以执行次数是 0~N次
  • 但是 do…while… 能够保证代码 至少执行一次, 1~N次
  • 语法 :
  •  do{
    
  •  }while(boolean表达式);
    

5.4 跳转语句 5.4.1 Break

  • break语句
  •  1 用于switch中,结束分支语句,避免发生case穿透
    
  •  2 用于循环中,终止当前循环
    
  • break 结束循环
  • continue 跳过当前次,继续下一次循环
  • return 结束方法,并返回一个数据

5.4.2 Continue continue : 跳过当前次循环,继续下次

day04 6. 方法 6.1 概述和作用 一堆代码的集合,可重复使用

1)使程序变得更简短更清晰 2)有利于程序维护 3)提高程序开发效率 4)提高代码重用性

  • 方法目的 : 代码重用

  •  相同的操作,不用重复写多遍代码
    
  • 方法就是有名字的代码块 : 一个大括号{} 就是一个代码块/语句块/代码段

  • java 中只有方法, c 中只有函数, C++就不一样了,写在类中,叫方法,写在类外叫函数

  • 或者说 面向对象语言中 只有方法,面向过程中只有函数

  • 函数 是可以直接调用的,不需要二次引用 6.2 方法声明

  • 方法声明 :

  •  结构 :  [修饰符列表]  返回值类型  方法名  (参数1,参数2,参数3......) { 方法体; }
    
  •  		[] 加中括号 说明 可以有,可以没有,可以有多个
    
  •  		修饰符 : 
    
  •  			权限控制 : public , protected , private  三选一 , 
    
  •  			其他修饰 : static ,synchronized  
    
  •  							abstract , final 二选一
    
  •  		返回值类型 : 11种数据类型任意一种即可,如果不需要 返回值,就写 void
    
  •  		方法名 : 合法标识符即可
    
  •  		参数列表
    
  •  				形参 : 方法的声明处,规定传入的数据的类型以及个数
    
  •  				实参 : 方法的调用处,传入具体的数据
    
  •  		方法体 : java代码
    
  •  		return : 终止方法执行,并且return后不可以写代码
    
  •  			1 没有返回值类型的时候(void) : return可以有 可以没有,如果有,return只能起到结束方法运行的作用
    
  •  					并且 语法是 return; 
    
  •  			2 如果有返回值的情况下(不是void) : 方法体中 必须要有return语句,并且return语句需要跟一个返回的数据
    
  •  					语法是 : 比如返回值为 int    return int值 ; 
    

6.3 方法调用

  • 方法调用 :
  •  方法不调用,不执行,调用才执行,并返回到调用处
    
  • 方法定义的时候,是不执行的,也就意味着,编写方法的时候,不需要考虑先后顺序
  •  只需要考虑 调用顺序即可
    
  • 特殊方法main :
  •  JVM自动调用main方法
    

6.4 方法分类

  • 方法分类和调用
  •  变量分类 : 
    
  •  		局部变量 : 方法内声明的变量
    
  •  		静态变量 : 类体中使用static修饰的变量
    
  •  		成员变量 : 类体中没有使用static修饰的变量
    
  •  变量调用 : 
    
  •  		局部变量 : 方法内部之间写变量名调用
    
  •  		静态变量 : 类名.静态变量名,并且当前类中类名可以省略
    
  •  		成员变量 : 对象引用.成员变量名
    
  •  	如何区分同名的静态变量和局部变量 : 类名调用
    
  •  方法分类 : 
    
  •  		静态方法 : 使用static修饰的方法,并且静态方法中不能有非静态引用
    
  •  		成员方法 : 没有使用static修饰的方法
    
  •  		构造方法 : 先不做了解
    
  •  方法调用 : 
    
  •  		静态方法 : 类名.静态方法名(参数);,当前类中 类名 可以省略
    
  •  		成员方法 : 对象引用.成员方法名(参数);
    

6.5 方法重载

  • 如何确定方法的唯一性?
  •  	名字 参数列表
    
  • 方法重载 overload : 方法名相同,参数列表不同就是方法重载
  •  	参数列表不同 分为 : 个数不同和类型不同
    
  1. 栈内存 Question
  • 程序 : 可执行文件,静态概念,一般保存在硬盘中
  • 进程 : 正在执行的程序,是个动态概念,会把指定的程序载入内存中执行
  •  	运行起来的程序,就是指载入到内存中的可执行文件,这个时候操作系统会开启一个进程来运行这个文件对象,如果我们想要关闭某个程序,只需要杀死这个进程即可
    
  • java中的内存划分和管理
  •  java Runtime Data Area : java运行时数据区域,我们也可以叫JVM内存
    
  •  首先,内存被划分为 五个区域 : 程序计数器 , 方法区/静态区/静态代码段 , 栈内存(虚拟机栈/VM栈) , 堆内存 , 本地方法栈
    
  •  程序计数器 : 
    
  •  	占用较小的一块空间,作用可以看做是当前线程执行的字节码的位置的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖于这个计数器来完成
    
  •  	可以理解为保存下一条语句的行号,依次向后递增
    
  •  静态区 : 
    
  •  	是用来存放我们的程序文件的,载入到内存之后的程序文件对象的一段空间,java中就是指我们的class文件
    
  •  	包括方法,方法在被调用之前,都是以静态的形式被保存到静态区的
    
  •  	静态区中还有运行时常量池
    
  •  栈内存 :
    
  •  	以栈数据结构为模型,创建一段内存空间
    
  •  	栈数据结构特性 : 先进后出,像弹夹 
    
  •  	用来执行方法,局部变量也是在栈内存
    
  •  栈的构成
    
  •  	栈空间 : 就是指以栈数据结构为模型的一段内存空间
    
  •  	栈帧 : 栈内存中,每一个栈元素,叫栈帧
    
  •  	栈顶元素 : 最后一个放进去的栈帧
    
  •  	栈底元素 : 第一个放进去的栈帧
    
  •  栈的操作 : 
    
  •  	压栈 : 就是指把元素放入栈空间的过程
    
  •  	弹栈 : 就是把元素从栈空间中弹出的过程
    
  •  java中,方法调用,就是压栈操作,方法执行完 就是弹栈操作
    
  •  堆内存 : 
    
  •  	用来存放对象,根据静态区中的class文件对象,创建的对象
    
  •  	每个对象空间,分为3块
    
  •  		数据部分 : 成员变量
    
  •  		头部	: hashCode值
    
  •  		类型 : 是哪个类创建的对象,保存的是类文件在静态区的地址,所以在成员方法中是可以直接访问静态属性的
    
  •  本地方法栈 : 
    
  •  	用来执行native声明的方法,比如Object类中的hashCode()方法
    
  • java程序的执行流程 :
  •  	1 java程序编写
    
  •  			文本编辑器,按照java规范编写代码
    
  •  	2 java程序的编译
    
  •  			javac  进行编译 生成 class文件
    
  •  	3 java程序调用
    
  •  			java xxxx
    
  •  		3.1 开启java虚拟机,然后把程序对应的class文件,载入静态区
    
  •  		3.2 jvm自动调用该class的main方法,并且只有一个main方法,固定写法,java是单入口程序
    
  •  		3.3 main被调用之后,jvm就会在栈内存开辟栈帧,把main中的代码复制进去,然后开始执行
    
  •  		3.4 main方法执行流程
    
  •  			3.4.1  在main方法中没有其他方法调用
    
  •  					执行完main方法之后,main栈帧弹栈,结束,jvm关机
    
  •  			3.4.2 main中有其他方法调用
    
  •  					如果调用了当前类的方法,会在main方法栈帧之上,开辟新的栈帧,并把对应的代码复制进去开始执行,直到执行结束,返回到main栈帧的调用处,继续执行main方法
    
  •  					如果调用了其他类的方法,把对应的类载入到静态区,然后再开辟栈帧,复制代码,执行,执行完返回main,继续执行
    
  •  					如果被调用方法中,还有其他方法调用,就继续压栈,一直到main方法执行结束,弹栈,jvm关机
    
  •  程序加载 : 
    
  •  	静态加载 : 程序开始执行,首先把所有和该程序相关的文件,全部一次性从硬盘载入内存
    
  •  	动态加载 : 程序开始执行,只会载入当前用到的文件,如果执行过程中,需要其他文件,再去硬盘中载入
    

11种基本数据类型 8种基本 3种引用 TODO 点击直接到那个地方 day05 8. 递归 8.1 概述和基本应用

  • 定义 :
  •  在方法体中 调用当前方法
    
  • 基本思想 :
  •  以此类推是递归的基本思想
    
  •  也是循环的基本思想 所以循环和迭代是等价的(迭代就是循环)
    
  •  初始值,终止条件,步长
    
  •  循环是重复执行循环体,而递归是重复执行方法体
    
  • 应用场景
  •  一般树状结构的都可以使用递归查询
    
  •  比如 文件目录,因为不清楚到底有多少子目录,所以没办法使用for循环嵌套
    
  • 常见问题 :
  •  累加加和
    
  •  阶乘
    
  •  斐波那契数列
    
  •  汉诺塔
    
  •  文件目录操作
    

8.2 斐波那契数列

  • 斐波那契数列
  •  前两位是1 ,每位都等于前两位的和
    
  •  1,1,2,3,5,8,13,21,34,55......
    
  • 传入位数,获取第几位的值是多少

day06 9. 数组

  • 数组 是引用数据类型

  •  之前我们学习的变量,都只能存储单个元素,想要存储多个元素,就需要使用数组
    
  • 数组 是一个源自底层的数据结构,并且几乎在任何语言中,都是最基础的数据结构 数组 又称为 索引数组(index) 9.1 数据结构

  • 数据结构 : 计算机存储、组织数据的方式

  •  就是计算机对数据存储的形式,和数据操作的形式
    
  •  精心选择的数据结构可以带来更高的运行或者存储效率
    
  • 数据操作

  •  增删改查
    

9.2 数组概述和特性

  •  并且 数组中元素的类型必须一致,意味着空间大小一致
    
  •  数组在内存中是连续的内存空间,也就意味着,找到一个就能找到其他所有
    
  •  	默认使用第一个空间作为整个数组的地址,然后通过偏移量 找到其他元素
    
  •  	偏移量为 0  就是第一个元素 , 偏移量为1 找到的就是第二个元素, 偏移量为11 找到的就是第12个元素
    
  •  	像这种 通过内存地址,直寻法,查找效率极高
    
  •  所以 数组的索引(下标) 是从0开始的
    
  •  因为能够快速找到某个元素,所以想要更改某个元素的时候,只需要使用 = 赋值即可
    
  •  所以 数组 查询和更改 效率极高
    
  •  数组一旦确定,长度不能更改,想要添加或者删除元素,必须新建数组,然后把原数组中需要保留的元素,以及新插入的元素依次复制到新数组中
    
  •  所以这样效率较低
    
  • 数组特性 : 查询更改快,添加删除慢

  • 数组 :

  •  1 是引用类型
    
  •  		会占用两块内存空间 ,栈内存一块,堆内存一块,栈内存保存的是堆内存数组对象的地址
    
  •  2 数组是一种线性连续存储的数据结构
    
  •  3 数组就是一个容器,用来存储其他数据
    
  •  		数组可以存储任意元素,不过每一维元素类型必须一致(数组可以多维)
    
  •  4 数组长度一旦确定,不可更改
    
  •  		数组中 默认有个length属性,保存数组的长度
    
  •  5 数组下标 从 0 开始
    
  •  6 数组查询更改快,添加删除慢
    

9.3 数组声明

  • 数组声明 :
  •  1 静态声明 : 就是预先知道数组中的每位元素分别是什么
    
  •  		数据类型[]  变量名= {类型值1,类型值2,....};
    
  •  		int i = 1;
    
  •  		int[] is = {1,2,3};
    
  •  		int[][] iss = { {1,2,3}, {1,2,3}, {1,2,3}};
    
  •  		int[][][] isss = {
          
            { {1,2,3}, {1,2,3}, {1,2,3}},{ {1,2,3}, {1,2,3}, {1,2,3}},{ {1,2,3}, {1,2,3}, {1,2,3}}};
    
  •  		.....
    
  •  2 动态声明 : 就是预先不知道数组中每位元素分别是什么,不过需要确定数组类型以及长度,先用对应的类型默认值占位
    
  •  		数据类型[] 变量名 = new 数据类型[长度];	
    
  •  		int[] is = new int[5];
    
  •  		int[][] iss = new int[5][2];
    
  •  		int[][][] isss = new int[3][5][2];
    

9.4 数组使用和遍历 9.4.1 获取数据

  • 获取数组中元素
  •  数组变量[下标];
    

9.4.2 设置数据

  • 设置
  •  数组遍历[下标] = 值;
    

9.4.3 遍历数组

  • 遍历

  •  for(int i = 0; i< arr.length ; i++){
     	int value = arr[i];
     	System.out.println(value);
     }
    

    增强for循环 foreach 把数组中每一位元素拿出来,赋值给 变量 for(数据类型 变量 : 数组 ){

     }
    

9.4.4 常见异常

9.5 数组传递

  • 如果调用方法的时候,直接传递数组
  •  方法名 (  new 数据类型[]{类型值1,类型值2,....} );
    

9.6 Main方法传参

  1. 二维数组 10.1 声明方式 静态 Int[][] arr = { {1,2,3,4,5}, {1}, {2,3}, … };

动态 : 二维数组中 有5个一维数组,并且每个一维 数组都有3个元素 Int[][] arr = new int[5][3]; 二维数组中有5个一维数组,并且这五个一维数组都是空的 Int[][] arr = new int[5][];

10.2 存储方式

10.3 二维数组使用

10.3.1 获取数据 变量[下标][下标]

10.3.2 设置数据 变量[下标][下标] = 值

10.3.3 数组遍历

10.3.4 二维数组中一维数组元素个数不同 使用动态声明的方式,定义二维数组,并且使二维数组中的一维数组元素个数不同

  1. 传值和传引用的区别 Here
  • 传值和传引用
  •  传值 : 指的是基本类型传递
    
  •  传引用 : 指的是引用类型的传递 
    
  • 传值之后,如果在对应方法中将值更该,不会影响调用处的值
  • 如果是传引用,被调用方法通过引用,把内存中数据更改的话,调用处再次通过地址找到空间后,值就发生更改了
  1. 数组复制

  2. Scanner工具类

  3. 交换变量的值 14.1 借助中间变量

14.2 加减运算

14.3 移位运算交换

day08 15. 排序 就是让元素按照一个大小规则进行排序存储 1,3,2,5,7,4 1,2,3,4,5,7 7,5,4,3,2,1

比如 我们存储了班级内所有学生考试成绩 Double [] scores = {xxx,xxx,xxx,xxx,xxx,xxx}; 想要查看前三名怎么办? 降序排序,取前三个即可 15.1 冒泡排序

  • 冒泡排序 :
  •  1 比较相邻的两个元素,如果第一个比第二大,就交换位置
    
  •  2 对每一对相邻的元素做同样的工作,从开始一对到最后一对,当一轮比较完之后,最后的元素,一定是最大的(最小的)
    
  •  3 针对所有的元素,重复执行上面操作,除最后一个元素
    
  •  4 持续每次需要比较的队伍越来越少,一直到没有任何一对需要比较,终止
    
  • 1 嵌套循环
  • 2 内层循环取决于外层循环
  • 3 需要一个中间变量

15.2 选择排序

  • 选择排序
  •  1 每次都把最小的/最大的放到最左边
    
  •  		先拿出第一个,假设是最小的,然后挨个和后面的比较,全部比较完之后,如果有比这个元素小的,就换位
    
  •  2 嵌套循环比较
    
  •  3 中间变量
    

15.3 API排序

  1. 查找元素
  • 需求 :

  • 给定一个数组,判断是否包含某个值,如果包含返回其对应的下标,如果不包含,返回-1 16.1 顺序查找

  • 顺序查找 :

  •  1 遍历数组,挨个比较
    
  •  2 如果有和目标元素相等的,就返回该下标
    
  •  3 如果循环完,都没有发现相等的,就返回-1
    
  • 优点 :

  •  编码简单,没啥逻辑,挨个比较嘛...
    
  •  运气好的话,碰巧前几个就是要查找的数据,
    
  • 缺点 :

  •  查询效率相对较低
    
  •  不能只拼运气好的时候
    
  •  比如 有100W条数据,如果数据在最后几个的话,那么就需要循环执行100W次
    

16.2 二分查找

  • 二分法查找 :
  •  1 建立在排序的基础之上
    
  •  2 数据没有重复元素,如果有,先找到那个算哪个
    
  •  3 用于查找固定有序的数据
    
  • 算法实现 :
  •  1 确定起始和结束位置
    
  •  2 确定中间数据,判断中间数据是否为目标数据,如果是直接返回
    
  •  3 如果目标数据小于中间数据,则  起始值不变,结束值 为 中间值 -1
    
  •  4 如果目标数据大于中间数据,则 结束值不变,起始值 为 中间值 +1
    
  •  5 如果 起始值 大于 结束值 终止比较,说明不存在
    
  •  6 重复执行以上操作即可
    

day09 17. 面向对象 17.1 概述

面向过程 : 侧重分步骤 比如做菜 1 买菜,买各种食材,买各种调料 2 开火,烧油 3 翻炒 4 出锅 … 面向对象 : 侧重分类/模块 比如做菜 1 完成做菜,涉及到的事物有 : 厨师,食材,工具 2 找个厨师,交给他 3 厨师.买食材 4 厨师.使用工具做菜

17.2 构造方法

  • 编译器功能 : 能把我们代码编译成class文件,并且还会检查代码的语法,也会帮助我们补全不规范的代码
  • 比如调用当前类中的静态变量的时候,可以省略类名,但是编译器会帮我们加上
  • 同时如果我们类中没有构造方法,编译器也会默认帮我们创建一个公共的无参构造
  • 构造方法 :
  •  1 作用 : 创建当前类的实例化对象,初始化成员属性
    
  •  2 初始化 : 赋值
    
  •  3 静态变量什么时候初始化 : 类加载阶段(main方法执行之前)
    
  •  4 如果不定义构造方法的话,JVM会默认帮我们创建一个公共的无参构造
    
  •  5 如果我们定义了构造方法的话,不管我们定义的是有参还是无参,那么JVM都不会再帮我们默认创建无参构造
    
  •  6 构造方法默认是 : 公共的,静态的,没有返回值的,方法名和类名相同
    
  •  			public  类名(){}
    
  •  	但是我们声明的时候 不能加static,因为构造方法具有双重性
    
  •  			如果 只是静态方法,那么 里面不能操作成员变量,也就不能对成员变量初始化赋值
    
  •  			如果 只是成员方法,那么就没有办法创建对象了,因为想要创建对象必须调用构造方法,而构造方法如果是成员的,想要调用成员方法必须先有对象
    
  •  		所以 构造方法 具有双重性,我们再声明的时候 不可以加static
    
  •  		构造方法比较特殊
    
  •   7 语法
    
  •  		[权限控制修饰符]  类名(参数列表){方法体}
    

17.3 类和对象

  • 对象 :
  •  1 代码角度 : new 的一个实例,封装了特有的数据
    
  •  2 数据角度 : 封装数据和逻辑的一种方式
    
  •  3 现实角度 : 对象就是某一个具体的东西,一切皆对象
    
  •  4 设计角度 : 从一个实际的实体中抽象出来某些属性的一种实体表示
    
  • 类 :
  •  概念 : 我们再思想上对某个事物/东西/某一类东西的唯一性标识
    
  •  	是我们人,在思想上对某个事情/事物的一个界定(定义)
    
  •  	是我们大脑对客观事物描述的一个标准,一个模板
    
  •  我们再抽离某个概念,就能建立相关事物的类,一定通过他的数学来形成这个概念,通过这些属性来形成这个类
    
  •  然后通过不同的属性值,形成了实体,就是那个具体的对象
    
  •  通过不同的属性,划分不同的类,通过不同的属性值,划分不同的个体
    
  •  属性分为两种 : 
    
  •  		1 静态属性 : 类的行为和功能
    
  •  		2 动态属性 : 类对象的行为和功能
    
  • 但是在代码角度来说,类和对象都是保存数据的一种手段

17.4 实例化

  • 实例化 :
  •  类  变量  =  new  构造方法(参数);
    
  •  1 加载类到静态区
    
  •  2 调用构造方法(栈内存压栈,开辟栈帧),在堆内存开辟内存空间
    
  •  3 把对应类中的成员属性复制到堆内存中
    
  •  4 再把堆内存内存地址赋值给栈内存遍历
    

17.5 对象使用

17.6 类的构成

  • 类 : 根据具体的事物/需求 抽象出来的属性特征,那么 类中都可以有什么呢?(java死规定)
  • 1 main : 入口方法,只要该类不是用来作为启动类的,就可以没有
  • 2 成员变量 : 每个对象共有的属性,属性值可以相同也可以不同
  • 3 静态变量 : 每个对象共有的属性和值(保存在方法区)
  • 4 局部变量
  • 5 成员方法
  • 6 静态方法
  • 7 构造方法
  • 8 抽象方法
  • 9 静态语句块
  • 10 动态语句块
  • 11 this
  • 12 super
  • 类中只能出现这些,但是类中的一切都不是必须的,也可以什么都不写,但是如果写的话只能写这些
  • 类库端 : 就是被调用的
  • 客户端 : 就调用别人的

17.7 Bean

  • javaBean
  •  成员变量私有化
    
  •  有对应的getter/setter方法
    
  •  对应的构造方法
    

17.8 常见异常

  • java.lang.NullPointerException :
  •  空指针异常,是运行时异常
    
  •  当使用null值(空的引用) 去访问成员属性的时候,就会出现空指针异常
    
  • JVM特性 :
  •  跨平台,面向对象,多线程,垃圾自动回收机制
    
  • 垃圾 : 如果没有更多的引用指向这个对象,该对象被视为垃圾数据,等待被回收 Day10
  1. 面向对象 18.1 传值和传引用 // 基本数据类型 保存值的大小 , 引用数据类型保存内存地址 // 传值 基本类型传递 // 局部变量 属于栈帧私有化 栈帧独享

18.2 区分成员和构造

  • 构造方法 :
  •  	[权限修饰符]  类名(参数) {方法体}
    
  • 作用 : 创建对象,初始化成员属性
  • 方法声明 : [修饰符列表] 返回值类型 方法名(参数) {方法体}
  • 方法名符合命名规则即可 : 字母,下划线,美元符号,数字,不能数字开头,不能使用关键字和保留字,建议望文知义, 驼峰命名法
  • 方法目的 : 代码重用性,提高代码效率
  • 问题
  •  1 成员方法的方法名可以和类名相同吗?(成员方法可以和构造方法同名吗?)
    
  •  		可以和类名相同
    
  •  2 如何区分同名的成员方法和构造方法?
    
  •  		看返回值,构造方法木有返回值,成员方法必须有返回值类型,如果没有用void表示
    

18.3 This 18.3.1 是什么

  •  		this是每个对象中,保存自身内存地址的一个引用类型的成员变量
    
  •  		所以说,this就表示对象自己,相当于我们说 "我" 一样
    

18.3.2 能干什么

  •  this能干什么?
    
  •  		1 在成员/构造方法中,能够区分同名的局部变量和成员变量
    
  •  		2 在构造方法中,也可以用于重载调用当前类中其他的构造方法(必须在第一行)
    
  •  		3 return this 返回当前对象内存地址,可以做到链式调用
    

18.3.3 怎么用 18.3.3.1 区分局部变量和成员变量

18.3.3.2 重载调用构造方法

  • this重载调用当前类的其他构造方法
  •   必须出现在构造方法第一行
    
  • 语法 :
  •  	this(参数);
    

18.3.3.3 链式调用

  • 链式调用 : xxx.方法().方法().方法()…
  • 核心点 : 前者方法返回值一定是可以调用后者方法的 引用

18.3.4 注意 This不能出现在静态上下文中

18.4 Static 18.4.1 是什么 static是一个修饰符关键字,用来区别静态和动态属性 18.4.2 能干什么

  • static修饰符
  •  1 static修饰的类体中的变量是静态变量
    
  •  2 static修饰的方法是静态方法
    
  •  3 static修饰的语句块是静态语句块
    

18.4.3 怎么用

  • static修饰符 1 static修饰的类体中的变量是静态变量 2 static修饰的方法是静态方法 3 static修饰的语句块是静态语句块
  • 语法 : static { java代码; }
  • 静态语句块是在类加载阶段执行,并且只执行一次,并且是从上往下执行
  • 静态变量也是在类加载阶段初始化,并且和静态语句块没有优先级之分,从上向下执行初/初始化,所以 不能再静态语句块中 提前使用静态变量,而在方法中是可以的
  • 什么情况下 类加载 : 访问某个类的静态属性的时候,类加载

18.4.4 实例语句块

  • 实例语句块
  •  语法 : {
    
  •  			java代码;
    
  •  		}		
    
  •  实例语句块等同于成员方法,只是没有名字
    
  • 执行顺序 : 静态语句块 > main方法 > 实例语句块(需要new对象 才会执行)

18.4.5 静态调用

  • 静态调用,使用类名调用
  • 那么可以使用对象调用吗? 可以

18.4.6 静态和成员的区别及应用场景

  • 变量分类 :
  •  	静态变量 : 类中使用static修饰
    
  •  	成员变量 : 类中非static修饰
    
  •  	局部变量 : 方法中声明的变量是局部变量,作用域让当前方法使用
    
  • 初始化时机 :
  •  静态变量 : 类加载阶段初始化
    
  •  成员变量 : 创建对象的时候初始化(构造方法)
    
  • 应用场景 :
  •  静态变量 : 类级别的,是所有对象共享的,比如一个静态变量 age = 10 ,那么说明所有对象都有这个age属性,并且值都是18
    
  •  				所有对象共有的属性和值
    
  •  成员变量 : 对象和对象之间有相同的属性,但是可能有不同的值,非对象共享
    

18.5 封装

封装是把对象的所有组成部分组合在一起,封装使用访问控制符将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。  作用  适当的封装可以让代码更容易理解和维护,也加强了代码的安全性。

18.5.1 软件包机制 18.5.1.1 Package

  • 目标 : 当前文件的编译和运行
  • 软件包机制 :
  •  1 为了解决类的命名冲突问题
    
  •  2 在java中使用package语句定义包
    
  •  3 package语句只能出现在java源文件中的第一行
    
  •  4 包命名通常采用公司域名倒叙
    
  •  5 package限制的是class文件的放置位置(编译之后,把class文件放到哪里去)
    
  •  com.tledu.oa.system
    
  •  	以上包命名可以体现出来 : 这个项目是天亮教育开发的OA项目,当前处于OA项目中的system模块
    
  •  6 完整的类名 是带有包名的
    
  •  7 带有包名的文件,编译应该是这样
    
  •  		javac -d 生成路径  java源文件路径
    
  •  		javac -d ./ -encoding utf-8 _01_Package.java
    
  •  8 运行
    
  •  	java 包名.类名
    
  • 什么是文件名 : 能够找到这个文件的全路径

18.5.1.2 Import

// 导入单个类 //import _05_Package.com.B; //import _05_Package.com.C;

import java.util.Date;

// 导入该包下所有类 import _05_Package.com.*;

// 导入该类中所有的静态属性(静态变量/静态方法),让当前类可以不加前缀,直接调用 import static _05_Package.com.B.*; /**

  • import :
  •  1 引入其他需要的类
    
  •  2 只能出现在package语句执行,class语句之上
    
  •  3 java核心类不需要导入,可以直接用,其他都不行
    
  •  		java.lang
    
  • 语法 :
  •  import   包名.类名;   导入单个类
    
  •  import   包名.*;   导入该包下所有的类
    
  • 注意 : eclipse编程过程中,按空格的时候 会自动导包,如果程序没问题,但是报错,可以查看是不是包导错了
  • 导入该类中所有的静态属性(静态变量/静态方法),让当前类可以不加前缀,直接调用
  •  	import static _05_Package.com.B.*;
    
  •  	不建议这样使用,在当前类中,不容看出来,这个变量是谁的变量 
    

18.5.2 权限修饰符

  • private 私有化权限修饰符 ,除了自己(当前类)之外,都不能访问
  • public 公共的权限修饰符 , 谁都能访问
  • 不写权限修饰符的时候 : 要么当前类中使用,要么当前包中使用
  • protected 受保护的权限修饰符 , 要么同类,要么同包,要么有继承关系

Day11 19. 继承 19.1 是什么

  • java 中只支持单继承,一个类只能有一个父类
  • 什么是继承 : 提高代码的复用性,父类的功能,子类可以直接使用,使子类功能更加强大
  •  	在java中 使用extends 关键字表示
    
  •  	语法 : public class  类名  extends 父类名{ 类体  }
    
  • 目的 : 提高代码重用性
  • 一个类如果没有显示继承另外一个类的话,那么该类默认继承 Object
  •  	java.lang.Object 是java中的祖类(祖宗) 
    
  •  	也就意味着 Object中的属性  是所

标签: cx601压力变送器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台