1.为什么要搭建java环境
    window只能运行.exe程序 不能直接运行java程序 
    java程序要想运行 需要有着自己的一个环境  所以搭建了java的运行环境
    我们作为开发人员 还要开发java程序 需要使用到一些开发工具  所以 要安装JDK
    JDK:java开发工具  包含开发工具 还有 JRE
    JRE:java运行环境   包含 JVM 和  类库
    JVM:java虚拟机 java程序都要在JVM上运行 java实现跨平台 依赖 JVM
    
2.为什么要配置环境变量
    可以在不同目录下 直接使用 java提供的开发工具 比如 javac.exe  java.exe
    
3.编写入门程序步骤 
     1.编写源代码  
     2.将源代码编译成class文件  
            javac java文件名.java
     3.运行class文件 
            java 类名
4.注释 
     可以对代码进行标注 解释 注释不会运行 
     // 单行注释 
     /**/  多行注释
     /** */  文档注释
5.关键字 
    java中被赋予特殊含义的单词  
    public class static  void 
6.标识符 
    在java中自己定义名字的地方
    
    规则
        1.字母 数字 _ $ 组成
        2.数字不能开头 
        3.不能使用关键字
    建议 
        类名:大驼峰式  每个单词首字母大写  例如  HelloWorld
        变量名和方法名:小驼峰式 第一个单词首字母小写 其他单词首字母大写  例如  helloWorld
        常量: 每个字母都大写 多个单词 _ 连接  例如 : HELLO_WORLD
7.数据类型 
    两种  
     基本类型 
           整数  小数  字符  布尔
     引用类型 
          类  接口 数组  
8.常量 
     代码中直接给的数值 不能改变的值 
     整数 
         10进制    10
         2进制     0b1101
         8进制     015
         16进制    0xD
     小数 (不精确的) 
         10.1  
     字符  
         单引号包裹 有且仅有一个字符  'a'
     布尔 
         true false
         
         
     字符串  
         "啊啊啊啊啊"
         
9.转义字符 
     将一些有特殊含义的字符 转换为普通字符 
     \
10.字符的存储原理
    'a' --- > ASCII --->97 --->二进制存储  编码
    二进制 ---->97 ---->ASCII ---->'a'    解码

11.变量 
    内存中临时存储数据空间
    一个变量 只能存储一个数据 
    并且一种类型的变量 只能存储当前类型的数据
    
12.变量的定义格式 
     数据类型 变量名 ; // 定义变量
     变量名 = 值; //为变量赋值 
     
     数据类型 变量名 = 值; //定义变量并赋值 
     
13.基本类型4类8种  
     整数 
         byte         1      -128 127
         short      2   
         int        4      默认
         long       8       加L 
     小数(不精确的)   
         float      4       加f
         double     8       默认
     字符
         char       2
     布尔
         boolean    1      true  false
         
14.类型转换 
     byte<short=char<int < long < float<double 
     自动类型提升
           小萝卜放大坑
           大的类型  变量名 = 小类型的数值;
           
           double b = 10;
           int a = 'a';
           
     强制类型转换
            大萝卜放小坑 
            小的类型  变量名 = (小的类型)大类型的数值;
            int a = (int)10.1;
            
     面试题
         byte b  = 10; 
         b = 10 + b; //有问题 需要强制类型转换 
         b +=10; //没问题 

15.运算符  
    算数运算符 
        +   正常加法   可以拼接字符串 直接与字符串相连接 结果为字符串 否则 正常计算
        -   正常减法
        *   正常乘法
        /   整数整除 取商部分    小数正常计算     0不能做除数  
        %   整数整除 取余数部分   小数取模没有意义   符合与被除数相同
        ++  自增
            单独使用 
                +1即可 
            复合使用 
                ++后  先使用 再+1
                ++在前  先+1 在使用 
        -- 自减
    
    赋值运算符 
        = += -= *= /= %=
        将等号两边 按照运算符进行计算 然后将得到的结果转换为等号左边的类型 最后赋值给等号左边
        
        int a = 10;
        a += 20; //  a =  (int)(a + 20)
    比较运算符  
        结果是布尔值 
        > >= < <=  == !=
        
    逻辑运算符 
        操作布尔值 结果还是布尔值 
        &&  短路与   并且  有假则假
        ||  短路或   或者  有真则真 
        !   非       取反  真变假 假变真 
        ^  相同为假 不同为真 
        
        &&和&的区别  
         都代表并且的意思 两个条件都为真 结果才为真 只要有一个条件为假 结果就为假
         但是 && 有短路功能  如果使用&& 判断第一个条件为false  不再判断第二个条件 而是直接得出结果为false
         如果是 &  没有短路功能  判断第一个条件为false 还会继续判断第二个条件 
    三元运算符  
        条件表达式? 表达式1 : 表达式2 ;
        如果满足条件 执行表达式1 
        如果不满足条件 执行表达式2 
        
        注意: 三元表达式一定要返回一个结果 并且这个结果必须被使用
    位运算符 
        12<<3  代表 12 * 2的3次方     M<<N  代表  M * 2的N次方
        12>>3  代表12 /2 的3次方     M>>N 代表 M/2的N次方
    算数优先级 
       优先级 最高 ()

16.引用数据类型使用三步
    1.导包   找到这个类的过程
        import  包名.包名.类名;
    2.定义变量并赋值(创建对象)
        数据类型 变量名 = new 数据类型();
    3.调用方法 
         变量名.方法名();
17.Scanner 
    导包 
        import java.util.Scanner;
    创建对象 
        Scanner sc = new Scanner(System.in);
    方法 
      

int nextInt()
         double nextDouble();
         String  next();


        
18.Random 
    导包 
        import java.util.Random;
    创建对象 
        Random r = new Random();
    方法 
         double nextDouble()  [0,1)
         int nextInt(int max)  [0,max)

19.if语句 
    
    单条件判断 
    if(条件){
        语句...    
    }
    
    满足条件 执行语句 不满足则不执行

    
    互斥条件判断
    if(条件){    
        if语句
    }else{
        else语句
    }
    满足条件执行 if语句 不满足条件执行 else语句
    
    
    多条件判断
    if(条件1){
        语句1
        
    }else if(条件2){
        语句2
        
    }else if(条件3){
        语句3
    }...else{
        else语句    
    }
    满足哪个条件就执行 对应条件的语句
    如果所有条件都不满足 则执行else语句

    if语句的注意事项 
         1.如果语句只有一句话  可以省略大括号
         2.需要注意变量的作用域范围
         //3.java在编译时 只检查语法格式是否正确 不检查变量的值是什么
20.switch语句 
     在几个值中 选择一个值 不能做区间的判断 
     switch(被判断的值){
        case  值1:
            语句;
            break;
        case  值2:
            语句;
            break;
            ....
        default:
            语句;
            break;    
     }
     
     注意事项 
         1.被判断的值的类型 只能是 byte short int  char  枚举(JDK1.5)  String(JDK1.7)
         2.case只在第一次判断时生效   case穿透 如果不写break代码会一直向下执行 知道遇到break或者{}结束
21.循环
    1.初始化表达式
    2.布尔表达式
    3.步进表达式
    4.循环体
for循环格式 
    for(初始化表达式1;布尔表达式2;步进表达式3){
        循环体4;
    }
    执行流程  124 324 324 324 ....2不满足为止
    注意事项 
        1234均可为空 
         当1为空时 不是真的不定义初始化表达式 而是将初始化表达式定义在循环外
                   需要注意变量的作用域范围
         当2为空时 相当于值为true的死循环    
         当3为空时 两种情况 一种是将步进表达式卸载循环体中 
                   第二种 就是不写步进表达式 那么 循环变量一直没有变化 死循环
         
         当4为空时 没有意义
while循环格式 
    初始化表达式1
    while(布尔表达式2){
        循环体3;
        步进表达式4;
    }
    执行流程 1234 234 234 ....2不满足为止
do...while循环 
    初始化表达式1
    do{
        循环体2;
        步进表达式3;
    }while(布尔表达式4);
    
    执行流程  1234 234 234 ...4不满足为止 
    需要注意:dowhile循环无论是否满足条件 都至少执行一次
    
break:在switch和循环中使用   
      在switch中使用 跳出switch
      在循环中使用 完全跳出循环
continue:在循环中使用 不完全跳出  跳出当前循环 继续下一次循环;

22.idea
     常用快捷键
        psvm        main方法的快捷键
        sout        输出语句

        数字.fori      循环

        ctrl+/       单行注释
        ctrl+shift+/  多行注释
        ctrl+d          复制一行
        ctrl+y      删除光标所在行

        shift+回车    不改变当前行结构的情况下 将光标移动到下一行开头

        ctrl+alt+L    格式化代码

        alt+enter    万能修复键
        
23.数组
    数组的特点 
        1.数组的长度是固定的
        2.可以存储任意类型数据 但是同一个数组只能存储同一种类型的多个数据
        3.数组有索引 索引从0开始   最大索引  length-1
    数组的定义格式 
        定义变量并赋值
            数据类型[] 变量名 = new 数据类型[长度];
            数据类型[] 变量名 = new 数据类型[]{元素,元素};
            简化
            数据类型[] 变量名 = {元素,元素};// 这种写法 不能在重新赋值时使用
    数组的访问 
         长度  变量名.length
         元素   变量名[索引]
    数组的遍历 
        for(int i = 0;i<变量名.length;i++){
            变量名[i];
        }    
         
    两个常见的异常 
         数组索引越界异常 
             索引不存在时 抛出此异常
         空指针异常  
             使用null值去调用方法 访问属性