目录
一、java的概述
1.Java是sun公司1995年推出的,2009年被oracle收购。
2.Java是一门高级编程语言。
3.Java的分类:
JavaME:Java微型版,用于开发移动应用,如今基本已经淘汰。
JavaSE:Java标准版,是Java的核心和基础.
JavaEE:Java企业版,用于开发WEB应用。
4.Java程序的执行原理:
Java程序最终会翻译解释成计算机能识别的机器语言.
BUG:代表程序出现问题或者漏洞的意思
DeBUG:调试程序,解决BUG
二、java的基础语法
注释
作用:对程序进行解释说明的文字、不影响程序的执行
分类
单行注释:// ---
多行注释:/**/
文档注释:/** */
变量
作用:内存中的一块区域,里面可以存储一个数据,存储的数据可以变化
格式:数据类型 变量名称 = 初始值;
变量注意事项:
1、变量必须先声明才能使用。
2、定义什么类型的变量,只能使用该数据类型的数据。
3、在有效范围内不能定义重名的变量。
4、变量定义的时候可以没有初始值,但是使用前必须给它赋予初始值。
数据类型
作用:约束变量只能存储什么类型的数据,帮助定义不同类型的变量
分类:基本数据类型和引用数据类型。
基本数据类型
整型
byte字节
short短整型
int整型
long长整型,赋值时需要在数字后加l或L。
浮点型
float:单精度浮点型,赋值时需要在数字后加f或F。如:float a=3.14f;
double:双精度浮点型。
字符型:char,赋值时是单引号引起来的字符或数字。
布尔型:bolean,通常都是true和false。
注:整数,默认是int类型。小数,默认是double类型。
引用数据类型
string
数组
三、java的运算符
基本算术运算符
符号 | 作用 | 说明 |
+ | 加 | 如果两个操作数都是数值型的数据,+用于计算。如果两个操作数有一端是字符串,+用于拼接字符串。 |
- | 减 | 只能用于数值型数据。 |
* | 乘 | 只能用于数值型数据。 |
/ | 除 | 只能用于数值型数据。如果两个整数相除,结果只保留整数部分(商)。 |
% | 取余 | 只能用于数值型数据。商一定是整数。 |
赋值运算符
常见:=、+=、*=、/=、%=
a+=b等价于:a=(a+b);
a*=b等价于:a=(a*b);
a/=b等价于:a=(a/b);
a%=b等价于:a=(a%b);
关系运算符
常见:==、!=、>、>=、<、<=
符号 | 作用 |
== | 等于 |
!= | 不等于 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
判断是否满足条件的,返回true和false
int age = 20;
System.out.println(age>=19);
逻辑运算符
常见:& 、&&、 |、 ||、!、^
符号 | 作用 |
& | 符号两端需要两个表达式,判断如果都为true,整体结果则为true,如果有一端结果为false,整体结果为false。 |
&& | 符号两端需要两个表达式,判断如果都为true,整体结果则为true,如果有一端结果为false,整体结果为false。 |
| | 符号两端需要两个表达式,判断如果都为false,整体结果则为false,如果有一端结果为true,整体结果为true。 |
|| | 符号两端需要两个表达式,判断如果都为false,整体结果则为false,如果有一端结果为true,整体结果为true。 |
! | 是一个单目运算符,只有一个表达式参与运算。"!表达式"表示对原表达式的结果取相反值。 |
^ | 按位异或。将操作数转换为二进制后,按位比较,如果相同结果为0,不同结果为1,最终二进制结果转换为十进制。 |
>> | 按位右移。将第一个操作数转换为二进制后,向右移动第二个操作数对应的位数,再将结果转换为十进制。 |
<< | 按位左移。将第一个操作数转换为二进制后,在后边补充第二个操作数对应数量的0,再将结果转换为十进制。 |
区分:& 与 &&
相同点1:& 与 && 的运算结果相同
相同点2:当符号左边是true时,二者都会执行符号右边的运算
不同点:当符号左边是false时,&继续执行符号右边的运算,&&不执行符号右边的运算
区分:| 与 ||
相同点1:| 与 || 的运算结果相同
相同点2:当符号左边是false时,二者都会执行符号右边的运算
不同点:当符号左边是ture时,|继续执行符号右边的运算,||不执行符号右边的运
!(非)
取反 !false=true; !true=false;
^(异或)
前后一样返回false,不一样返会true;
三元运算符
条件表达式1?表达式2:表达式3;
首先运算表达式1,如果结果为true,执行问号后的表达式2;
如果结果为false,执行冒号后的表达式3。
整个表达式的最终结果为表达式2或表达3。
运算符优先级
运算符存在先后关系的情况
()优先级最高, * / 高于+ -,&& 高于 ||
四、选择结构语句
if条件语句
if语句
单分支if语句
如果判断条件满足则执行代码,条件不满足则不执行。
if(判断条件){//判断条件的结果为布尔值
条件满足时执行的代码
}
双分支if语言
如果判断条件满足则执行代码,条件不满足则执行另外的代码。
if(判断条件){
条件满足时执行的代码
}else{
条件不满足时执行的代码
}
多分支if语句
if(判断条件1){
如果判断条件1满足时执行
}else if(判断条件2){
如果判断条件2满足时执行
}else if(判断条件3){
如果判断条件3满足时执行
}else{
如果所有条件都不满足时执行
}
注:依次判断条件是否成立,如果有一判断条件成立,则后续分支不再判断
if嵌套
if(){
if(){ }
}else{
if(){ }
}
注:嵌套太多层,会导致代码可读性变低。
switch语句
当一个变量的情况能够例举出来时,我们使用switch语句更为简洁。
switch(变量){//要判断的变量,只能是非long整型、字符型char和字符串String和枚举类型
case 值:
//如果变量的值与当前case的值匹配,执行这里的代码
break;
case 值:
//如果变量的值与当前case的值匹配,执行这里的代码
break;
default:
//如果没有任何值与变量的值匹配,执行这里的代码
break;
}
注:
1.swtich小括号中的变量只能是非long的整型、字符型char、字符串String和枚举类型
2.小括号中的变量类型要与case后的值的类型相匹配
3.如果有某个case后的内容和变量值匹配,执行case后的代码,
如果没有任何case匹配,执行default后的代码4.break和default可以省略。
如果不写break,会一直执行后续case后的代码,直到遇到break或没有代码为止。
5.如果多个case后执行的内容一致,可以省略break,将统一要做的代码放在最后的case后
if语句与Switch语句的选择
- 如果条件的情况能够一一列举出来,选用Switch更为简洁。
- 如果条件是一个范围,就选用if语句。
- switch语句可以改写为if语句,但if语句不一定能改为switch语句。
五、循环结构语句
while循环
while(循环条件){
满足循环条件时重复执行的代码
}
int num=0;
int sum=0;
while (num<100){
num+=7;
sum++;
}
System.out.println(sum);
执行流程
先执行小括号中的内容,如果结果为true,执行大括号中的内容,再循环执行小括号中的内容,判断如果为false则停止循环。
注意:while循环有可能一次都不执行。
do-while循环
do{
满足循环条件时重复执行的代码
}while(循环条件);
执行流程
先执行一次do大括号中的内容,再判断while小括号中的内容,如果成立,再次执行do大括号中的内容,如果不成立,停止循环。
注:do-while循环至少执行一次。
for循环
//表达式1为定义循环变量
//表达式2为判断循环条件
//表达式3为更新循环变量
for(表达式1;表达式2;表达式3){
循环体
}
执行流程
首先执行表达式1,再执行表达式2,如果表达式2的结果为true,执行循环体,再执行表达式3,再执行表达式2判断,如果表达式2的结果为false,结束循环
int num=10,res=1;
for(int i=1;i<=num;i++){
res*=i;
}
System.out.println(num+"的阶乘为"+res);
循环嵌套
如果一个重复的过程还需要将其整体重复执行时,可以使用循环嵌套。
循环嵌套就是循环里面在写一个循环。
列如:打印九九乘法表
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(i + "*" + j + "=" + i * j + "\t");
}
System.out.println();
}
循环总结
如果已知循环次数,推荐使用for循环。
如果未知循环次数,推荐使用while循环。
while循环和for循环可以相互转换。
do-while循环至少执行一次,for循环和while循环有可能一次都不执行
六、数组
概念
一组类型相同的数据的有序集合。
关于数组
数组定义时需要确定大小和数据类型,不可改变。
定义数组时的变量保存的是实际内存空间的地址。
数据中保存的数据称为元素,每个元素有一个唯一的位置,称为索引(下标),这个索引从0计数。
可以通过数组的索引来给数组赋值或者读取数组中某个索引上的值。
定义数组
语法:数据类型[] 数组名; 或 数据类型 数组名[];注:一般通常都选用数据类型[] 数组名
注意:定义数组后,如果不将数组初始化,那么数组无法使用。
数组初始化
语法:数组名=new 数据类型[数组大小];
综上所述,定义数组的同时初始化数组
语法:数据类型[] 数组名 = new 数据类型[数组大小];
int[] red = new int[6];
给数组赋值
动态赋值
通过数组名[索引]给数组中某个位置赋值
String[] nameList = new String[3];//定义数组,保存3个人的姓名
nameList[0]="小吴";
nameList[1]="小罗";
nameList[2]="小韩";
System.out.println(nameList[0]+","+nameList[1]+","+nameList[2]);
静态赋值
在定义数组的同时赋值
数据类型 [] 数组名 = new 数据类型[]{元素1,元素2,...}
String[] nameList = new String[]{"小吴","小罗","小韩"};
数据类型 [] 数组名 = {元素1,元素2,...}
String[] nameList = {"小吴","小罗","小韩"};
注意
数组一旦初始化后,数组大小不能改变,其中的元素类型要统一
数组的索引范围是[0,数组大小-1],使用时不能超出范围。
在编译时无法识别是否超出数组索引,但运行时会抛出"数组索引溢出"异常
数组一旦初始化后,如果没有赋值,默认有初始值
数组类型的默认值如下表:
数组数据类型 | 默认值 |
整型 | 0 |
浮点型 | 0.0 |
引用类型(如String等) | null |
布尔型 | false |
字符型 | 空白字符 |
数组工具类Arrays
Arrays是jdk提供的用于处理数组的工具类。包含了如排序、复制、填充等方法,这些方法都是静态方法,直接通过Arrays调用。
常用方法 | 作用 |
sort(数组) | 将输入中的元素升序排序。 |
sort(数组,起始位置,结束位置) | 对数组中[起始位置,结束位置)区间的元素升序排序。 |
fill(数组,值) | 使用指定值对数组中的所有元素进行填充。 |
fill(数组,,起始位置,结束位置,值) | 使用指定值对数组中[起始位置,结束位置)区间的元素进行填充。 |
copyOf(数组,新数组长度) | 复制数组并指定复制后的数组的长度。得到复制后的新数组。 |
asList(一组数据) | 将一组数据转换为List集合。 |
equals(数组1,数组2) | 判断两个数组是否相同,得到判断的布尔值。只有两个数组一模一样时得到true。 |
八、实例
实例:编写学生成绩管理系统
使用的技术:
一、键盘录入技术
是java自己提供的程序给程序员调用的
键盘录入技术
1、导包(自动) import java.utl.Scanner;
2、创建一个扫描器对象:Scanner sc =new Scanner(System.in)
二、使用if语句
在调用的方法中使用if语句来判断键盘输入的数字是否正确,如果不正确的话进行提示
代码如下:
String str = readKeyBoard(1);
c = str.charAt(0);
if(c != '1' && c != '2' && c != '3' ){
System.out.print("选择错误,请重新输入:");
}else break;
三、使用switch语句
在调用的方法中使用返回的值通过Switch语句来列举出该学生成绩管理系统的功能
char selection = Utility.readMenuSelection();
switch (selection){
case '1':
System.out.println("-------------学生成绩管理明细-------------");
System.out.println(Details);
System.out.println(Details2);
System.out.println("---------------------------------------\n");
break;
四、使用数组
用数组来存储学生的姓名、课程名称、各科成绩、总分、平均分等信息
代码如下:
String[] name=new String[student]; //存储学生姓名
String[] course=new String[num]; //存储课程名称
int[][] score=new int[student][num]; //存储各科成绩
int[] sum=new int[student]; //存储总分
int[] avg=new int[student]; //存储平均分
String[] information=new String[student]; //存储学生信息
五、使用for循环嵌套
在for循环嵌套中采用冒泡排序来进行学生总分的排序,排序后要从最高总分往下排序。
代码:
for(int i=0;i<student-1;i++){ //冒泡排序
for(int j=0;j<student-1;j++){
if(sum[j]<sum[j+1]){ //比较总分
int t=sum[j]; //交换总分
sum[j]=sum[j+1];
sum[j+1]=t;
String temp=information[j]; //交换字符串
information[j]=information[j+1];
information[j+1]=temp;
}
}
}
六、调用方法
在学生成绩管理系统中使用了调用方法来进行功能的选择和判断是否退出
调用方法的全部代码:
import java.util.Scanner;
public class Utility {
private static Scanner sc = new Scanner(System.in);
public static char readMenuSelection(){
char c;
for(; ; ){
String str = readKeyBoard(1);
c = str.charAt(0);
if(c != '1' && c != '2' && c != '3' ){
System.out.print("选择错误,请重新输入:");
}else break;
}
return c;
}
public static char readConfirmSelection(){
char c;
for(; ; ){
String str = readKeyBoard(1).toUpperCase();
c = str.charAt(0);
if(c == 'Y' || c == 'N'){
break;
}else {
System.out.print("选择错误,请重新输入:");
}
}
return c;
}
private static String readKeyBoard(int limit) {
String line="";
while (sc.hasNext()) {
line = sc.nextLine();
if(line.length()<1||line.length()>limit){
// System.out.print("输入长度(不大于" + limit + ")错误,请重新输入v:");
continue;
}
break;
}
return line;
}
}
主代码:
import java.util.Scanner;
public class Studentguanlichengji {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
boolean isFlag = true;
String Details = "该系统主要用于学生成绩管理";
String Details2 = "录入班级学生的各科成绩,计算总分、平均分,并按总分降序排序";
while (isFlag){
System.out.println("----欢迎使用学生成绩管理系统---");
System.out.println("-----------请选择功能--------");
System.out.println(" 1.学生成绩管理明细");
System.out.println(" 2.学生成绩排名明细");
System.out.println(" 3.退 出\n");
System.out.print(" 请选择(1-3):");
char selection = Utility.readMenuSelection();
switch (selection){
case '1':
System.out.println("-------------学生成绩管理明细-------------");
System.out.println(Details);
System.out.println(Details2);
System.out.println("---------------------------------------\n");
break;
case '2':
System.out.println("请输入学生个数:");
int student=sc.nextInt();
System.out.println("请输入课程数目:");
int num=sc.nextInt();
String[] name=new String[student]; //存储学生姓名
String[] course=new String[num]; //存储课程名称
int[][] score=new int[student][num]; //存储各科成绩
int[] sum=new int[student]; //存储总分
int[] avg=new int[student]; //存储平均分
String[] information=new String[student]; //存储学生信息
for(int i=0;i<num;i++){
System.out.println("请输入第"+(i+1)+"个课程名称");
course[i]=sc.next();
}
for(int i=0;i<student;i++){
System.out.println("请输入第"+(i+1)+"个学生的名字:");
name[i]=sc.next();
information[i]=name[i]+"\t\t";//拼接姓名
for(int j=0;j<num;j++){
System.out.println("请输入学生"+name[i]+course[j]+"的成绩:");
score[i][j]=sc.nextInt();
sum[i]+=score[i][j]; //计算总分
information[i]+=score[i][j]+"\t\t"; //拼接各科成绩
}
avg[i]=sum[i]/student; //计算平均分
information[i]+=sum[i]+"\t\t"+avg[i]+"\t\t"; //拼接总分、平均分
}
for(int i=0;i<student-1;i++){ //冒泡排序
for(int j=0;j<student-1;j++){
if(sum[j]<sum[j+1]){ //比较总分
int t=sum[j]; //交换总分
sum[j]=sum[j+1];
sum[j+1]=t;
String temp=information[j]; //交换字符串
information[j]=information[j+1];
information[j+1]=temp;
}
}
}
System.out.print("姓名\t\t");
for(int i=0;i<num;i++){
System.out.print(course[i]+"\t\t");
}
System.out.println("总分\t平均分\t排名\t\t"); //表头
for(int i=0;i<student;i++){
System.out.println(information[i]+"第"+(i+1)+"名\t\t");
}
break;
case '3':
System.out.print("确认是否退出(Y/N):");
char isExit = Utility.readConfirmSelection();
if(isExit == 'Y'){
isFlag = false;
}
}
}
}
}
项目难疑点总结
在调用方法时,由于缺少了判断退出的条件,导致选择退出时不能正常退出,后来在CSDN中查阅了许多关于调用方法来退出的资料和代码,才完成选择退出时功能的正常退出。还有就是在冒泡排序的时候总是忘记交换字符串,导致排名的时候无法从最高分降序排序;而调用方法是通过自主学习写的一个小方法。
如果做的不好请指教!