黑马程序员_01Java基础知识总结

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

一、  Java概述:

1991 年Sun公司的James Gosling等人开始开发名称为 Oak 的语言,希望用于控制嵌入在有线电视交换盒、PDA等的微处理器;1994年将Oak语言更名为Java;

 

Java的三种技术构架:

JavaEE : Java Platform Enterprise Edition,开发企业环境下的应用程序,主要针对web程序开发;

JavaSE : Java Platform Standard Edition,完成桌面应用程序的开发,是其他两者的基础;

JavaME :Java Platform Micro Edition,开发电子消费产品和嵌入式设备,如手机中的应用程序

 

1.     JDK: Java Development Kit,Java的开发和运行环境,java的开发工具和jre.

2.     JRE: Java Runtime Environment,Java 程序的运行环境,java运行所需的类库+JVM(Java Virtual Machine)

3.     配置环境变量:让java jdk\bin目录下的工具,可以在任意目录下运行,原因是将该工具所在的目录告诉了系统,当使用该工具时,有系统帮我们去找制定的目录.

4.      Java语言特点:

1.     跨平台:通过Java语言编写的应用程序在不同的系统平台上都可以运行;

2.     原理:只要在需要运行Java应用程序的操作系统上安装一个Java虚拟机即可,然后由JVM来负责Java程序在该系统中运行.

5.      Java中常用DOS命令:

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

md:创建目录

rd:删除目录

cd :进入指定目录

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

cd/:退回到更目录

del:删除文件

exit:退出dos命令行

cls:清除当天屏幕内容

start:在当前DOS命令窗口的属性基础上,新建一个DOS命令窗口

 

 

6.系统变量的配置:

1).    永久配置方式:

(1)打开环境变量(Win7)配置窗口:

计算机-->属性-->高级系统设置-->环境变量-->系统变量

 

(2)打开开发工具JDK中的bin目录,将复制到的bin目录粘贴到系统变量path的最前面,例如:D:\ProgramFiles\Java\jdk1.7.0_09\bin,当然,为了方便使用,需要在bin目录后添加一个分号,避免导致计算机其他程序无法正常运行;

 

(3)为了安全和方便维护,可事先新建一个环境变量:JAVA_HOME,即将bin目录之前的路径封装到这个JAVA_HOME环境变量中,方便java程序的运行,例如:

变量名:JAVA_HOME

变量值:D:\ProgramFiles\Java\jdk1.7.0_09

然后再讲封装好的JAVA_HOME配置到path环境目录下,例如:

变量名:%JAVA_HOME%\bin;

备注:%%表示动态获取某一个环境变量的值

 

2).临时配置方式:

(1)set可以用于查看或者设置环境变量的值

例如:set path   -->   set path=%path%

 

(2)set path配置的环境变量只在当前dos窗口有效

set path=D:\ProgramFiles\Java\jdk1.6.0_23\bin

注意:系统默认先去当前路径下找要执行的程序,如果没有,再去path路径中设置的路径下找

 

3).classpath的配置:

(1)永久配置方式:classpath = .;c:\;d:\

(2)临时配置方式:set classpath = .;c:\;d:\

 

在定义classpath环境变量时,需要注意的情况:

       1.如果没有定义环境变量classpath,java启动jvm(虚拟机)后,会在当前目录下查找要运行的类文件;如果指定了classpath,那么会在指定的目录下查找要运行的类文件.

       2.其中,classpath配置路径的.的问题:

              1).如果classpath的值结尾处有分号,在具体路径中没有找到运行的类,jvm会默认在当前目录下再找一次;

              2).如果classpath的值结尾没有分号,在具体的路径中没有找到运行的类,那么jvm则不会在当前路径找查找

一般不指定分号,如果没有在指定目录下找到要运行的类文件,就报错,这样方便于调试程序.

 

4).path与classpath区别:

(1).path变量是windows程序文件的目录(exe,bat等),现在当前目录找,找不到就到path路径里去找,如果还是找不到就会报错.

(2).classpath变量值是java类文件(xxx.class文件)的目录

 

7.javac命令和java命令分别作什么事?

要知道java是分两个部分的:一个是编译,一个是运行.

Javac:负责的是编译部分,当执行javac时,系统会启动java的编译器程序.对指定扩展名为.java文件进行编译.生成jvm可识别的字节码文件,即.class文件,也就是java的运行程序.

Java:负责运行的部分,会启动jvm加载运行时所需的类库,并对class文件进行执行,其中,一个.字节码文件要被执行,必须要有一个执行的起始点,这个起始点就是main主函数.

 

 

 

二、  Java语法基础

1,关键字:其实就是某种语言赋予了特殊含义的单词;

保留字:其实就是还没有富裕特殊含义,但是准备为日后要使用的单词。

2,标识符:其实就是在程序中自定义的名词。比如类名,变量名,函数名。

命名规则:

1)由26个英文字母的大小写,数字0-9,_和$等符号组成

2)不能以数字开头

3)不能与java的关键字重名

其中,

包:所有单词小写。

类和接口:

如果是由一个单词组成,那么单词首字母大写;

如果是由多个单词组成,第一个单词首字母大写,其后每个单词首字母也大写。

       变量和方法:

              如果是有一个单词组成,那么单词首字母小写;

              如果是由多个单词组成,第一个单词首字母小写,其后每个单词首字母大写。

       常量:

              如果是一个单词组成,那么所有单词全部大写;

              如果是由多个单词组成,每个单词大写,并且以下划线相连接。

3,常量:是在程序中不会变化的数据。

4,变量:其实就是内存中的一个存储空间,用于存储常量数据。

作用:方便于运算,因为有些数据不确定,所以确定该数据的名词和存储空间。

特点:变量空间可以重复使用。

什么时候定义变量?     只要是数据不确定的时候,就定义变量。

 

变量空间的开辟需要什么要素呢?

1.     这个空间要存储什么数据?数据类型

2.     这个空间叫什么名字?   变量名称

3.     这个空间的第一次数据是什么? 变量的初始化值

 

变量的作用域和生命周期:

       变量的作用域:

作用域从变量定义的位置开始,到该变量所在的那对大括号结束;

       变量的生命周期:

              变量从定义的位置开始就在内存中活了,当变量到达它所在的作用域结尾的时候就在内存中释放了。

5,数据类型:

1.      基本数据类型:byte、short、int、long、float、double、char、boolean

1.byte、char和boolean均占1个字节,而一个字节分八位

2.short占2个字节,int占4字节,long占8字节

3.boolean的值只能是true或者是false

4.float单精度4个字节、double双精度8个字节

5.byte范围:-128-127,short范围:-32768-32767,char范围:0-65535

 

2.      引用数据类型:数组、类和接口。

级别从低到高为:byte,char,short(这三个平级) -->int -->float -->long-->double

自动类型转换:从低级别到高级别,系统自动转换;

强制类型转换:什么情况下使用?把一个高级别的数赋给一个该级别数的级别低的变量;

6,运算符:

1)、算术运算符

        + - * / % 其中,%:任何数%2不是0就是1,所以只要改变被%数就可以实现开关运算。

        +:连接符。

        ++ --自增自减运算符

2)、赋值运算符

        = += -= *= /= %=

3)、比较运算符

        ==   !=< > >= <=

        特点:运算完的结果是一个boolean类型的数据,即要么是true,要么是false,其中instanceof检查是否是类的对象,例如:”Hello” instanceof String

4)、逻辑运算符

        & | ^ ! && ||

        逻辑运算符除了!外都是用于连接两个boolean类型的表达式

        &:只有两边都为true,结果就是true,否则为false

        |:只有两边都为false,记过就是false,否则就是true

        ^:异或和或有点不一样,当两边结果一样就会false,两边结果不一样就为true

        &&&区别:

               &:无论左边结果是什么,右边都参与运算;

               &&:短路与,如果左边为false,那么右边不参与运算。

        |||区别:

               |:无论左边结果是什么,两边都参与运算

               ||:短语或,如果左边为true,那么右边不参与运算。

5)、位运算符:用于操作二进制位的运算符

        & | ^和<< >> 还有>>>(无符号右移)

6)、三元运算符

        1.格式:(条件表达式) ? 表达式1 : 表达式2;

        若条件为true,则运算结果为表达式1,;若条件为false,则运算结果为表达式2

        2.示例:获取两个数中的大数

        int x=3,y=4,z;

              z = (x > y) ? x : y;//z变量存储的就是两个数中的大数

       7)、常用交换两个元素值的方法

              1.通过第三方变量

              int n=3,m=8;

              int temp = n;

              n = m;

              m = temp;

 

              2.不用第三方变量

              n = n + m;

              m = n – m;

              n = n – m;

 

              3.异或^

              n = n ^ m;

              m = n ^ m;

              n = n ^ m;

 

7,程序流程控制语句

程序流程控制语句有三种结构,分别是:判断结构、选择结构和循环结构

1.     if语句

格式一:

if(条件表达式){执行语句;}

格式二:

if(条件表达式){

执行语句;

}else{

  执行语句;

}

格式三:

if(条件表达式){

  执行语句;

}else if(条件表达式){

  执行语句;

}

else{

  执行语句;

}

如果if语句中只有一个执行语句,那么那个大括号可以省略不写

2.     switch语句

格式:

switch(表达式){

  case 取值1:

  执行语句;

break;

case 取值2:

  执行语句;

break;

default :

执行语句;

break;

}

switch语句特点:

1)     switch语句选择的类型有一下几种:byte,short,int,char,而JDK1.7新特性中加入了String类型的数据;

2)     case之间与default没有顺序,先执行第一个case,没有匹配的case则执行default。

3)     结束switch语句有两种情况:遇到break和执行到switch语句结尾。

4)     如果匹配的case或者default没有对应的break,那么程序会继续向下执行,运行可以执行的语句,直到遇到break或者switch结尾结束

注意:由于最后一个default钟的break到了语句最后,因此可以省略break不写。

       if 和switch语句很想,具体什么场景下,应用哪个语句呢?

              如果判断的具体数值不多,而且符合byte,short,int,char和String这几种类型,那么建议使用switch语句;虽然两种语句都能使用,但switch效率更高。其他情况:对于区间判断,对结果为boolean类型的判断,使用if,因为if的使用范围更广。

       3.while语句

       格式一:

       while(条件表达式){

              循环体(执行语句);

}

特点:先判断条件,只有条件满足才会执行作用域里的循环体;

格式二:

do {

       执行语句;

}

while(条件表达式);

特点:无论条件表达式是否成立,作用域中的执行语句至少执行一次,然后再来判断条件表达式是否成立,条件满足,在继续执行循环体;

注意:do while语句的while后面需要加分号,而while后加分号后则不会执行循环体

4.for语句

for(初始化表达式1; 循环条件表达式2; 循环条件表达式4){

       执行语句3;

}

特点:

1)      for里面的表达式运行的顺序,初始化表达式1只读一次,判断循环条件2,为真就执行循环体3,然后在执行循环后的操作表达式4,接着继续判断循环条件,重复这个过程,直到条件不满足为止;

2)      while和for可以进行互换,区别在于:如果需要定义变量控制循环次数,建议使用for,因为for循环完毕,变量会在内存中释放。

 

4.break和continue

       1)break:作用于switch和循环语句,用于调出循环或者结束程序;当break语句单独存在时,下面不要定义其他语句,因为执行不到,编译会失败。当循环嵌套时,break值调出当前嵌套中的外部循环,只要给循环命名即可,这个名字称之为标号。

       2)continue:只作用于循环结构,继续循环用得;特点就是结束本次循环,继续下次循环,该语句单独存在时,下面不可以定义语句,因为执行不到。

 

颇具代表性的代码演示:

1.      输出一个99乘法表

class Print99 {

       public static voidmain(String[] args) {

              print99();

       }

       //定义一个99乘法表函数

       public static voidprint99(){

              for(int i=1;i<=9; i++){//外循环控制行

                     for(int j=1;j<=i;j++){//内循环控制列

                            System.out.print(j+ "*" + i + "=" + j*i + '\t');//\t:表示制表符,可以让输出的语句更美观

                     }

                     System.out.println();

              }

       }

}

 

2.      输出一个*号三角形

class Demo2 {

       public static voidmain(String[] args) {

              method();

       }

       //定义一个method方法

       public static voidmethod(){

              for(int i=0;i<=5; i++){//外循环控制行,内循环控制列

                     for(int j=i;j<=5; j++){

                            System.out.print("");

                     }

                     for(int k=0;k<=i; k++){

                            System.out.print("*");

                     }

                     System.out.println();

              }

       }

}

小结:

1.      外循环控制行数,内循环控制列数;

2.      输出图形的尖朝上,改变内循环条件,让条件随着外循环变化而变化;

3.      输出图形的尖朝下,改变内循环的初始值,让初始值随外循环的变化而变化

 

8,函数

1、函数

(1)   函数就是定义在类中具有特定功能的一段独立小程序,函数也成为方法

(2)   函数的格式

修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2, …){

  执行语句;

  return 返回值;

}

返回值类型:函数运行后结果的数据类型。

参数类型:是形式参数的数据类型。

主函数main:

1)      保证该类的独立运行;

2)      因为它是程序的入口

3)      因为它在被jvm所调用

形式参数:是一个变量,用于存储调用函数时传递给函数的实际参数。

实际参数:传递给形式参数的具体数值。

return:用于结束函数。

返回值:该函数运算后的结果,该结果会返回给调用者。

(3)   函数的特点:

1)      一般函数只有被调用后,才执行。

2)      void表示没有返回,在这个函数的结尾可以不写return,其实jvm会自动在结尾处加上一句隐式的return语句;

(4)   如何定义一个函数?两个明确

1)      明确该功能的结果,其实就是该功能的返回值类型

2)      明确该功能的参数,其实就是明确该功能中是否需要未知内容(形式参数)参与运算,明确位置内容的类型和个数

(5)   函数的重载(overload):重载只和参数列表有关

1)      函数名相同,参数列表不同

参数类型不同:int add(int i);  void add(idouble d)

参数个数不同:add(int a,int b);  add(int a,int b, int c);

参数顺序不同

2)      特点:与返回值类型无关,只看参数列表,且只存在于同一个类中

3)      好处:便于阅读,优化程序设计

 

2、数组

(1) 数组的定义

       概念:同一种类型数据的集合,其实数组就是一个容器。

       好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。

       一维数组:

       格式1:元素类型[] 数组名 = new 元素类型[元素个数或数组长度];

       示例:int[] x = newint[3];其中x为引用数据类型

       格式2:元素类型[] 数组名 = new 元素类型[]{元素,元素,…};

                   int[] arr = new int[]{1,2,3,4,5};

                     int[] arr ={1,2,3,4,5};

 

       二维数组:

       格式1:int[][] arr = newint[3][];

1)      定义了名称为arr的二维数组

2)      二维数组中有3个一维数组

3)      每一个一维数组中有2个元素

4)      一维数组的名称分别为arr[0],arr[1],ar[2]

5)      给第一个一维数组1角标赋值为78的写法是:int[0][1] = 78;

格式2:int[][] arr = newint[3][];         int[] arr[] = newint[3][];

1)      二维数组中有3个一维数组

2)      每个一维数组都是默认初始化值为null

3)      可以对这个三个一维数组分别初始化

格式3:int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};

       静态初始化:初始化时有程序员显示指定每个数组元素的初始值,由系统决定数组长度。

       动态初始化:初始化时程序员只指定数组长度,由系统为数组元素分配初始值。

(2) 内存结构

       Java程序在运行时,需要在内存中分配空间。为了提高程序效率,有对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。其中内存那种一共分配了五个区域,分别是:栈内存、堆内存、方法区、本地方法区和寄存器

       栈:存储的都是局部变量(函数中定义的变量,函数上的参数,语句中的变量);只要数据运算完成所在的区域结束,该数据就会弹栈,即消失。

       堆:用于存储数组和对象,也就是实体。什么事实体呢?就是用于封装多个数据的。

1)      每一个实体都有内存首地址值;

2)      堆内存中的变量都有默认初始化值,因为数据类型不同,值也不一样

3)      垃圾回收机制

简而言之就是:栈内存里的数据在被使用完成后会被自动释放;而堆内存中的数据则是通过垃圾回收器进行随机回收。

 

颇具代表性的代码演示:

1.      遍历数组

class ArrayDemo {
       public static voidmain(String[] args) {
              //定义一个数组
              int[] arr ={3,6,4,1,9,6,0};
              //调用遍历方法
              printArray(arr);
       }
       //定义一个遍历数组的方法
       public static voidprintArray(int[] arr){
              //为了让输出格式更美观,这里有必要输出一个[
              System.out.print("[");
              for(int j=0;j<arr.length; j++){
                     if(j !=arr.length -1)//只要j不是数组中最后一个元素
                            System.out.print(arr[j]+ ",");
                     else
                            System.out.println(arr[j]+ "]");
              }
       }
}

 

2.      获取最值

class ArrayDemo1 {
       public static voidmain(String[] args) {
              int[] arr ={5,1,6,4,2,8,9};
              //System.out.println("max="+getMax(arr));
              System.out.println("max="+getMax2(arr));
       }
       //定义一个获取最大值的方法
       public static intgetMax(int[] arr){
              //定义一个max变量,用于记录数组中第一个元素,即arr[0]
              int max = arr[0];
              for(int i=0;i<arr.length; i++){
                     if(arr[i]> max)
                            max =arr[i];//将较大的那个数赋值给max
              }
              return max;
       }
       //获取最值的第二种方法
       public static intgetMax2(int[] arr){
              //定义一个max变量,用于记录数组中的第一个角标
              int max = 0;
              for(int i=1;i<arr.length; i++){
                     if(arr[i]> arr[max])
                            max =i;
              }
              return arr[max];
       }
}

 

3.      常见排序方法

class ArrayDemo2 {
       public static voidmain(String[] args) {
              int[] arr = {3,5,1,6,4,7,2,8,9};
              //选择排序法
              //selectSort(arr);
              //冒泡排序法
              bubbleSort(arr);
              //排序
              sop(arr);
       }
       //冒泡排序法
       public static voidbubbleSort(int[] arr){
              for(int i=0;i<arr.length-1; i++){//为了提高比较效率,这里需要让其长度-1
                     for(int j=0;j<arr.length-1-i; j++){//-1:避免角标越界;-x:让每一次比较的元素逐渐减少
                            if(arr[j]> arr[j+1])
                                   swap(arr,j,j+1);
                     }
              }
       }
       //选择排序法
       public static voidselectSort(int[] arr){
              for(int i=0;i<arr.length-1; i++){//由于不需要比较到最后一个元素,因此这里可以将其长度-1,继而提高效率
                     for(intj=i+1; j<arr.length; j++){
                            if(arr[i]> arr[j]){
                                   swap(arr,i,j);
                            }
                     }
              }
       }
       //定义一个对数组进行排序的方法
       public static voidsop(int[] arr){
              System.out.print("[");
              for(int x=0;x<arr.length; x++){
                     if(x !=arr.length-1)
                            System.out.print(arr[x]+ ",");
                     else
                            System.out.print(arr[x]+ "]");
              }
              System.out.println();
       }
       //定义一个交换元素值的方法,通过定义第三方变量的方法
       public static voidswap(int[] arr,int i,int j){
              int temp = arr[i];
              arr[i] = arr[j];
              arr[j] = temp;
       }
}

小结:

1.      选择排序:头元素与后面的元素一一比较,也就是内循环结束一次,最值出现在头角标位置上;接着头元素自增,循环与后面的元素进行比较,即可得到排序结果。

2.      冒泡排序:相邻的两个元素进行比较,如果符合条件就换位。

大圈套小圈,尖朝上,改变内循环条件;尖朝下,改变内循环初始值。

 

4.      数组的查找操作:折半查找

class ArrayDemo3 {
       public static void main(String[] args) {
              int[] arr = {3,4,5,6,7,8,9};
              //System.out.println(getIndex(arr,8));
              //System.out.println(halfSearch(arr,8));
              System.out.println(halfSearch2(arr,8));
       }
       //获取插入点角标
       public static int getIndex(int[] arr,int key){
              for(int i=0; i<arr.length; i++){
                     if(key == arr[i])
                            return i;
              }
              return -1;
       }
       //折半查找
       public static int halfSearch(int[] arr,int key){
              int min=0;//定义其数组索引的最小值
              int max = arr.length-1;//定义索引的最大值
              int mid = (min + max) >>> 1;//定义该数组的中间值,这是效率最高的一种除2方式,直接位移
              while(key != arr[mid]){
                     if(key > arr[mid])
                            min = mid + 1;
                     else if(key < arr[mid])
                            max= mid - 1;
                     if(min > max)
                            return -1;
                     mid = (min + max) >>> 1;//如果条件不成立,让其中间值再除了2一次
              }
              return mid;
       }
       //折半查找的第二种方式
       public static int halfSearch2(int[] arr,int key){
              int min=0;
              int max= arr.length-1;
              int mid = (min + max) >>> 1;
              //如果最小角标一直小于或等于最大角标,则进行判断,否则该数组中没有这个数
              while(min <= max){
                     if(key > arr[mid])
                            min = mid + 1;
                     else if(key< arr[mid])
                            max = mid -1;
                     else
                            return mid;
                     mid = (min + max) >>> 1;
                    
              }
              return -1;
       }
}

5.      进制转换

class ArrayDemo4 {
       public static voidmain(String[] args) {
              toHex(60);
       }
       //十进制-->十六进制
       public static voidtoHex(int num){
       //定义一个容器,用于存储数据
              StringBuffer sb =new StringBuffer();
              for(int x=0; x<8;x++){//由于取的是最低4位,而在十六进制中有4组八位,因此这里的x<8
                     int temp =num & 15;//之所以num&15,是为了得到其最低4位
                     if(temp>9)
                            //System.out.println((char)(temp-10+'A'));
                            sb.append((char)(temp-10+'A'));
                     else
                            //System.out.println(temp);
                            sb.append(temp);
                     num = num>>> 4;//无符号往右移4位
              }
              System.out.println(sb.reverse());
       }
}

class ArrayDemo5 {
       public static voidmain(String[] args) {
              //toBin(6);
              //toBa(60);
              toHex(60);
       }
       //十进制-->二进制
       public static voidtoBin(int num){
              trans(num,1,1);
       }
       //十进制-->八进制
       public static void toBa(intnum){
              trans(num,7,3);
       }
       //十进制-->十六进制
       public static voidtoHex(int num){
              trans(num,15,4);
       }
       public static voidtrans(int num,int base,int offset){
              if(num ==0){
                     System.out.println(0);
                     return ;
              }
              char[] chs ={'0','1','2','3',
                                          '4','5','6','7',
                                          '8','9','A','B',
                                          'C','D','E','F'};
              char[] arr = newchar[32];//由于int的最大范围为32位,因此这里就定义最大区间
              int pos =arr.length;
              while(num!=0){
                     int temp =num & base;
                     arr[--pos] =chs[temp];
                     num = num>>> offset;
              }
              //直接将pos的值赋值给x
              for(int x = pos;x<arr.length; x++){
                     System.out.print(arr[x]);
              }
       }
}

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值