CHAPTER 1 初识JAVA
一、课前准备:配置环境变量
1、添加环境变量的位置
计算机->计算机->右击->属性->高级系统设置->环境变量->系统环境变量
2、配置JAVA环境变量
1)创建一个环境变量
变量名:JAVA_HOME
值:jdk安装根目录 D:\TOOLS\Java\jdk1.7.0_67
2)在Path环境变量下添加:%JAVA_HOME%\bin;(最好放在最前面,%是替换符 ;是路径开始或结束)
3)分别测试一下命令: java; javac; java -version
小知识::环境变量配置的作用(http://jingyan.baidu.com/article/59a015e3ab9d0cf795886579.html)
a)配置环境变量-1:新建JAVA_HOME。
作用:1)为了方便引用,比如,你JDK安装在C:\Program Files\Java\jdk1.6.0目录里,则设置JAVA_HOME为该目录路径, 那么以后你要使用这个路径的时候, 只需输入%JAVA_HOME%即可, 避免每次引用都输入很长的路径串;
2)归一原则, 当你JDK路径被迫改变的时候, 你仅需更改JAVA_HOME的变量值即可, 否则,你就要更改任何用绝对路径引用JDK目录的文档, 要是万一你没有改全, 某个程序找不到JDK, 后果是可想而知的----系统崩溃!
3)第三方软件会引用约定好的JAVA_HOME变量, 不然, 你将不能正常使用该软件, 以后用JAVA久了就会知道, 要是某个软件不能正常使用, 不妨想想是不是这个问题。
b)配置环境变量-2:新建CLASSPATH。(可省略)
变量名为:CLASSPATH
变量值为:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar(要加.表示当前路径)
作用:这个变量设置的目的是为了程序能找到相应的".class"文件,
不妨举个例子: 你编译一个JAVA程序---A.java, 会得到一个A.class的类文件,你在当前目录下执行java A, 将会得到相应的结果(前提是你已经设置CLASSPATH为"."). 现在, 你把A.class移到别的目录下(例如:"e:\"), 执行java A, 将会有NoClassDefFindError的异常,原因就是找不到.class文件, 现在你把CLASSPATH增加为:".;e:\"再运行java A, 看看会有什么结果),一切正常, java命令通过CLASSPATH找到了.class文件!
c)配置环境变量-3:补充Path。(注意是追加,而不是替换!)
作用:道理很简单, 你想在任何时候都使用%JAVA_HOME%\bin\java 等来执行java命令吗, 当然不会, 于是, 你可以选择把 %JAVA_HOME%\bin添加到PATH路径下, 这样, 我们在任何路径下就可以仅用java来执行命令了.(当你在命令提示符窗口输入你个代码时,操作系统会在当前目录和PATH变量目录里查找相应的应用程序, 并且执行.)
配置环境变量时,用户变量与系统变量的差别:系统环境变量,对所有用户起作用;而用户环境变量只对当前用户起作用。
DOS窗口几个常用命令:
打开窗口windows+R,输入CMD回车
cd 进入 cd子目录
cd ..//回到上一级
dir 列出当前路径的所有子文件
二、第一个JAVA程序
1、源代码
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello!");
}
}
Notes:
1)类名与文件名完全一致,类名首字母大写
2)main:程序的入口,程序由此执行
3)System.out.println("输出的内容"); 控制台输出内容,固定格式
转义符:\n 将光标移到下一行
\t 将光标移到下一个水平制表位置
2、运行程序
开发JAVA程序三步走:编写源程序->编译源程序->运行字节码文件
使用javac编译 HelloWorld.java文件 javac HelloWorld.java
使用java运行 HelloWorld.class文件(字节码文件/类文件) java HelloWorld(注意不带.class)
PS: 1)JAVA的可移植性(Write once,Run Anywhere)
2)几个概念:
JDK(java development kit)
JRE(java runtime environment)
JVM(java virtual machine)
3)java的注释
文档注释 /** */
单行注释 //
多行注释 /* */
CHAPTER 2 数据类型和运算符
一、标识符和关键字
关键字:java语言赋予特殊含义的单词,
特点:高级开发工具具有颜色,全部小写
标识符:给变量和方法等起名字的
命名规则: 1)组成由字母(大小写)、数字、下划线、$
2)不能以数字开头
3)不能使用关键字
4)驼峰命名法,见名知意
二、常量与变量
1、常量:不可改变的量 10,PI,“abc”,true
常量定义使用关键字final, final double PI = 3.14
note: 常量名通常大写;不同字符间使用下划线;只能被赋值一次,通常定义时即对其初始化
2、变量:值可以变化的量,可以存储相对应的数据 int num = 10;
使用变量的步骤:1.申明变量 (数据类型 变量名 Ex. int money;)
2.赋值,可与1合并 (变量名=数值 money = 1000;)
3.使用变量
三、数据类型(参考imooc笔记)
1、java中的基本数据类型
整型
byte 1字节8位 -128~127
short 2字节16位
int 4字节32位 范围:2^31-1
long 8字节64位
浮点型
float 4字节32位浮点数
double 8字节64位浮点数
char 2字节
boolean 两个值:true/false
2、String:不是基本数据类型,它是引用数据类型,是JAVA提供的一个类
(note: java中默认使用int表示整型,使用double表示浮点型
java中的基本数据类型共有8种,String不是
注意一下代码的问题:
byte b1 = 3;
byte b2 = 4;
byte b = b1+b2;
)
四、Scanner的使用、自动类型转换、强制类型转换
1、使用Scanner的步骤:
1)导入Scanner类-> inport java.util.Scanner
2)创建Scanner对象->Scanner input = new Sacnner(System.in);
3)获得键盘输入的数据->int num = input.nextInt();
int num = input.nextInt();//阻塞,next()只能获取有效值,可用nextLine()获取无效值(空格/换行后面的值)
Scanner的常用方法:String next(); int nextInt(); double nextDouble(); boolean hasNext 判断是否有输入数据。如果有输入数据则返回true;否则,返回false
2、自动类型转换、强制类型转换
自动类型转换的条件:两种类型要兼容;目标类型要大于源类型
* byte,short,char-> int ->long ->float ->double
* 浮点型与整型的存储方式不一样,float的范围比long广,所以long(8字节)可以转为int(4字节)
记住:
byte b1 =3;
byte b2 = 4;
byte b= b1+b2;//类型提升,报错
byte b = 3+4;//常量在编译时已经计算,不会报错
强制类型转换:语法 -> 目标数据类型 变量名 = (目标数据类型)源数据
五、运算符
1、赋值运算符 =
两个整型变量值的交换方式的几种方式
A.引入中间变量
int a = 3;
int b = 4;
int temp = a;
a = b;
b = temp;
B.求和求差
int a = 3;
int b = 4;
a = a+b;//a=7,b=4(前提是a+b不能溢出)
b = a-b;//a=7,b=3
a = a-b;
C.一个表达式实现
int a = 3;
int b = 4;
b = a+b-(a=b);
D.异或^
仅当两条件中一个为真,另一个为假时,结果为真。真^假=真 假^真=真 真^真=假 假^假=假
但java的异或运算都是以二进制为基础进行的运算
a = a^b;
b = a^b;
a = a^b;
复合赋值运算符 += -= *= /= %=
2、算术运算符 + - * / % ++ --
num++和++num的区别:num++先取num的值赋值,后自增; ++num 先自增,后取num的值赋值
3、关系运算符 > == < >= <= != 结果是boolean类型,
>、<、>=、<= 运算符的优先级别高于==、!=
>、<、>=、<=运算符只支持数值类型的数据比较
4、逻辑运算符 && || !
如果第一个操作数已经能确定表达式的值,第二个操作数就不再计算了,使用|可以指明即使能判断结果仍然执行后面的语句;优先级别! > && > ||
5、三目运算符/条件运算符 关系表达式?值1:值2
如果关系表达式为true,结果是值1;如果关系表达式为false,结果是值2;值1,2也可以是字符串
求两个数的最大值:int max = num1>num2?num1:num2;
6、运算符的优先级
最低要求:优先级最高(括号)、低(赋值=)的运算符
算术运算符 > 关系运算符 > 逻辑运算符
CHAPTER 3 流程控制
一、if分支结构
1、if选择结构
2、if...else...
3、多重if语句
4、if嵌套
字符串的比较使用equals( ) Ex. sex.equals("男"); 比较基本数据类型是否相等用“==”,其余都用equals
产生随机数0-9的方法:int random = (int)(Math.random( )*10)
二、switch选择结构语法
switch结构->解决等值判断问题 int byte short char 枚举类型(JDK1.5) String(JDK1.7)
switch, case, break, default
每个case后不要忘记写break; default通常放在末尾(需要加break;),也可以省略
switch 与 if的区别:switch只能处理等值条件判断的情况; if特别适合某个变量处于某个连续区间时的情况
switch(today){
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("上课写代码");
break;
case 6:
System.out.println("自习,复习,提高");
break;
case 7:
System.out.println("休整");
break;
default:
System.out.println("输入有误");
}
三、循环结构语句
无论哪一种循环结构,都有4个必不可少的部分:初始部分、循环条件、循环体、迭代部分
循环语句注意分析 循环条件和循环体
1、使用while循环
while(循环条件){
循环操作
}
先判断,再执行
public class Demo3 {
public static void main(String[] args) {
System.out.println("MyShopping管理系统 > 购物结算");
Scanner input = new Scanner(System.in);
String choose = "";//用来存储用户的选择
while (!choose.equals("n")) {
System.out.println("*******************");
System.out.println("请选择购买的商品编号:");
System.out.println("1.T 恤\t2.网球鞋\t3.网球拍");
System.out.println("*******************");
System.out.println("请输入商品编号:");
int num = input.nextInt();//用来接收商品编号
switch (num) {
case 1:
System.out.println("T 恤\t¥245.0");
break;
case 2:
System.out.println("网球鞋\t¥285.0");
break;
case 3:
System.out.println("网球拍\t¥300.0");
break;
default:
System.out.println("输入商品号有误");
}
System.out.println("是否继续(y/n):");
choose = input.next();
}
System.out.println("程序结束");
}
2、使用do...while循环
do{
循环操作
} while(循环条件)
先执行,再判断(任何情况下都至少执行一次)
3、使用for循环
System.out.println("根据这个值可以输出以下加法表:");
for(int i=0,j=num;i<=num;i++){
System.out.println(i+"+"+j+"="+num);
j--;
}
四、循环语句嵌套
1、打印矩形
int hang = 5;
int lie = 5;
//行数
for (int j = 0; j < hang; j++) {
//每行打印的*的个数
for (int i = 0; i < lie; i++) {
System.out.print("*");
}
System.out.println();//换行
}
2、打印一个三角形
int hang = 7;
int lie = 4;
//n hang-n
//n 2*n+1
//外层控制行数
for(int i=0;i<hang;i++){
//内层控制""的个数
for(int j=0;j<hang-i;j++){
System.out.print(" ");
}
//内层控制*的个数
for(int j=0;j<(2*i+1);j++){
System.out.print("*");
}
System.out.println();//换行
}
3、打印一个菱形
for(int j=0;j<4;j++){
for(int i=0;i<4-j;i++){
System.out.print(" ");
}
for(int i=0;i<4;i++){
System.out.print("*");
}
4、打印99乘法表
//控制行数
for(int i=1;i<=9;i++){
//控制列的个数
for(int j=1;j<=i;j++){
//根据行列i,j 打印算数表达式
System.out.print(j+"*"+i+"="+i*j+"\t");
}
System.out.println();
}
// + 对于字符串来说,+代表拼接
五、跳转语句控制程序流程
break语句,continue语句,return
使用标志位和break实现跳出:
Scanner input = new Scanner(System.in);
System.out.println("请输入学生姓名:");
String name = input.next();
double sum = 0;
boolean flag = true;// 定义一个标志位
for (int i = 1; i <= 5; i++) {
System.out.print("请输入第" + i + "门成绩");
double score = input.nextDouble();// 存储成绩
if (score < 0) {
flag = false;// 输入为负值,flag赋值为false
break;
}
sum += score;
}
if (flag) {
System.out.println(sum / 5);
} else {
System.out.println("输入的成绩为负数");
}
}
使用continue统计成绩大于80的分学生的人数
Scanner input = new Scanner(System.in);
System.out.println("请输入班级总人数:");
int stuNo = input.nextInt();//总人数
int num = 0;//存储大于80分学生的人数
for(int i=0;i<stuNo;i++){
System.out.print("请输入第"+i+"位学生的成绩:");
double score = input.nextDouble();
if(score<=80){
continue;//跳出本次循环,进入下一次循环
}else{
num++;
}
}
System.out.println("80分以上的学生人数是:"+num);
System.out.println("80分以上的学生所占的比例是:"+num*1.0/stuNo*100+"%");
/*
* *1.0
* 强制double
* 定义为double变量
*/
break:跳出整个循环;常用于switch结构和循环结构中
continue:跳出本次循环,进行下一次循环;只能用在循环中
多重循环中,break和continue都是终止离他最近的那一个循环
return:结束当前方法的执行并退出,返回到调用该方法的语句处
六、程序调试
设置断点->单步运行->观察变量
Debug
step over
CHAPTER 4
一、数组的定义与赋值
1、数组的定义
声明一个变量就是在内存空间划出一块合适的空间
声明一个数组就是在内存空间划出一串连续的空间
a)int[ ] arr ={12,23,43,23,12};//直接申明数组,静态申明方式
b)//动态申明方式
int[] array = new int[3];
array[0] = 12;
array[1] = 13;
array[2] = 15;
c)int[] a = new int[]{12,23,45,43};
2、java中数组特点:长度固定,属性数据类型相同,下标从0开始
arr.length获取数组长度
3、循环赋值
for(int i=0;i<arr.length;i++){
System.out.print("请输入第"+(i+1)+"笔购物金额:");
arr[i]=input.nextDouble();
}
遍历数组
for(int i=0;i<arr.length;i++){
System.out.println("arr的第"+(i+1)+"个元素是:"+arr[i]);
}
数组元素之和
for(int i=0;i<arr.length;i++){
sum +=arr[i];
}
4、堆内存与栈内存的特点
堆:会做默认的初始化
整数 0
浮点型 0.0
String null
字符 空字符
栈:不会做默认的初始化
要求:使用变量前要初始化
new出来的都在堆中(数组、Scanner)
//数组输入一个数,判断数组中是否有这个数
Scanner input = new Scanner(System.in);
System.out.println("请输入一个整数:");
int num = input.nextInt();
for(int i=0;i<arr.length;i++){
if(num==arr[i]){
System.out.println("包含"+num);
break;//结束循环
}
}
二、数组排序
1、数组注意事项:数组下标从0开始;数组长度->数组名.length;数组元素遍历->for/foreach
2、数组常用操作:1)获取最大值、最小值
int max = arr[0];
int min = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
if(arr[i]<min){
min = arr[i];
}
}
System.out.println("最大值为"+max);
System.out.println("最小值为"+min);
}
2)数字排序
冒泡排序
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr.length-i-1;j++){
int temp = 0;
if(arr[j]<arr[j+1]){//降序 //升序 arr[j]>arr[j+1];
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
共需要(N-1)+(N-2)+...+2+1=N(N-1)/2????
3)数组插入元素(原数组已降序排列)
int num = 86;
int[] arr = {99,98,95,87,76};
//1.确定插入的下标
int index = -1;//若为-1,则添加到最后一位
for(int i = 0; i<arr.length;i++){
if(num>arr[i]){
index = i;//存储下标,并结束循环
break;
}
}
if(index==-1){
index = arr.length;
}
System.out.println(index);
//2.创建数组,把老数组的值拷贝到新数组中
//{99,98,95,87,76,0};
int[] newArr = new int[arr.length+1];
for(int i=0;i<arr.length;i++){
newArr[i]=arr[i];
}
//3.index往后,所有元素往后挪一位
for(int i=newArr.length-1;i>index;i--){
newArr[i]=newArr[i-1];
}
//4.插入值
newArr[index] = num;
for(int i=0;i<newArr.length;i++){
System.out.print(newArr[i]+"\t");
}
4)逆序
//逆序打印
//方法1
for(int i=0;i<arr.length/2;i++){
int temp = arr[i];
arr[i] = arr[arr.length-i-1];
arr[arr.length-i-1] = temp;
}
//方法2
for(int i=0,j=arr.length-1;i<j;i++,j--){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//遍历打印
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+"\t");
}
3、使用Arrays类操作数组,使用java.util.Arrays类
1)Arrays.sort(数组名) -> 对数组进行升序排列:
int[] arr = {90,9,45,65,78};
Arrays.sort(arr);//排序
for(int i = 0;i<arr.length;i++){
System.out.print(arr[i]+"\t");
}
2)booleanequals(array1,array2) -> 比较array1和array2两个数组是否相等
int[] arr1 = {1,2,3};
int[] arr2 = {1,2,3};
boolean b= Arrays.equals(arr1, arr2);
System.out.println(b);
3)StringtoString(array) -> 将一个数组array转换成一个字符串(获取数组拼接的字符串,获取arr的内容,拼接成字符串)
//用1填充arr
Arrays.fill(arr1, 1);//value必须与数组类型相同
System.out.println(Arrays.toString(arr1));
4)voidfill(array,val) -> 把数组array所有元素都赋值为val
5)copyOf(array,length) -> 把数组array复制成一个长度为length 的新数组,返回类型与复制的数组一致
int[] oldArr = {1,2,3,4};
//创建一个指定长度的数组,并把原数组的元素赋给新数组
int[] newArr = Arrays.copyOf(oldArr, oldArr.length+1);
System.out.println(Arrays.toString(newArr));
6) binarySearch(array,val) -> 查询元素值val在数组array中的下标, (要求数组中元素已经按升序排列)
int[] arr3 = {1,2,3,4,5,6,7,8,9};
int num = Arrays.binarySearch(arr3, 5);
System.out.println(num);//4
4、二维数组的使用
1)语法:<数据类型> [][ ] 数组名; 或者 <数据类型> 数组名 [ ][ ];
int[] arr1 = {1,2,3};
int[] arr2 = {4,5,6};
//如果一个数组的元素还是一个数组,他就是一个二维数组
int[][] erWei ={arr1,arr2};
二维数组实际上是一个一维数组,它的每个元素又是一个一维数组
2)二维数组定义与赋值
//1、二维数组的定义
//方法1
int[][] arr1 = {{1,3,6},{2,5,8},{3,6,9}};
//方法2
int[][] arr2 = new int[2][3];
/*
* new int[m][n]
* m:二维数组的长度
* n:二维数组元素(也是一个数组)的长度
*/
//方法3
int[][] arr3 = new int[2][];
arr3[0] = new int[]{3,6,9};
arr3[1] = new int[]{4,5,6,7,8};
//2、二维数组的赋值
int[][] scores1=new int[][]{ { 90, 85, 92, 78, 54 }, { 76, 63,80 }, { 87 }};
int scores2[][] = {{ 90, 85, 92, 78, 54 }, { 76, 63,80 }, { 87 } };
3)二维数组与内存
4)遍历二维数组
//二维数组的遍历
//方法1
for(int i=0;i<erWei.length;i++){
System.out.println(Arrays.toString(erWei[i]));
}
//方法2-双层for循环
for(int i=0;i<erWei.length;i++){
for(int j = 0;j<erWei[i].length;j++){
System.out.print(erWei[i][j]+"\t");
}
System.out.println();
}
5)练习-5个班各5名学生某门课程的成绩,计算各班各自的总成绩?
public static void main(String[] args) {
int[][] scores = new int[2][2];
Scanner input = new Scanner(System.in);
//赋值
for(int i=0;i<scores.length;i++){
for(int j=0;j<scores[i].length;j++){
System.out.println("请输入"+(i+1)+"班第"+(j+1)+"个同学的成绩");
scores[i][j]=input.nextInt();
}
}
//求总成绩
for(int i=0;i<scores.length;i++){
int sum = 0;
for(int j=0;j<scores[i].length;j++){
sum+=scores[i][j];
}
System.out.println((i+1)+"班总成绩为"+sum);
}
}
5、方法
* 方法的定义
* 形式参数:位于方法体内,用来传递数据
* public static 返回值 方法名(数据类型 变量名){
*
* }
*
* public: 修饰符
* static:静态的
* void: 返回值
* test: 方法名
* {} 方法体
*/
public static int add(int num1,int num2){
int result = num1 + num2;
return result;//用来返回值
}
public static int minus(int num1,int num2){
int result = num1 - num2;
return result;
}
public static int multiply(int num1,int num2){
int result = num1*num2;
return result;
}
public static double divide(double num1, double num2){
double result = num1/num2;
return result;
}