【黑马程序员】第二章:Java编程基础

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
   每一种编程语言都有自己的一套语法规范,Java语言也不例外,同样需要遵循一定的语法规范,如代码的书写、标识符的定义、关键字的应用等。因此要学好Java语言,首先需要熟悉它的基本语法。

一、注释


   在编写程序时,为了使代码易于阅读,通常会在实现代码功能的同时为代价加一些注释。注释是对程序的某些功能或者某行代码的解释说明,它只在Java源代码文件中有效,在编译程序时会忽略这些注释信息,不会将其编译到 class 字节码文件中去。

   Java 中的注释有三种类型,具体如下:

1、单行注释

   单行注释通常用于对程序的某一行代码进行解释,用符号“//”表示,“//”后面的为被注释的内容,示例如下:

int c = 10; //定义一个整型变量

2、多行注释

   多行注释顾名思义就是在注释中的内容可以为多行。它以符号“/*”开头,以符号“*/”结尾,示例如下:

/*
   int c = 10;
   int x = 5;
*/

3、文档注释

   文档注释是以“/**”为开头,并在注释内容的末尾以“*/”结束。文档注释是对一段代码概括的解释说明,可以使用 javadoc 命令将文档注释提取出来生成帮助文档。

注意:在 Java 中有些注释可以嵌套使用,有些则不可以,下面列出两种情况:

  • 多行注释 “/*...*/” 可以嵌套单行注释 “//” ;
  • 多行注释 “/*...*/” 不可以嵌套多行注释 “/*...*/” ;

二、关键字


   关键字就是编程语言中事先定义好并赋予了特殊含义的单词,也称作保留字。和其他语言一样,Java 中保留了许多关键字,例如 class、public 等,下面列举的是 Java 中所有的关键字。

   使用 Java 关键字时,有几个值得 注意的地方:
  • 所有的关键字都是小写;
  • 程序中的标识符不能用关键字命名;

三、标识符


   在编程过程中,经常需要在程序中定义一些符号来定义一些名称,如包名、类名、方法名、参数名、变量名等,这些符号被称为标示符。标识符可以由任意顺序的大小写字母、数字、下划线(_)、美元符号($)组成,但标识符不能以数字开头不能是 Java 中的关键字

   在 Java 程序中定义的标识符必须严格遵守上面列出的规范,否则程序在编译时报错。除了上面列出的规范,为了增强代码阅读性,建议初学者在定义标识符时以英国遵守以下规则:

  • 包名所有字母一律小写,例如 cn.itcast.test;
  • 类名和接口名每个单词的首字母大写,例如 ArrayList、Iterator;
  • 常量名所有字母都大写,单词之间用下划线连接,例如 DAY_OF_MONTH;
  • 变量名和方法名的第一个单词首字母小写,从第二个单词开始每个单词的首字母大写,例如 getLineNuber;
  • 在程序中应尽量使用有意义的英文单词来定义标识符,使得程序便于阅读,例如 userName 表示用户名,passWord 表示密码。

四、常量


   常量就是在程序中不变的值,是不能改变的数据。例如 数字 1、字符 'a' 等。在 Java 中,常量包括整数常量、浮点常量、字符常量、字符串常量、布尔常量、null 常量。

1、整数常量

   整型常量就是整数类型的数据,有二进制、八进制、十进制、十六进制 4 中表示形式,表示形式如下:

  • 二进制:由数字 0 和数字 1 组成的数字序列;
  • 八进制:以 0 开头并且其后由 0~7 范围内(包括 0 和 7)的整数组成的数字序列;
  • 十进制:由数字 0~9 范围内(包括 0 和 9)的证书组成的数字序列;
  • 十六进制:以 0x 或者 0X 开头并且其后由 0~9、A~F(包括 0 和 9、A 和 F)组成的数字序列。

   十进制转二进制:就是一个除以 2 取余数的过程。把要转换的数,除以 2,得到商和余数,将商继续除以 2,直到商为 0。最后将所有余数倒序排列,得到的数就是转换结果。

   二进制转十进制:从右到左用二进制位上的每个数乘以 2 的相应次方。

   二进制转八进制:首先需要将二进制数从右到左每三位分成一段,然后将二进制的三位数转为八进制的一位数。

   二进制转十六进制:与八进制类似,不同的是要将二进制数没四位分成一段。

2、浮点常量

   浮点常量就是在数学中用到的小数,分为 float 但进度浮点数 和 double 双精度浮点数两种类型。其中,单精度浮点数后面以 F 或 f 结尾,而双精度浮点数则以 D 或 d 结尾,在结尾处不加任何的后缀默认为 double 双精度浮点数。

3、字符常量

   字符常量用于表示一个字符,一个字符常量要用一对英文板件格式的单引号 ' ' 引起来,它可以是英文字母、数字、标点符号及由转移序列来表示的特殊字符。

4、字符串常量

   字符串常量用于表示一串连续的字符,一个字符串常量要用一对英文半角格式的双引号 " " 引起来。

   一个字符串可以包含一个字符或多个字符,也可以不包含任何字符,即长度为零。

5、布尔常量

   布尔常量即布尔型的两个值 true 和 false,该常量用于区分一个事物的真与假。

6、null 常量

   null 常量只有一个值 null,表示对象的引用为空。

内存中的一个存储区域,该区域有自己的名称和类型,该区域的数据可以在同一类型范围内变化。

五、变量


1、变量的定义

   在程序运行期间,随时可能产生一些临时数据,应用程序会将这些数据保存在一些内存单元中,每个内存单元都用一个标识符来标识。这些内存单元被称为变量,定义的标识符就是变量名,内存单元中存储的数据就是变量的值。

   接下来,通过具体的代码示例来学习变量的定义:

int x = 0,y;
y = x + 3;
   上面的代码中,定义了两个变量 x 和 y ,在定义变量的同时为变量 x 分配了一个初始值 0,而变量 y 没有分配初始值。第二行代码是为变量赋值,程序首先取出变量 x 的值,与 3 相加后,将结果赋值给变量 y 。

2、变量的数据类型

   Java是一门强类型的语言,它对变量的数据类型有严格的限定,在定义变量时必须声明变量的类型,在为变量赋值时必须赋予和变量同一类型的值,否则程序会报错。

  • 特点:内存中的一块存储区域,有自己的名称和类型,该区域的数据在一定范围内变化;
  • 作用:用来不断存放同一类型的数据,并重复使用;
  • 格式:数据类型   变量名   =   初始化值;

   在 Java 中的数据类型分为两种,即 基本数据类型 引用数据类型 。其中 8 种基本数据类型是 java 语言内嵌的,在任何操作系统中都有相同的大小和属性,而引用数据类型是由开发人员自己定义的变量类型。

   2.1、整数类型常量

      整数类型变量就是来存储整数数值,分为 4 种不同的类型:字节型(byte)、短整型(short)、整型(int)、长整型(long),存储空间及取值范围如下:


类型名占用空间取值范围
byte8 位(1个字节)-2^7 ~ 2^7-1
short16 位(2个字节)-2^15 ~ 2^15-1
int32 位(4个字节)-2^31 ~ 2^31-1
long64 位(8个字节)-2^63 ~ 2^63-1

   2.2、浮点数类型变量

      浮点数类型变量是用来存储小数数值的,分为两种:单精度浮点数(float)和双精度浮点数(double)。double 型表示的浮点数比 float 型更精确,两种浮点数所占空间及取值范围如下:

类型名占用空间取值范围
float32 位(4个字节)1.4E-45 ~ 3.4E+38,-1.4E-45 ~ -3.4E+38
double64 位(8个字节)4.9E-324 ~ 1.7E+308,-4.9E-324 ~ -1.7E+308

      注意:在 Java 中,一个小数会被默认为 double 类型的值,因此在为一个 float 类型的变量赋值时需要注意一点,所赋值的后面一定要加上字符 F(或小写 f),而为 double 类型的变量赋值时,可以在所赋值的后面加上字符 D(或小写 d),也可以不加。

   2.3、字符类型变量

      字符类型变量用于存储一个单一字符,在 Java 中庸 char 表示。Java 中每个 char 类型的字符变量都会占用 2 个字节,在给 char 类型的变量赋值时,需要用一对英文半角格式的单引号括起来,也可以将 char 类型的变量赋值为 0~65535 范围内的证书,计算机会自动将这些整数转化为对应的字符。

   2.4、布尔类型变量

      布尔型变量用来存储布尔值,在 Java 中庸 boolean 表示,该类型的变量只有两个值,即 true 和 false。

   2.5、变量的类型转换

      在程序中,当把一个数据类型的值赋给另一个数据类型变量时,需要进行数据类型转化,根据转换方式的不同分为两种:自动类型提升,强制类型转换。

      自动类型转换也称为隐式类型转换,指的是两中数据类型在转换的过程中不需要显式地进行声明,需要实现自动类型转换,必须同时满足两个条件,第一两中数据类型彼此兼容,第二是目标类型的取值范围大于元数据类型的取值范围。

  • 整数类型之间可以实现转换,例如 byte 类型数据赋值给 short、int、long ,short、char 类型可以赋值给 int、long ,int可以赋值给 long ;
  • 整数类型转化为 float 类型,例如 byte、char、short、int 类型赋值给 float ;
  • 其他类型转换为 double 类型,例如 byte、char、short、int、long、float 类型可以赋值给 double;

byte b = 3;
int  c;
int  c = b+2;//b自动提升为int类型进行运算。 

      强制类型转换也叫显式类型转换,指的是两种类型之间的转换需要进行显示地声明。当两种类型彼此不兼容,或者目标类型取值范围小于原类型时,自动类型转换无法进行,这时就需要进行强制类型转化。

byte  b = 3;
b = b+4;//报错
b = (byte)(b+4);//将b+4运算的结果转成byte类型,再赋值给b。

六、运算符


   在程序中经常出现一些特殊符号,如  +  -  *  =  > 等,这些特殊符号称作运算符。运算符用于对数据进行算术运算、赋值和比较等操作。在 Java 中,运算符可分为算数运算符、赋值运算符、比较运算符、逻辑运算符和位运算。

1、算术运算符

   在数学运算中最常见的就是加减乘除,被称为四则运算。算术运算符及其用法如下:

   算术运算符看似简单,但在实际使用时有很多需要注意的问题:

  • 如果对负数取模,可以把负数符号忽略;
  • 在进行除法运算时,当除数和被除数都为整数时,得到的结果也是一个整数,如果有小数参与,得到的结果会是一个小数;
  • 加号 + 除了可以字符串相加之外,还可以把非字符串转成字符串;
  • 进行自增 ++ 或 自减 - - 的运算时,如果运算符 ++ 或 - - 放在操作数的前面则是先进行自增或自减,再进行其他运算。反之,如果运算符放在操作数后面则先进行其他运算再进行自增或自减运算。

2、赋值运算符

   赋值运算符的作用就是将常量、变量或表达式的值赋给某一个变量。符号:=,+=,-=,*=,/=,%=

   在赋值运算符的使用中,需要注意一下几个问题:

  • 在 Java 中可以通过一条赋值语句对多个变量进行赋值,例如 int  x,y,z; x = y = z = 5 这样相当于为 3 个变量同时赋值,但是 int  x=y=z=5 这样写是错误的;
  • 除了 = ,其他都是特殊的赋值运算,以 += 为例,x += 3 就相当于 x = x + 3,首先进行加法运算,再将运算结果赋值给变量 x 。

3、比较运算符

   比较运算符用于对两个数值或变量进行比较,其结果是一个布尔值,即 true 或 false。


   比较运算符在使用中需要注意一些问题:

  • 不能将比较运算符 == 误写成赋值运算符 = ;

4、逻辑运算符

   逻辑运算符用于对布尔型数据进行操作,其结果仍是一个布尔型。

   在使用逻辑运算符的过程中,需要注意以下几个细节:

  • 逻辑运算符可以针对结果为布尔值的表达式进行运算;
  • 运算符 & 和 && 都表示与操作,当且仅当运算符两边的操作数都为 true 时,其结果才为 true ,否则结果为 false;
  •     > 在使用 & 进行运算时,不论左边为 true 或者 false ,右边的表达式都会进行运算;
  •     > 如果使用 && 进行运算,当左边为 false 时,右边的表达式不会进行运算,因此 && 被称为短路与;
  • 运算符 | 和 || 都表示或操作,当运算符两边的操作数任何一边的值为 true时,其结果为 true,两边同为 false 时,其结果才为 false;
  •     > 同与操作类似,|| 表示短路或,当运算符 || 的左边为 true时,右边的表达式不会进行运算;
  • 运算符 ^ 表示异或操作,当运算符两边的布尔值相同时(都为 true 或都为 false),其结果为 false,当两边布尔值不同时其结果为 true。

5、 位运算符

   位运算符是针对二进制数的每一位进行运算的符号,它是专门针对数字 0 和数字 1 进行操作的。

  • 与运算符 & 是将参与运算的两个二进制数进行与运算,如果两个二进制位都为 1 ,则该位的运算结果为 1,否则为 0;
  • 位运算符 | 是将参与运算的两个二进制数进行 “或” 运算,如果二进制位有一个值为 1,则该位的运行结果为 1,否则为0;
  • 位运算符 ~ 只针对一个操作数进行操作,如果二进制为 0,则取反值 1,如果是 1,则取反值 0;
  • 位运算符 ^ 是将参与运算的两个二进制数进行 “异或” 运算,如果二进制位相同,则值为 0,否则为 1;
  • 位运算符 << 就是将操作数所有二进制位向左移动一位,右边的空位补 0,左边移走的部分舍去;
  • 位运算符 >> 就是讲操作数所有二进制位向右移一位,左边的空位根据原数的符号位补 0 或者 1(原来是负数就补 1,是正数就补 0);
  • 位运算符 >>> 就是讲操作数所有二进制位想右移动一位,左边的空位补 0 (不考虑原数正负);

6、三元运算符

   (条件表达式)?表达式1:表达式2;
  • 如果条件为 true,运算后的结果是表达式 1;
  • 如果条件时 false,运算后的结果是表达式 2;

七、语句


1、判断结构

   if 条件语句分为三种语法格式,每一种格都有其自身的特点,下面分别进行介绍。

      

  

  
  • 每一种格式都是但条语句;
  • 第二种格式和三元运算符的区别:三元运算符运算完要有值出现,好处是可以写在其他表达式中;
  • 条件表达式无论写成什么样子,只看最终得奖结构是否为 true 或 false;

2、选择结构

   switch 语句也是一种常见的选择语句,和 if 条件语句不同,它只针对某个表达式的值做出判断,从而决定程序执行那一段代码。

     

  • 在 JDK1.6 之前,switch 语句选择的类型只有四种:byte、short、int、char,在 JDK1.7 之后加入的新特性可以支持 String;
  • case 之间与 default 没有顺序,先执行第一个 case ,没有匹配的 case 执行default;
  • 结束 switch 语句的两种情况:遇到 break,执行到 switch 语句结束;
  • 如果匹配的 case 或者 default 没有对应的 break,那么程序会继续执行下去,运行可执行的语句,直到遇到 break 或者 switch 结尾结束。

3、循环结构

      

     

     

  • do while 特点是条件无论是否满足,循环体至少被执行一次;
  • for 循环中条件表达式的执行顺序,初始化表达式只执行一次,判断循环条件为真就执行循环体,然后再执行循环后的操作表达式,接着继续判断循环条件,中复这个过程,知道条件不满足为止;
  • while 和 for 可以互换,区别在于 for 为了循环而定义的变量在 for 循环结束就会在内存中释放,而 while 循环使用的变量再循环结束后还可以再使用;
  • 最简单的无限循环格式:while(true)、for(;;),无限循环存在的原因是并不知道循环多少次,而是根据某些条件来控制循环。

4、其他流程控制语句

   在 switch 选择结构和循环结构中都可以使用 break 语句。当出现在选择结构中,作用是终止某个 case 并跳出 switch 语句;当出现在循环语句中,作用是跳出循环结构,执行后面的代码。

   continue 语句用在循环语句中,它的作用是终止本次循环,执行下一次循环。

七、函数


1、什么是函数?

   定义在类中的具有特定功能的一段独立小程序,函数也称为方法。

2、函数的语法格式

     

   对于上面的语法格式具体说明如下:

  • 修饰符:方法的修饰符比较多,有队访问权限进行限定的,有静态修饰符 static,还有最终修饰符 final 等;
  • 返回值类型:用于限定方法返回值的数据类型;
  • 参数类型:用于限定调用方法时传入参数的数据类型;
  • 参数名:是一个变量,用于接收调用方法时传入的数据;
  • return 关键字:用于结束方法以及返回方法指定类型的值;
  • 返回值:被 return 语句返回的值,该值会返回给调用者。
   需要特别注意的是,如果方法不需要接收任何参数,则参数列表为空,即 () 内不写任何内容。方法的返回值必须为方法声明的返回值类型,如果方法没有返回值,返回值类型要声明为 void,此时方法中的 ruturn 语句可以省略。

3、函数的特点

  • 定义函数可以将功能进行封装;
  • 便于对功能进行复用;
  • 函数只有被调用才会被执行;
  • 函数的出现提高了代码的复用性;

4、函数的应用

   两个明确:
  • 明确要定义的功能最后的结果是什么?
  • 明确定义该功能过程中,是否需要未知内容参与运算?

5、函数的重载

   Java 允许在一个程序中定义多个名称相同的方法,但是参数的类型或个数必须不同,这就是方法的重载。
  • 特点:重载与返回值类型无关,只看参数列表;
  • 好处:便于阅读,优化程序设计;

八、数组


1、数组的定义

   数组是指一组数据的集合,数组中的每个数据被称作元素。在数组中可以存放任意类型的元素,但同一个数组里存放的元素必须一致。数组可以分为一位数组和二维数组。

   数组的书写格式:
  • 格式 1:元素类型 [ ]   数组名   =   new   元素类型 [  元素个数或数组长度  ] ;
  • 格式 2:元素类型 [ ]   数组名   =   new   元素类型 [  ]    { 元素,元素,元素 ... } ;

2、数组内存结构

  
   Java程序在运行时,需要在内存中分配空间。为了提高运算效率,有对空间进行了不同的划分,因为每一块区域都有特定的处理数据方式和内存管理方式。

   栈内存:

  • 用于存储局部变量,当数据使用完,所占内存会自动释放;
   堆内存:
  • 数据和对象,通过 new 创建的实例都放在堆内存中;
  • 每一个实体都有内存地址值;
  • 实体中变量都有默认初始化值;
  • 实体不再被使用,会在不确定时间内被垃圾回收器回收;

3、数组操作常见问题

  • 数组角标越界异常(ArrayIndexOutOfBoundsException):访问到了数组中不存在的角标时发生;
  • 空指针异常(NullPointerException):引用没有指向实体,却在操作实体中的元素;

4、数组常见操作

  • 获取最值(最大值、最小值)

//获取最大值
int[] arr = {27,31,15,22,9,16};
int max=0;
for(int x=0;x<arr.length;x++){
   if(arr[max]<arr[x]){
      max = x;
   }
}
return arr[max];

//获取最小值
int min = 0;
for(int x=0;x<arr.length;x++){
   if(arr[min]>arr[x]){
      min = x;
   }
}
return arr[min];

  • 排序(选择排序、冒泡排序)

//选择排序
int temp;
for(int x=0;x<arr.length;x++){
   for(int y=x+1;y<arr.length;y++){
      if(arr[x]>arr[y]){
         temp = arr[x];
         arr[x] = arr[y];
         arr[y] = temp;
      }
   }
}

//冒泡排序
for(int x=0;x<arr.length-1;x++){
   for(int y=1;y<arr.length-x-1;y++){      
      if(arr[y]>arr[y+1]){
         temp = arr[y];
         arr[y] = arr[y+1];
         arr[y+1] = temp;
      }
   }
}

  • 折半查找(二分查找)
int min=0,max=arr.length-1;
int num;
while(max>min){
   int mid = (max+min)/2;
   if(num==arr[mid])
      return mid;
   else if(num>arr[mid])
      min=mid+1;
   else if(num<arr[mid])
      max=mid-1;
   else
      return -1;
}

5、二维数组

   格式 1:int [ ][ ]  arr  =  new  int [3][2] ;
  • 定义名称为 arr 的二维数组;
  • 二维数组有 3 个一维数组;
  • 每个一维数组有 2 个元素;
  • 一维数组的名称分别为 arr[0]、arr[1]、arr[2];
  • 给第一个一维数组1角标位赋值为 78 的写法是:arr[0][1]  =  78;
   格式 2:int  [ ][ ]  arr  =  new  int[3][ ] ;
  • 二维数组中有 3 个一维数组;
  • 每个一位数组的默认初始化值为 null;
  • 可以对三个一维数组分别初始化:

                 >  arr[0]  =  new  int[3] ;

                 >  arr[1]  =  new  int[5] ;

                 >  arr[2]  =  new  int[7] ;

   格式 3:int [][]  arr  =  {{2,4,1},{3,15},{1,9,17,21}} ;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值