Stage 1 - Course 1 - JAVA基础知识

时间:2022-07-07 20:01:53

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回车

dir : 列出当前目录下的文件以及文件夹

md : 创建目录

rd : 删除目录    注意:rd不能删除非空的文件夹,而且只能用于删除文件夹。

cd : 进入指定目录

cd.. : 退回到上一级目录

cd \ : 退回到根目录

echo "hello java">a.txt  写入文本到指定文件 

type a.txt 显示文件内容命令

del : 删除文件    注意:不能删除文件夹,只能删除文件。

exit : 推出dos命令行

cls  : 通知计算机将当前的命令清空

*:  是通配符。

tab  命令补全。

方向键上下是找回上次你写过的命令。

   

二、第一个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语言赋予特殊含义的单词,
Stage 1 - Course 1 - 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)String toString(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};
 
                          Stage 1 - Course 1 - JAVA基础知识
                    二维数组实际上是一个一维数组,它的每个元素又是一个一维数组
                    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;
     }