首页 > 代码库 > Stage 1 - Course 1 - JAVA基础知识

Stage 1 - Course 1 - JAVA基础知识

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;
     }
 

Stage 1 - Course 1 - JAVA基础知识