框架图
环境搭建
课程中常见dos命令:
path 环境变量的作用是指定命令搜索路径,在命令行下面执行命令如javac编译java程序时,它会到path变量所指定的路径中查找看是否能找到相应的命令 程序。我们需要把jdk安装目录下的bin目录增加到现有的path变量中,bin目录中包含经常要用到的可执行文件如javac/java /javadoc等,设好path变量后,就可以在任何目录下执行javac/java等工具了。
classpath环境变量的作用是指定类搜索路径,要使用已经编写好的类,JVM就是通过classpath来寻找类的。如果需要访问当前目录可以用“.”表示。
语法
关键字
Java语言中已经被赋予特定意义的一些单词,它们在程序上有着不同的用途,不可以把关键词作为类名、变量名、方法名、类型名、数组名、文件名等名字来用。
◆为了提高阅读性,应该具有特定的意义
Java中的名称规范:
包名:多单词组成时所有字母都小写。
xxxyyyzzz
类名接口名:多单词组成时,所有单词的首字母大写。
XxxYyyZzz
变量名和函数名:多单词组成时,第一个单词首字母小写,第二 个单词开始每个单词首字母大写。
xxxYyyZzz
常量名:所有字母都大写。多单词时每个单词用下划线连接。
XXX_YYY_ZZZ
数据类型
数据类型的转换就是把一种基本数据类型变量转变成另一种基本类型变量。
◆ 精度由低到高排列为:
低———————————————→高
byte short char int long float double
◆ 当把级别低的变量的值赋给级别高的变量时,系统自动完成数据类型的转换。
◆ 当把级别高的变量的值赋给级别低的变量时,必须使用显示类型转换运算。
◆ 高精度向低精度转换容易造成精度损失。
自动类型提升
byte b = 3;
int x = 4;
x = x + b;//b会自动提升为int类型进行运算。
强制类型转换
byte b = 3;
b = b + 4;//报错
b = (byte)(b+4);//强制类型转换,强制将b+4的结果转换为byte类型,再赋值给b。
算术运算符
赋值运算符
= , +=, -=, *=, /=, %=
示例:
int a,b,c; a=b=c =3;
int a = 3; a+=5;等同运算a=a+5;
-=, *=, /=, %=类推
short s = 3;
空位补0,被移除的高位丢弃,空缺位补0。
>>
被移位的二进制最高位是0,右移后,空缺位补0;
最高位是1,空缺位补1。
>>>
被移位二进制最高位无论是0或者是1,空缺位都用0补。
x ^ n ^ n = x,一个数异或另一个数两次,结果仍是这个数。主要用于加密。
不同二进制位进行^ 运算,结果是1。1^0=1 , 0^1=1
1 int n = 3,m = 8; 2 //1,通过第三方变量。 3 int temp; 4 temp = n; 5 n = m; 6 m = temp; 7 8 //2,不用第三方变量。 9 11 = 3 + 8; 10 3 = 11 - 8; 11 8 = 11 - 3; 12 13 n = n + m; 14 m = n - m; 15 n = n - m;//如果n和m的值非常大,容易超出int范围。 16 17 //3,使用异或 18 n = n ^ m; 19 m = n ^ m;//(n^m)^m 20 n = n ^ m;//n ^ (n ^ m)
练习把一个十进制数转成十六进制
1 class GetNumDemo { 2 public static void main(String[] args){ 3 int num = 77; 4 //获取77的最低4位,通过&15; 5 int n1 = num & 15; 6 System.out.println(n1>9?(char)(n1-10+'A'):n1);//68 ,这里无法强转因为char与n1比较自动提升数据类型 7 8 //获取下一组四位,将77右移4位。 9 int temp = 77>>>4; 10 11 //对temp的值进行最低四位的获取,通过&15; 12 int n2 = temp & 15; 13 System.out.println(n2>9?(char)(n2-10+'A'):n2);//4 14 } 15 } 16 17
三元运算符
格式:(条件表达式)?表达式1:表达式2;
如果条件为true,运算后的结果是表达式1;
如果条件为false,运算后的结果是表达式2;
1 //获取两个数中大数。 2 int x=3,y=4,z; 3 z=(x>y)?x:y; 4 //z=4
判断结构语句
if语句三种格式
1 1. 2 if(条件表达式) 3 { 4 执行语句; 5 } 6 2. 7 if(条件表达式) 8 { 9 执行语句; 10 } 11 else 12 { 13 执行语句; 14 } 15 //if-eise语句与三元运算符的区别是三元运算符简化了代码但要有运算结果 16 3. 17 if(条件表达式) 18 { 19 执行语句; 20 } 21 else if (条件表达式) 22 { 23 执行语句; 24 } 25 …… 26 else 27 { 28 执行语句; 29 }
选择结构语句
switch语句格式:
1 switch(表达式) 2 { 3 case 取值1: 4 执行语句; 5 break; 6 case 取值2: 7 执行语句; 8 break; 9 …... 10 default: 11 执行语句; 12 break; 13 }
switch语句特点:
b,case之间与default没有顺序。先执行第一个case,没有匹配的case执行default。
c,结束switch语句的两种情况:遇到break,执行到switch语句结束。
d,如果匹配的case或者default没有对应的break,那么程序会继续向下执行,运行可以执行的语句,直到遇到break或者switch结尾结束。
while语句格式:
1 while(条件表达式) 2 { 3 执行语句; 4 }
do while语句格式:
1 do 2 { 3 执行语句; 4 } 5 while(条件表达式);
while:先判断条件,只有条件满足才执行循环体。
do while: 先执行循环体,在判断条件,条件满足,再继续执行循环体。
简单一句话,do while无论条件是否满足,循环体至少执行一次。
for语句格式:
1 for(初始化表达式;循环条件表达式;循环后的操作表达式) 2 { 3 执行语句; 4 }
注:
a.for里面的连个表达式运行的顺序,初始化表达式只读一次,判断循环条件,为真就执行循环体,然后再执行循环后的操作表达式,接着继续判断循环条件, 重复找个过程,直到条件不满足为止。
b.while与for可以互换,区别在于for为了循环而定义的变量在for循环结束就是在内存中释放。而while循环使用的变量在循环结束后还可以继续使用。for的初始化动作在内部,while初始化动作在外部,变量在内存中的驻留时间不一样。while中的变量在下面的代码中仍然可以使用。如果变量只是为了循环存在,也就是需要定义增量,使用for比较合适,内存比较优化。
c.循环要注意哪些语句需要参与循环,那些语句不需要。
d.最简单无限循环格式:while(true){} , for(;;){},无限循环存在的原因是并不知道循环多少次,而是根据某些条件,来控制循环。
e.语句的结束,要么是“;”要么是“}”。例如,while(x<3);没有执行语句会不断的判断条件。
其他流程控制语句
break语句:应用于选择结构和循环结构。
continue语句:应用于循环结构。
注:
a,这两个语句离开应用范围,存在是没有意义的。
b,这个两个语句单独存在下面都不可以有语句,因为执行不到。
c,continue语句是结束本次循环继续下次循环。
d,标号的出现,可以让这两个语句作用于指定的范围。
求1-100所有奇数和和奇数的个数(累加和计数器)
1 class GetSum 2 { 3 public static void main(String[] args) 4 { 5 //1,定义变量用于存储不断变化的和。 6 int sum = 0; 7 //2,定义变量,记录住不断变化的被加的数。 8 int x = 1; 9 //3,定义计数器 10 int count=0; 11 //3,定义循环,重复加法的过程。 12 while(x<=100) 13 { 14 if (x%2==1){ 15 sum +=x; 16 count++;} 17 else{ 18 sum += 0;} 19 x++; 20 } 21 //改写三元运算符格式 22 /* while(x<=100) 23 {sum=(x%2==1)?sum+x:sum+0; 24 if(x%2==1) 25 count++ 26 x++;}*/ 27 28 //改写for形式 29 /*int sum = 0; 30 int count=0; 31 for (int x=1;x<=100 ;x++) 32 { 33 if (x%2==1) 34 {sum+=x;count++; 35 } 36 }*/ 37 System.out.println("sum="+sum); 38 System.out.println("count="+count); 39 } 40 }
练习嵌套For循环打印矩形、平行四边形、三角形和菱形
1 /* 2 使用嵌套循环用“*”输出矩形、平行四边形、三角形和菱形 3 */ 4 5 public class Test_LoopDemo 6 { 7 public static void main(String[] args) 8 { 9 PrintRect(); 10 System.out.println("----------------------"); 11 PrintParallelogram(); 12 System.out.println("----------------------"); 13 PrintTriangle (); 14 System.out.println("-----------------------"); 15 PrintRhombus (); 16 } 17 18 // PrintRect输出矩ln形五行五列 19 20 public static void PrintRect (){ 21 //外循环控制输出5行“*” 22 for (int i = 1; i <= 5; i++ ){ 23 //内循环控制每行输出“*” 24 for (int j = 1; j <= 5; j++){ 25 System.out.print ("*"); 26 } 27 System.out.print ("\n");//换行打印 28 } 29 } 30 31 //PrintParallelogram输出平行四边形 32 33 public static void PrintParallelogram (){ 34 for (int i = 1; i <= 5; i++ ){ 35 for (int k = i; k <= 5; k++){ 36 System.out.print (" "); 37 } 38 for (int j = 1; j <= 5; j++){ 39 System.out.print ("*"); 40 } 41 System.out.print ("\n"); 42 } 43 } 44 45 //PrintTriangle输出三角形 46 public static void PrintTriangle (){ 47 for (int i = 1; i <= 5; i++ ){ 48 //控制输出空格 49 for (int k = i; k <= 5; k++){ 50 System.out.print (" "); 51 } 52 //内循环控制每行输出“*” 53 for (int j = 1; j <= 2 * i - 1; j++){ 54 System.out.print ("*"); 55 } 56 System.out.print ("\n");//换行打印 57 } 58 } 59 60 //PrintRhombus输出菱形 61 public static void PrintRhombus (){ 62 //输出正三角 63 for (int i = 1; i <= 5; i++ ){ 64 //控制输出空格 65 for (int k = i; k <= 5; k++){ 66 System.out.print (" "); 67 } 68 69 //内循环控制每行输出“*” 70 for (int j = 1; j <= 2 * i - 1; j++){ 71 System.out.print ("*"); 72 } 73 System.out.print ("\n");//换行打印 74 } 75 //输出倒三角 76 for (int i = 1; i <= 4; i++ ){ 77 //控制输出空格 78 for (int k = i-1; k <= 2 * i - 1; k++){ 79 System.out.print (" "); 80 } 81 //内循环控制每行输出“*” 82 for (int j = 7; j >= i *2 - 1; j--){ 83 System.out.print ("*"); 84 } 85 System.out.print ("\n");//换行打印 86 } 87 } 88 }
运行结果:
函数
函数也称为方法,是定义在类中的具有特定功能的一段独立小程序。
修饰符返回值类型函数名(参数类型形式 参数1, 参数类型形式 参数2,...)
{
执行语句;
return 返回值;
}
返回值类型:函数运行后的结果的数据类型。
参数类型:是形式参数的数据类型。
形式参数:是一个变量,用于存储调用函数时传递给函数的实际参数。
实际参数:传递给形式参数的具体数值。
return:用于结束函数。
返回值:该值会返回给调用者。
函数特点:
定义函数可以将功能代码进行封装
便于对该功能进行复用
同时提高了代码的复用性
函数只有被调用才会被执行
对于函数没有具体返回值的情况,返回值类型用关键字void表示,那么该函数中的return语句如果在最后一行可以省略不写。
注意:
函数中只能调用函数,不可以在函数内部定义函数。
定义函数时,函数的结果应该返回给调用者,交由调用者处理。
函数的应用
明确要定义的功能最后的结果是什么?明确函数的返回值类型
明确在定义该功能的过程中,是否需要未知内容参与运算?明确函数的参数列表(参数的类型和参数的个数)
函数的重载(overload)
在同一个类中,允许存在一个以上的同名函数,只要它们的参数个数或者参数类型不同即可。
重载的特点:
与返回值类型无关,只看参数列表。参数的顺序不同,参数列表也会不同。
重载的好处:
方便于阅读,优化了程序设计。
数组
数组是同一种类型数据的集合。其实数组就是一个“容器”。数组中的数据就是“元素”、
数组可以自动给数组中的元素从0开始编号,方便操作这些元素。
1 格式1: 2 元素类型[] 数组名= new 元素类型[元素个数或数组长度]; 3 示例:int[] arr = new int[5]; 4 格式2: 5 元素类型[] 数组名= new 元素类型[]{元素,元素,……}; 6 int[] arr = new int[]{3,5,1,7}; 7 int[] arr = {3,5,1,7};
Java程序在运行时,需要在内存中的分配空间(栈内存,堆内存,方法区,本地方法区,寄存器)。为了提高运算效率,有对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
栈内存
- 用于存储局部变量,当数据使用完,所占空间会自动释放。
堆内存
- 数组和对象,通过new建立的实例都存放在堆内存中。
- 每一个实体都有内存地址值
- 实体中的变量都有默认初始化值
- 实体不在被使用,会在不确定的时间内被垃圾回收器回收
- 方法区,本地方法区,寄存器
二维数组[][]
格式1:int[][] arr = new int[3][2];
定义了名称为arr的二维数组
二维数组中有3个一维数组
每一个一维数组中有2个元素
一维数组的名称分别为arr[0], arr[1], arr[2]
给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78;
格式2:int[][] arr = new int[3][];
二维数组中有3个一维数组
每个一维数组都是默认初始化值null
可以对这个三个一维数组分别进行初始化
arr[0] = new int[3];
arr[1] = new int[1];
arr[2] = new int[2];
格式3:int[][] arr = {{3,8,2},{2,7},{9,0,1,6}};
定义一个名称为arr的二维数组
二维数组中的有三个一维数组
每一个一维数组中具体元素也都已初始化
第一个一维数组arr[0] = {3,8,2};
第二个一维数组arr[1] = {2,7};
第三个一维数组arr[2] = {9,0,1,6};
第三个一维数组的长度表示方式:arr[2].length;
int[] x; int x[];
int[][] y; int y[][]; int[] y[];
int[] x,y[];//x一维,y二维。
int[] x;
int[] y[];
a.
x[0] = y;//error
b.
y[0] = x;//yes
c.
y[0][0] = x;//error
d.
x[0][0] = y;//error
e.
y[0][0] = x[0];//yes
f.
x=y;//error
数组的应用----获取数组遍历数组
1 class GetArray 2 { 3 public static void main(String[] args) 4 { 5 //数组的操作: 6 //获取数组中的元素。通常会用到遍历。 7 8 int[] arr = {3,6,5,1,8,9,67}; 9 10 //获取数组元素个数:数组名称.length = 11 System.out.println("length:"+arr.length); 12 13 for(int x=0; x<arr.length; x++) 14 { 15 16 System.out.println("arr["+x+"]="+arr[x]+";"); 17 } 18 19 //打印的数组地址值 20 System.out.println(arr); 21 22 }
}
数组的应用----获取数组最值
1 class Get1 2 { 3 public static void main(String[] args) 4 { 5 int[] arr = {3,6,5,1,8,9,67} 6 for(int x=0; x<arr.length; x++) 7 { 8 System.out.println("arr["+x+"]="+arr[x]+";"); 9 } 10 11 int max=getMax(arr); 12 int min=getMin(arr); 13 System.out.println("max="+max); 14 System.out.println("min="+min); 15 } 16 public static int getMax(int[] arr) 17 { 18 int max = 0; 19 20 for(int x=1; x<arr.length; x++) 21 { 22 if(arr[x]>arr[max]) 23 max = x; 24 } 25 return arr[max]; 26 } 27 public static int getMin(int[] arr) 28 { 29 int min = 0; 30 for(int x=1; x<arr.length; x++) 31 { 32 if(arr[x]<arr[min]) 33 min = x; 34 } 35 return arr[min]; 36 } 37 }
数组的应用----排序
1 /*对给定数组进行排序。 2 {5,1,6,4,2,8,9}*/ 3 import java.util.*; 4 class ArraySort 5 { 6 //选择排序。内循环结束一次,最值出现头角标位置上。 7 public static void selectSort(int[] arr) 8 { 9 for (int x=0; x<arr.length-1 ; x++) 10 { 11 for(int y=x+1; y<arr.length; y++) 12 { 13 if(arr[x]>arr[y]) 14 { 15 int temp = arr[x]; 16 arr[x] = arr[y]; 17 arr[y]= temp; 18 } 19 } 20 } 21 } 22 //冒泡排序 23 public static void bubbleSort(int[] arr) 24 { 25 for(int x=0; x<arr.length-1; x++) 26 { 27 for(int y=0; y<arr.length-x-1; y++){//-x:让每一次比较的元素减少,-1:避免角标越界。 28 if(arr[y]<arr[y+1]) 29 { 30 int temp = arr[y]; 31 arr[y] = arr[y+1]; 32 arr[y+1] = temp; 33 } 34 } 35 } 36 } 37 public static void main(String[] args) 38 { 39 int[] arr = {5,1,6,4,2,8,9}; 40 //排序前; 41 printArray(arr); 42 43 //排序 44 //selectSort(arr); 45 bubbleSort(arr); 46 47 //Arrays.sort(arr);//java中已经定义好的一种排序方式。开发中,对数组排序。要使用该句代码。 48 //排序后: 49 printArray(arr); 50 51 } 52 //打印数组函数 53 public static void printArray(int[] arr) 54 { 55 System.out.print("["); 56 for(int x=0; x<arr.length; x++) 57 { 58 if(x!=arr.length-1) 59 System.out.print(arr[x]+", "); 60 else 61 System.out.println(arr[x]+"]"); 62 } 63 } 64 }
数组的应用----查找
1 class GetArray 2 { 3 public static void main(String[] args) 4 { 5 int[] arr = {3,2,1,5,4,2,9}; 6 int index = getIndex(arr,5); 7 System.out.println("index="+index); 8 } 9 public static int getIndex(int[] arr,int key) 10 { 11 for(int x=0; x<arr.length; x++) 12 { 13 if(arr[x]==key) 14 return x; 15 } 16 return -1; 17 } 18 } 19 //输出结果:index=3
数组的应用----折半查找(只适用于有序数组,实际使用Arrays.binarySearch)
1 public static int halfSearch_1(int[] arr,int key) 2 { 3 int min,max,mid; 4 min = 0; 5 max = arr.length-1; 6 mid = (max+min)/2; 7 8 while(arr[mid]!=key) 9 { 10 if(key>arr[mid]) 11 min = mid + 1; 12 else if(key<arr[mid]) 13 max = mid - 1; 14 15 if(min>max) 16 return -1; 17 mid = (max+min)/2; 18 } 19 return mid; 20 } 21 22 public static int halfSearch_2(int[] arr,int key) 23 { 24 int min = 0,max = arr.length-1,mid; 25 26 while(min<=max) 27 { 28 mid = (max+min)>>1; 29 30 if(key>arr[mid]) 31 min = mid + 1; 32 else if(key<arr[mid]) 33 max = mid - 1; 34 else 35 return mid; 36 } 37 return -1; 38 }
十六进制转换对比当时位运算
2 public static void main(String[] args) {
3 toBin(6);
4 toHex(60);
5 }
6 /*
7 十进制-->十六进制。
8 */
9 public static void toHex( int num) {
10
11 StringBuffer sb = new StringBuffer();
12
13 for( int x=0; x<8; x++){
14 int temp = num & 15;
15 if(temp>9)
16 // System.out.println((char)(temp-10+'A'));
17 sb.append(( char)(temp-10+'A'));
18 else
19 // System.out.println(temp);
20 sb.append(temp);
21
22 num = num >>> 4;
23 }
24 System.out.println(sb.reverse());
25
26 }
27 /*
28 十进制-->二进制
29 */
30 public static void toBin( int num){
31 StringBuffer sb = new StringBuffer();
32
33 while(num>0){
34 // System.out.println(num%2);
35 sb.append(num%2);
36 num = num / 2;
37 }
38 System.out.println(sb.reverse());
39 }
40 }
查表法进制转换
2 public static void main(String[] args) {
3 // toBin(-6);
4 // toHex(-60);
5 // toBa(60);
6
7 // System.out.println(Integer.toBinaryString(6));
8 // System.out.println(Integer.toHexString(6));
9 }
10
11 /*
12 十进制-->二进制
13 */
14 public static void toBin( int num){
15 trans(num,1,1);
16 }
17
18 /*
19 十进制-->八进制
20 */
21 public static void toBa( int num) {
22 trans(num,7,3);
23 }
24 /*
25 十进制-->十六进制
26 */
27 public static void toHex( int num){
28 trans(num,15,4);
29 }
30 public static void trans( int num, int base, int offset) { // 需要转换的数字,需要与的基础数,需要右移的位数
31 if(num==0){
32 System.out.println(0);
33 return ;
34 }
35 char[] chs = {'0','1','2','3'
36 ,'4','5','6','7'
37 ,'8','9','A','B'
38 ,'C','D','E','F'};
39 char[] arr = new char[32];
40
41 int pos = arr.length;
42
43 while(num!=0){
44 int temp = num & base;
45 arr[--pos] = chs[temp];
46 num = num >>> offset;
47 }
48
49 for( int x=pos; x<arr.length; x++){
50 System.out.print(arr[x]);
51 }
52 return ;
53 }
54 }
---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------